Я могу вынудить метод абстрактного класса возвратить что-то?

Я определил абстрактный класс и метод, который, как предполагается, возвращает название шаблонного файла. Пользователь разделяет этот абстрактный класс на подклассы и реализует тот метод для возврата шаблонного имени файла. Но проблема, что там не происходит никакое предупреждение или безотносительно если пользователь просто ничего не возвращает.

Как я мог убедиться это? Код, который называет этот метод, принадлежит платформе, таким образом, я мог сделать некоторый необычный материал с settype($returnVal, 'string') возможно, если это помогает? Есть ли лучшие решения?

8
задан openfrog 27 December 2009 в 10:42
поделиться

3 ответа

В 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, то будет брошено исключение.

.
10
ответ дан 5 December 2019 в 07:35
поделиться

Единственный способ сделать это - создать в родительском классе метод 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 или лучше.

.
4
ответ дан 5 December 2019 в 07:35
поделиться

Насколько я знаю, в PHP нет возможности достичь подсказки типов возвращаемых значений. Начиная с PHP 5, существует ограниченная подсказка для параметров функции .

Но даже если бы и была, то то, что вы пытаетесь сделать - это не работа для подсказки типов. Что произойдет, если возвращаемая мной строка будет пустой? Вам нужно будет проверить возвращаемое значение везде, где вызывается метод, и отреагировать соответствующим образом.

1
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: