PHP sınıf yöntemi baskı adında ...

6 Cevap

Ben "baskı" adında bir yöntem ile Codeigniter için bir denetleyicisi yazıyorum. Ben "http://www.mysite.com/mycontroller/print" adresindeki sayfaya erişmek mümkün olmak istiyorum, çünkü isim, önemlidir.

Sözdizimi hatası var çünkü Ancak, ben bunu yapamam:

Parse error: syntax error, unexpected T_PRINT, expecting T_STRING

PHP yorumlayıcı derken olduğunu "düşünüyorum" yapmak için herhangi özel bir sözdizimi var mı:

class MyClass extends Controller {
    function print() {
        // print method here
    }
}

... Ben o olmasını bekliyordum ki "baskı" ve T_PRINT bir T_STRING adıyla bir yöntem bahsediyorum ki?

6 Cevap

Baskı php bir language construct çünkü bu iş olmaz. Ben bu yüzden üzerinde bir fonksiyonu gibi görünüyor biliyorum, ama (örneğin) function, while, include gibi aynı şekilde tedavi edilir, ve.

Listesini görmek Reserved Keywords in PHP. Sabit, sınıf, işlev veya yöntem adları gibi bunlardan herhangi kullanamazsınız.

Sana PHP 5.3 __call sihirli yöntemi kullanarak some saklıdır kelimeleri adlandırma kısıtlama etrafında alabilirsiniz bulundu.

public function __call( $name, $arguments )
{
  $fn = 'do_' . $name;
  if ( method_exists( $this, $fn ) )
  {
    return call_user_func_array( array( $this, fn), $arguments );
  }
  else
  {
    throw new Exception( 'Method "' . $name . '" does not exist.' );
  }
}

protected function do_print( /* $arg1, $arg2,...*/ )
{
  //whatever
}

I not bu mutlaka iyi bir fikir olduğunu söyleyerek değilim, ama sen $foo->print() gibi bir çağrı yapmak için izin vermez.

Ben gerçekten hiçbir sebep why ayrılmış kelimeler sınıflar için yöntem adları olarak kullanılamaz bakın. Ben çözülmesi gerekir belirsiz bir dava ile gelmek mümkün olmamıştır.

print gibi bir echo ya da isset language constructs ve fonksiyon ya classnames olarak kullanılamaz bulunmaktadır.

Örneğin baskı işlevi 'basılı ()' olarak adlandırılan varsa, aynı şeyi gerçekleştirmek için bir mod-rewrite kuralını kullanabilirsiniz. yani:

RewriteRule ^ / mycontroller / baskı / mycontroller / basılı [L]

Herkes işaret ettiği gibi, işlev adları gibi dil yapıları kullanamazsınız.

Eğer yöntem adı olarak url baskı ama güvenli bir şey kullanabilirsiniz böylece çözüm URI Routing muhtemelen.