PHP класс и настройки свойств - PullRequest
1 голос
/ 05 июля 2011

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

class foo
{
    private $con = Db::init();

    public function __construct()
    {
    }

    //continue class..
}

Как видите, я просто назначаю этому классу простой одноэлементный PDO-класс. Это не работает, и я вынужден сделать следующее.

class foo
{
    private $con;

    public function __construct()
    {
        $this->con = Db::init();
    }

    //continue class..
}

Первый подход также не сообщает об ошибках. Просто не удается продолжить выполнение. Есть мысли?

1010 * редактировать *

Отсутствие ошибок также может быть проблемой Zen Cart.

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

То, что здесь происходит, это то, что класс является структурой, а структура скомпилирована перед выполнением вашего PHP Fiel, как во время компиляции PHP не создает никаких динамических данных, вы не можете использовать динамические данные .

Например:

$function = 'hello';
function $function(){}

Во время компиляции переменная '$ function' не существует, поэтому ее нельзя прочитать, в вашем классе PHP предусмотрена функция с именем __construct, которая запускается во время выполнения, что означает, что остальная часть системы динамическая. данные доступны.

class foo
{
    protected $bar;

    public function __construct()
    {
        $this->bar = Db::Init();
    }
}

Итак, процесс такой:

  • Время компиляции
    • Класс Foo
    • переменная полоса
    • функция __construct
  • Время выполнения
    • найден новый foo
    • внутренне создать объект
    • execute foo :: __ construct ()
    • return foo

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

Вы можете ввести, выполнив:

public function __construct(Bar $bar)
{
    $this->bar = $bar;
}

Вы можете создать базовый класс и расширить:

class DatabaseAccess
{
    protected $db;

    public function __construct()
    {
        $this->db = Db::Init();
    }
}

и затем сделайте:

class User extends DatabaseAccess
{
    public function getUser($id)
    {
         $this->db->fetchRow('users',$id);
    }
}

}

3 голосов
/ 05 июля 2011

Пожалуйста, смотрите документацию по недвижимости класса http://www.php.net/manual/en/language.oop5.properties.php

... эта инициализация должна быть постоянным значением, то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для оценки.

Db::init() необходимо оценить во время выполнения, чтобы определить значение для установки private $con, что противоречит требованию времени компиляции свойств класса.

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