2015-08-20 7 views
3

Я нашел какое-то странное поведение PHP, мне интересно, может ли кто-нибудь объяснить мне, почему некоторые части этого кода работают, а другие нет.Имена динамических классов PHP со статическими функциями

PHP может создавать новые классы динамически, когда имена классов хранятся в переменных. И он отлично работает, так как я использую современную версию PHP (5.5.28). Но я обнаружил странное поведение, которое я действительно не понимаю.

Проблема возникает, когда имя класса хранится в свойстве какого-либо объекта. В этом случае статические функции нельзя вызывать в динамическом классе: $this->dynClass::SomeFunction() сбой и ($this->dynClass)::SomeFunction() также не работает. Однако $instance = new $this->dynClass работает. Поэтому, если мне нужно вызвать статический метод на $this->dynClass, мне нужно создать локальную переменную, хранящую ту же строку: $tmp = $this->dynClass. И тогда я могу позвонить $tmp::SomeFunction()

Я действительно не понимаю этого. Может ли это быть ошибкой? Пожалуйста, объясните мне кого-нибудь.

Вот мой пример кода:

<?php 
    class MyClass { 
     static function SomeFunction($name){ 
      echo "Hello $name\n"; 
     } 
    } 

    MyClass::SomeFunction("World"); //Works fine as it should, prints Hello World 

    $firstInstance = new MyClass; 
    $firstInstance::SomeFunction("First"); //prints hello first, no problem 

    //here comes the interesting part 

    $dynClass = "MyClass"; 

    $dynClass::SomeFunction("Dynamic"); //Yeah, it works as well 

    $secondInstance = new $dynClass; 
    $secondInstance::SomeFunction("Second"); //Hello Second. Fine. 

    //And here comes the part that I don't understand 

    class OtherClass { 
     private $dynClass = "MyClass"; 

     public function test(){ 

      $thirdInstance = new $this->dynClass; //WORKS! 
      $thirdInstance::SomeFunction('Third'); //Hello Third 

      //BUT 

      $this->dynClass::SomeFunction("This"); //PHP Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM) 

      //OK, but then this one should work: 

      ($this->dynClass)::SomeFunction("This"); //same error. WHY?? 

      //The only solution is creating a local variable: 
      $tmp = $this->dynClass; 
      $tmp::SomeFunction("Local"); //Hello Local 

     } 
    } 

    $otherInstance = new OtherClass; 
    $otherInstance->test(); 

?> 
+2

Я не понимаю внутренности php, поэтому я не могу сказать вам, почему именно, но похоже, что он исправлен в php 7. Живой пример с использованием текущей php7 beta: http://codepad.viper-7.com/CfJtD3 rfc для исправления: https://wiki.php.net/rfc/uniform_variable_syntax – Steve

ответ

1

Перед Uniform Variable Syntax, переменная разборе РНР была в основном большой кусок угловых случаев.

В частности, некоторые операции, такие как ::, где не поддерживаются выражения (...).

Две ошибки, с которыми вы столкнулись, являются примерами этого слабо определенного и непоследовательного синтаксического анализа переменных.

 Смежные вопросы

  • Нет связанных вопросов^_^