PHP, передающий имя класса, становится строкой при передаче функции - PullRequest
10 голосов
/ 04 января 2010

Вот что я хочу сделать:

public function all($model) {
  $query = 'SELECT ' . implode(', ', $model::$fields) ....;
}

Вызывается так:

$thing->all(Account);

Я получаю эту ошибку:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/mark/public_html/*/account.php on line 15

При проверке $model с var_dump получается строка.В первом примере, если я изменю $model на Account в строке запроса $, он будет работать нормально.

Как взять строку и превратить ее в класс?

Изменить: Обновленный пример и заголовок, чтобы отразить проблему не с self.

Решение: Поскольку я не использую PHP5.3, мне пришлось прибегнуть к использованию eval (), чтобы получить то, что я хотел,Спасибо всем!

Ответы [ 6 ]

28 голосов
/ 04 января 2010

Классы не являются гражданами первого класса в PHP, поэтому они не могут храниться в переменных, передаваться как аргументы функций или возвращаться из функций.

Однако PHP позволит вам моделировать гражданина первого класса, используя строку, содержащую имя класса, в определенных ситуациях:

$class = "Account";

$instance = new $class(); // You can create instances

call_user_func(array($class, 'frobnicate')); // You can call static functions

Это все, что в PHP <5.3. Однако с <a href="http://php.net/manual/en/language.oop5.static.php" rel="noreferrer"> PHP 5.3 вы также можете:

$class::frobnicate(); // cleanly call static functions

$fields = $class::$fields; // access static variables
1 голос
/ 01 декабря 2015

Я также получал такую ​​фатальную ошибку: Class 'MyClass' not found когда у вашего класса есть определенное пространство имен, тогда это, вероятно, пространство имен. Вам также необходимо упомянуть пространство имен в вашей строковой переменной.

$class = "App\MyClass"; // mention the namespace too
$instance = new $class();
0 голосов
/ 21 октября 2016

Я считаю, что эта похожая строка работает в моем приложении Laravel:

$thing->all(new Account);
0 голосов
/ 04 января 2010

См. Википедию об операторе разрешения области действия .Особенно смотрите раздел по PHP и ивриту.

0 голосов
/ 04 января 2010

Вы не можете использовать self таким образом: его можно использовать только в статическом контексте (то есть внутри статического метода), чтобы указывать на класс, а не на его имя.

Если вы работаете с нестатическими методами (кажется, что это так), вы должны использовать $this вместо self.


На самом деле, до PHP 5.3 вы не можете использовать статический метод / данные с «динамическим» (т.е. содержащимся в переменной) именем класса - см. Примеры на странице Статическое ключевое слово : они работают только с PHP 5.3, для такого рода манипуляций.

Что означает часть кода, подобную этой:

class ClassA {
    public static $data = 'glop';
}

$className = 'ClassA';
var_dump($className::$data);

Не будет работать с PHP <5.3 </p>

0 голосов
/ 04 января 2010

Попробуйте '$ this' вместо self.

Self работает таким образом в PHP. PHP думает, что встречает неизвестную константу, которую он не может найти, а затем предполагает, что это строка, содержащая «self».

Редактировать: Можете ли вы опубликовать класс и код, в котором вы создаете объект?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...