#php #late-static-binding
#php #поздняя статическая привязка
Вопрос:
Я новичок в ООП, и я работал над этим примером, но, похоже, я не могу избавиться от этой ошибки
Parse error: syntax error, unexpected ';', expecting T_FUNCTION in C:Program Files (x86)Apache Software FoundationApache2.2...php_late_static_bindings.php on line 16
Я пытался выполнить следующий код:
abstract class father {
protected $lastname="";
protected $gender="";
function __construct($sLastName){
$this->lastname = $sLastName;
}
abstract function getFullName();
public static function create($sFirstName,$sLastName){
return new self($sFirstName,$sLastName);
};
}
class boy extends father{
protected $firstname="";
function __construct($sFirstName,$sLastName){
parent::__construct($sLastName);
$this->firstname = $sFirstName;
}
function getFullName(){
return("Mr. ".$this->firstname." ".$this->lastname."<br />");
}
}
class girl extends father{
protected $firstname="";
function __construct($sFirstName,$sLastName){
parent::__construct($sLastName);
$this->firstname = $sFirstName;
}
function getFullName(){
return("Ms. ".$this->firstname." ".$this->lastname."<br />");
}
}
$oBoy = boy::create("John", "Doe");
print($oBoy->getFullName());
У кого-нибудь есть какие-нибудь идеи?
$oGirl = girl::create(«Джейн», «Лань»);
print($oGirl->getFullName());
Комментарии:
1.
return new static
должен быть вызов. Потому что в противном случае он попытается создать экземпляр абстрактного класса (что приведет к сбою)… Но что такое строка 16?
Ответ №1:
Сначала вам нужно удалить точку с запятой, которая стоит после определения вашего метода :
public static function create($sFirstName,$sLastName){
return new self($sFirstName,$sLastName);
} // there was a semi-colon, here
Тогда, вы, вероятно, захотите использовать static
, а не self
здесь :
public static function create($sFirstName,$sLastName){
return new static($sFirstName,$sLastName);
}
Объяснение :
self
указывает на класс, в котором она написана — здесь,father
класс, который является абстрактным и не может быть создан.static
с другой стороны, означает позднюю статическую привязку — и, здесь, укажет на вашboy
класс; который является тем, который вы хотите создать.
Комментарии:
1. 1 Но помните, что поздняя статическая привязка будет работать только начиная с PHP 5.3 🙂
2. Я удалил точку с запятой и изменил self на static, теперь я получаю ошибку Ошибка синтаксического анализа: неожиданный T_STATIC, ожидающий T_STRING или T_VARIABLE или ‘$’ в C:Program Файлы (x86) Программное обеспечение Apache FoundationApache2.2htdocsbrjulias_devphp_late_static_bindings.php в строке 14
3. Heu … вы уверены, что используете PHP > = 5.3? Поздняя статическая привязка не существовала с PHP < 5.3
4. Да, это так 🙂 (не забудьте прочитать php.net/manual/en/migration53.php )
Ответ №2:
Отчеты об ошибках PHP обычно довольно хороши. Просто прочитайте ошибку. Проблема здесь:
public static function create($sFirstName,$sLastName){
return new self($sFirstName,$sLastName);
};
Удалите обучающую точку с запятой.
public static function create($sFirstName,$sLastName){
return new self($sFirstName,$sLastName);
}
Комментарии:
1. Хорошо, это решило эту проблему, я не могу поверить, что пропустил это