#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:
Вы не можете вычислять свойства в их определении класса.
Если вам нужно, чтобы переменная была инициализирована значением по умолчанию, которое может быть определено только выражением, вы можете сделать это с помощью конструктора.
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. Да, это ответ, и за этот ответ следует проголосовать и принять. Но ты опоздал, чувак, это вопрос времени.