Переопределите методы класса или класс

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
47
задан George Cummins 21 May 2013 в 18:07
поделиться

7 ответов

Это звонило обезьяна, исправляющая . Но, PHP не имеет собственной поддержки его.

, Хотя, как другие также указали, , runkit библиотека доступна для добавления поддержки языку и является преемником classkit. И, хотя это, казалось, было , отказался его создателем (заявлявшим, что это не было совместимо с PHP 5.2 и позже), проект, действительно теперь кажется, имеет новый домашний и обслуживающий .

я все еще не могу сказать, что я - поклонник из его подхода. Создание модификаций путем оценки строк кода, всегда казалось, мне было потенциально опасным и трудным отладить.

однако, runkit_method_redefine , кажется, то, что Вы ищете, и пример его использования может быть найден в [1 110] /tests/runkit_method_redefine.phpt в репозитории:

runkit_method_redefine('third_party_library', 'buggy_function', '',
    'return \'good result\''
);
39
ответ дан Community 26 November 2019 в 19:41
поделиться

Ради полноты - исправление обезьяны доступно в PHP до runkit. Для получения дополнительной информации см. runkit_method_redefine().

11
ответ дан Dmitry Zenovich 26 November 2019 в 19:41
поделиться

Да, это звонило extend:

<?php
class sd_third_party_library extends third_party_library
{
    function buggy_function() {
        return 'good result';
    }
    function other_functions(){
        return 'blah';
    }
}

я снабдил префиксом "sd".;-)

Имеют в виду, что при расширении класса до переопределенных методов подпись метода должна соответствовать оригиналу. Так, например, если оригинал, сказанный buggy_function($foo, $bar), это должно соответствовать параметрам в классе, расширяющем его.

PHP является довольно подробным об этом.

6
ответ дан Till 26 November 2019 в 19:41
поделиться

Studio зенда и PDT (основанный на затмении язь) имеют некоторых созданных в refractoring инструментах. Но существуют не создан в методах, чтобы сделать это.

Также Вы не хотели бы иметь плохой код в своей системе вообще. Так как это могло быть призвано по ошибке.

1
ответ дан Ólafur Waage 26 November 2019 в 19:41
поделиться

Если библиотека явно создает плохой класс и не использует локатор или систему зависимости, Вы являетесь неудачливыми. Нет никакого способа переопределить метод на другом классе, если Вы не разделяете на подклассы. Решение могло бы состоять в том, чтобы создать файл исправления, который фиксирует библиотеку, таким образом, можно обновить библиотеку и повторно применить патч для фиксации того определенного метода.

0
ответ дан MOdMac 26 November 2019 в 19:41
поделиться

Вы могли бы быть в состоянии сделать это с runkit. http://php.net/runkit

0
ответ дан Toxygene 26 November 2019 в 19:41
поделиться

Существует alway расширение класса с новым, надлежащим, методом и вызовом того класса вместо ошибочного.

class my_better_class Extends some_buggy_class {
    function non_buggy_function() {
        return 'good result';
    }
}

(Извините за дрянное форматирование)

0
ответ дан RiaD 26 November 2019 в 19:41
поделиться
Другие вопросы по тегам:

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