Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Это звонило обезьяна, исправляющая . Но, 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\''
);
Ради полноты - исправление обезьяны доступно в PHP до runkit. Для получения дополнительной информации см. runkit_method_redefine()
.
Да, это звонило 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 является довольно подробным об этом.
Studio зенда и PDT (основанный на затмении язь) имеют некоторых созданных в refractoring инструментах. Но существуют не создан в методах, чтобы сделать это.
Также Вы не хотели бы иметь плохой код в своей системе вообще. Так как это могло быть призвано по ошибке.
Если библиотека явно создает плохой класс и не использует локатор или систему зависимости, Вы являетесь неудачливыми. Нет никакого способа переопределить метод на другом классе, если Вы не разделяете на подклассы. Решение могло бы состоять в том, чтобы создать файл исправления, который фиксирует библиотеку, таким образом, можно обновить библиотеку и повторно применить патч для фиксации того определенного метода.
Вы могли бы быть в состоянии сделать это с runkit. http://php.net/runkit
Существует alway расширение класса с новым, надлежащим, методом и вызовом того класса вместо ошибочного.
class my_better_class Extends some_buggy_class {
function non_buggy_function() {
return 'good result';
}
}
(Извините за дрянное форматирование)