2010-10-22 6 views
3

Эй, гуру php. Я сталкиваюсь с некоторыми странными проблемами с классом, которые явно связаны с некоторой причудой в php. Может кто-нибудь сказать мне, что из-оф-неординарных ситуациях может дать следующее сообщение об ошибке ...PHP5 класс причуды

Фатальная ошибка: Не удается получить доступ к себя :: когда ни один класс не сфера активен в MyClass.php в строке 5

Теперь, очевидно, если бы я использовал self :: вне класса, я бы получил ошибки ... но я не уверен. Вот упрощенная версия ситуации ...

//file1 
class MyClass{ 
    public static function search($args=array()){ 
     $results = MyDbObject::getQueryResults("some query"); 
     $ordered_results = self::stack($results); //Error occurs here 

     return $ordered_results; 
    } 
    public static function stack($args){ 
     //Sort the results 
     return $ordered_results; 
    } 
} 

//file 2 
include_once("MyClass.php"); 
$args = array('search_term'=>"Jimmy Hoffa"); 
$results = MyClass::search($args); 

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

MyClass::search($args) //does not give the error (usually) 
call_user_func("MyClass::search"); // this gives the error! 

Любые другие ситуации?

+0

Другая ситуация, когда проблема возникает, когда у вас есть функция внутри функции класса. Но я не понимаю, почему это должно быть проблемой, потому что внутренняя функция все еще должна быть в рамках класса, не так ли? Очевидно, что внутренняя функция не будет доступна вне закрывающей функции. Однако кажется, что вы должны использовать self внутри внутренней функции. – Brooks

+0

Что произойдет, если вы измените «self ::» на «MyClass ::»? – thetaiko

+0

, тогда он работает, но код становится значительно менее многоразовым. – Brooks

ответ

1

Если я правильно понял, вы ищете Late Static Binding. Для этой функции требуется, по крайней мере, PHP версии 5.3.

+0

Проблема в том, что, похоже, существуют ситуации, когда вы можете вызвать метод класса без загрузки области класса. Это не проблема с наследованием, которое может быть разрешено поздним статическим привязкой. – Brooks

1

Вы не передаёте какие-либо параметры, но ваш метод их ищет. Попробуйте

call_user_func("MyClass::search", $args); 

Это работает в PHP 5.3.1, но call_user_func("MyClass::search"); не

+0

Это правильно, я просто попробовал его в PHP 5.3.x, и он отлично работает, вам просто нужны аргументы, с <5.2.x он даст вам эту ошибку. Код Я использовал класс MyClass { public static function search ($ args) { $ results = "some query"; $ ordered_results = self :: stack ($ results); return $ ordered_results; } public static function stack ($ args) { // Сортировка результатов return 'query some'; } } $ args = array ('search_term' => "Jimmy Hoffa"); print call_user_func («MyClass :: search», $ args); –

+0

Вы полностью упустили точку вопроса. Прочитайте вопрос не в коде. Я не пытаюсь заставить что-то работать, я пытаюсь определить набор ограничений. – Brooks

0

Попробуйте это:

call_user_func(array('MyClass', 'search')); 

Смотрите также пример # 4 на http://php.net/call_user_func

+0

Вы можете передать статические методы объекта в качестве первого параметра –

+0

Но разве это не требует PHP 5.3.0? –

+0

мы уже обсуждали это в начальном обсуждении. – Brooks

0

Ваш код кажется нормально , Если с этим что-то не так, я должен упустить проблему. Похоже, что ваш призыв к себе :: полностью входит в сферу действия класса! И статический охват, в частности, для чего: self ::.

С третьего издание PHP объектов Шаблоны и практика (огромная книга):

Чтобы получить доступ к статический метод или свойство из того же класса (а не от ребенка), я хотел бы использовать ключевое слово self. self - классы, для которых переменная $ this представляет собой объект с переменными. Так из-за пределов класс StaticExample, я получить доступ к свойству $ Anum используя его класс имя:

StaticExample::$aNum; 

Изнутри класса StaticExample я могу использовать само ключевое слово:

class StaticExample {` 
    static public $aNum = 0; 

    static public function sayHello() { 
     self::$aNum++; 
     print "hello (".self::$aNum.")\n"; 
    } 
} 

Итак, Я не знаю, почему этот код терпел неудачу. Возможно, ошибка PHP? Я наткнулся на эту ошибку, когда на самом деле пытается использовать себя :: вне сферы действия class-- моей ошибки выглядит следующим образом:

public static function get_names() { 
    $machine_names = self::get_machine_names(); 

    return array_map(function ($machine_name) { 
     $service_settings = self::get_settings_by_machine_name($machine_name); 
     return $service_settings . $machine_name; 
     }, 
     $machine_names 
    ); 
} 

Таким образом, я получаю сообщение об ошибке, потому что я использую сам :: в пределах закрытия. Чтобы исправить ошибку, я мог сделать этот вызов self :: get_settings_by_machine_name() перед закрытием и передать результаты в область закрытия с помощью use.

Не уверен, что происходило в вашем коде.