#php #class
#php #класс
Вопрос:
Почему я не могу установить переменную открытого члена с помощью функции?
<?
class TestClass {
public $thisWorks = "something";
public $currentDir = dirname( __FILE__ );
public function TestClass()
{
print $this->thisWorks . "n";
print $this->currentDir . "n";
}
}
$myClass = new TestClass();
?>
Его запуск приводит:
Parse error: syntax error, unexpected '(', expecting ',' or ';' in /tmp/tmp.php on line 7
Комментарии:
1. У вас не может быть выражений в объявлениях переменных. Вы можете использовать только постоянные значения.
2. @mario: Это ответ, а не комментарий.
3. @delnan: Просто мне нравится избегать однострочных ответов; но теперь я обработал текст для заполнения..
Ответ №1:
У вас не может быть выражений в объявлениях переменных. Вы можете использовать только постоянные значения. dirname()
Может не отображаться в этой позиции.
Если бы вы использовали PHP 5.3, вы могли бы использовать:
public $currentDir = __DIR__ ;
В противном случае вам придется инициализировать $this->currentDir
в __construct
или.
Ответ №2:
Согласно руководству по PHP, переменные вашего экземпляра:
должна быть способна оцениваться во время компиляции и не должна зависеть от информации во время выполнения, чтобы быть оцененной
Таким образом, вы не можете использовать функцию dirname при инициализации свойства. Поэтому просто используйте конструктор для установки значения по умолчанию через:
public function __construct() {
$this->currentDir = dirname( __FILE__ );
}
Ответ №3:
Вы не можете вызывать функции при указании атрибутов.
Используйте это вместо:
<?php
class TestClass{
public $currentDir = null;
public function TestClass()
{
$this->currentDir = dirname(__FILE__);
/* the rest here */
}
}
Комментарии:
1. Этот код вообще не имеет смысла. Общедоступная глобальная переменная? Общедоступная глобальная функция с именем TestClass?
2. Извините, я забыл скопировать-вставить определение класса
3. Они изменили имя конструкторов на __construct 🙂
4. Они не изменили ее, они просто добавили __construct в какой-то момент (PHP5?). Имя класса в качестве конструктора все еще работает, ЕСЛИ вы не используете PHP5.3.3 или выше ( php.net/releases/5_3_3.php ) И ваш класс находится внутри пространства имен.
5. Но они отходят от этого соглашения об именовании.
Ответ №4:
Похоже, вы не можете вызывать функции при указании значений по умолчанию для переменных-членов.
Ответ №5:
К сожалению, вы не можете вызывать функции для объявления переменных класса. Однако вы могли бы присвоить возвращаемое значение из dirname( FILE ) $this-> currentDir из конструктора.
РЕДАКТИРОВАТЬ: Имейте в виду: конструктор в PHP => 5 называется __construct( ) , а не именем класса.
Ответ №6:
Вы можете использовать это вместо:
public $currentDir = '';
public function TestClass()
{
$this->currentDir = dirname( __FILE__ );
...
Ответ №7:
dirname
Выражение вызывает ошибку, вы не можете объявить выражение в качестве переменной там. Хотя вы могли бы это сделать.
<?
class TestClass {
public $thisWorks = "something";
public $currentDir;
public function __construct()
{
$this->currentDir = dirname( __FILE__ );
}
public function test()
{
echo $this->currentDir;
}
}
Каждый раз, когда вы создаете экземпляр нового класса, dirname будет задаваться в конструкторе. Я также рекомендую опустить закрывающий тег php ?> в ваших файлах. Помогает устранить ошибки, связанные с отправкой заголовка
Ответ №8:
Причина в том, что вы не можете назначать переменные экземпляра с помощью функций статическим образом. Это просто не разрешено в PHP.
Могу ли я предложить вам сделать это:
<?
class Foo {
public $currentDir;
public function __construct() {
$this->currentDir = dirname(__FILE__);
}
}
?>
Комментарии:
1. Это утверждение слишком широкое и неправильное (возможно, просто небрежно сформулированное, но все же).
Ответ №9:
сделайте это в конструкторе. $this-> currentDir = dirname(ФАЙЛ);
и, кстати, выведите $currentDir . » n»; используйте $this при вызове переменных в классе