Я определил абстрактный класс и метод, который, как предполагается, возвращает название шаблонного файла. Пользователь разделяет этот абстрактный класс на подклассы и реализует тот метод для возврата шаблонного имени файла. Но проблема, что там не происходит никакое предупреждение или безотносительно если пользователь просто ничего не возвращает.
Как я мог убедиться это? Код, который называет этот метод, принадлежит платформе, таким образом, я мог сделать некоторый необычный материал с settype($returnVal, 'string')
возможно, если это помогает? Есть ли лучшие решения?
В PHP нельзя "заставить" метод вернуть что-либо -- и это невозможно даже с абстрактными классами/методами или интерфейсами. Лучшее, что вы можете сделать, это указать, что реализация должна что-то вернуть, используя комментарий -- но вы не можете заставить людей сделать это :
/**
* @param string $a blah blah
* @return int The return value blah blah
*/
public function my_method($a);
Конечно, если вы вызываете этот метод (реализацию) из своего фреймворка, вы можете проверить, что было возвращено, и бросить Исключение, если оно не соответствует ожидаемому. ...
И вот краткий пример того, как это может быть реализовано :
class ClassA {
/**
* @param string $a blah blah
* @return ClassB The return value blah blah
*/
public function my_method($a) {
echo 'blah';
}
}
class ClassB {
// ...
}
$a = new ClassA();
$returned = $a->my_method(10);
if (!$returned instanceof ClassB) {
throw new Exception("Should have returned an instance of ClassB !");
}
Здесь, так как метод не возвращает экземпляр ClassB
, то будет брошено исключение.
Единственный способ сделать это - создать в родительском классе метод public final
, который будет использоваться вызывающим кодом, и метод protected
, который будет вызываться методом public final
. Метод protected
содержит функциональность, а метод public final
проверяет возвращаемое значение метода protected
.
class A {
public final call_this($param) {
$return_value = $this->extend_this($param);
// validate $return_value
if( $return_value == '' )
throw new Exception("uh-oh! Don't return an empty string!");
return $return_value;
}
protected extend_this($param) {
// default behavior
return $whatever;
}
}
class B extends A {
protected extend_this($param) {
// new behavior
return ''; //whoops!
}
}
$b = new B;
$b->call_this("testing testing 123");
//exception!
Это может быть немного запутанным для человека, расширяющего класс, хотя, если вы попробуете что-то подобное, убедитесь, что это хорошо документировано.
public final
является публичным методом, который не может быть переопределен, в случае если вы не знали. Также обратите внимание, что это будет работать только в PHP 5.0.0 или лучше.
Насколько я знаю, в PHP нет возможности достичь подсказки типов возвращаемых значений. Начиная с PHP 5, существует ограниченная подсказка для параметров функции .
Но даже если бы и была, то то, что вы пытаетесь сделать - это не работа для подсказки типов. Что произойдет, если возвращаемая мной строка будет пустой? Вам нужно будет проверить возвращаемое значение везде, где вызывается метод, и отреагировать соответствующим образом.