ошибка восстановления поздней статической привязки php, ожидающая T_FUNCTION

#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. Хорошо, это решило эту проблему, я не могу поверить, что пропустил это