использование __DIR__ в классе

#php #dir

#php #dir

Вопрос:

Я пишу очень простое PHP-приложение, которое возвращает путь к файлу с небольшим изменением.

это мой код:

 <?php
class abc {

 private $path = __DIR__ . DIRECTORY_SEPARATOR. 'moshe' . DIRECTORY_SEPARATOR;

 function doPath() {
 echo $this->path;
 }

}


$a = new abc();
$a->doPath();
  

Я получаю сообщение об ошибке:

 PHP Parse error:  syntax error, unexpected '.', expecting ',' or ';' in /mnt/storage/home/ufk/1.php on line 4

Parse error: syntax error, unexpected '.', expecting ',' or ';' in /mnt/storage/home/ufk/1.php on line 4
  

по какой-то причине я не могу добавить connect __DIR__ с помощью ‘.’ к другой строке. чего я не понимаю?

использование PHP 5.5.13.

Комментарии:

1. То, что вы хотите сделать, — это плохая практика, называемая жесткой связью . Что, если вам придется изменить путь позже? Вы бы изменили код!

2. итак, что я должен сделать вместо этого?

3. Вместо этого вы должны передать путь в качестве параметра, подобного этому public function __construct($path){ $this->path = $path; } тогда new abs(__DIR__ . '/moshe/');

4. спасибо, что дали мне знать

Ответ №1:

До введения постоянных скалярных выражений в PHP 5.6 вы не могли динамически определять свойства класса. Этот пример теперь действителен в современных версиях PHP.

     private $a = 5   4;  // evaluated, wont work before PHP 5.6
    private $a = 9;      // works, because static value
  

Ваше решение:

 class abs
{
    private $path;

    public function __construct()
    {
        $this->path = __DIR__ . DIRECTORY_SEPARATOR . "moshe" . DIRECTORY_SEPARATOR;
    }
}
  

Комментарии:

1. @NiettheDarkAbsol интересно, у вас есть ссылка?

2. Постоянные скалярные выражения

Ответ №2:

Вы не можете вычислять свойства в их определении класса.

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

 public function __construct ()
{
    $this -> path = __DIR__ . DIRECTORY_SEPARATOR. 'moshe' . DIRECTORY_SEPARATOR;
}
  

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

 public function __construct ($path)
{
    if (!is_dir ($path)) {
        // Throwing an exception here will abort object creation
        throw new InvalidArgumentException ("The given path '$path' is not a valid directory");
    }

    $this -> path = $path;
}
  

Комментарии:

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