Доступна ли глобальная константа PHP внутри файла класса? - PullRequest
4 голосов
/ 18 января 2010

Доступна ли глобальная константа PHP внутри файла класса?

define('SITE_PATH', 'C:/webserver/htdocs/somefolder/');

Тогда в моем файле класса я пытаюсь это

public $debug_file = SITE_PATH. 'debug/debug.sql';

Это, похоже, не работает,

Ошибка разбора: ошибка разбора, ожидание ','' or ';' 'в C: \ WebServer \ HTDOCS \ SomeFolder \ входят \ классы \ Database.class.php по линии 21

Ответы [ 4 ]

4 голосов
/ 18 января 2010

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

define('SITE_PATH', 'C:/webserver/htdocs/somefolder/');

class Klass
{
    protected $_debugFile;
    public function __construct()
    {
        $this->_debugFile = SITE_PATH. 'debug/debug.sql' // default
    }
    public function setDebugFile($path)
    {
        $this->_debugFile = $path // custom
    }
}

Обратите внимание, что внедрение SITE_PATH вместо жесткого кодирования было бы еще лучше.

3 голосов
/ 18 января 2010

Вы не можете иметь выражение в объявлении класса.

Я бы предложил передать путь в:

public function __construct($path)
{
    $this->debug_path = $path;
}

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

Или вы можете создать несколько объектов, каждый из которых имеет разные пути.Это полезно, если это класс автозагрузчика, так как вы можете захотеть, чтобы он загружал несколько каталогов.

$autoloader = new Autoload(dirname(SYS_PATH));
$autoloader->register_loader();

class Autoload
{
    public $include_path = "";

    public function __construct($include_path="")
    {
        // Set the Include Path
        // TODO: Sanitize Include Path (Remove Trailing Slash)
        if(!empty($include_path))
        {
            $this->include_path = $include_path;
        }
        else
        {
            $this->include_path = get_include_path();
        }

        // Check the directory exists.
        if(!file_exists($this->include_path))
        {
            throw new Exception("Bad Include Path Given");
        }
    }
    // .... more stuff ....
}
2 голосов
/ 18 января 2010

Вы не можете использовать выражение (.) В инициализаторе поля. См. Пример один в руководстве по PHP

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

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

См. http://php.net/manual/en/language.oop5.static.php

...