2010-06-25 3 views
79
Strict Standards: Declaration of childClass::customMethod() should be compatible with that of parentClass::customMethod() 

Каковы возможные причины этой ошибки в PHP? Где я могу найти информацию о том, что значит быть ?Декларация методов должна быть совместима с родительскими методами в PHP

+0

нетJim имеет это точно в порядке. @ waiwai933, если вы могли бы разместить заголовки (только первая строка: 'function customMethod (...)') для каждой функции, мы могли бы рассказать вам конкретную проблему. – nickf

+0

Подробнее о сообщении об ошибке и значениях времени компиляции PHP: https: //bugs.php.net/bug.php?id=46851 – hakre

+0

Возможный дубликат [Строгие стандарты: Декларация 'должна быть совместима с' '] (http://stackoverflow.com/questions/17234259/strict-standards -declaration-of-should-be-compatible-with) –

ответ

103

childClass::customMethod() имеет разные аргументы или другой уровень доступа (открытый/закрытый/защищенный), чем parentClass::customMethod().

+0

, вероятно, потому, что подписи _visibility_, методов не являются проблемой в PHP –

+39

Имея точный точный аргумент, значения по умолчанию также важны. Например, 'parentClass :: customMethod ($ thing = false)' и 'childClass :: customMethod ($ thing)' вызовет ошибку, потому что метод child не определил значение по умолчанию для первого аргумента. – Charles

+1

Я считаю, что видимость на самом деле является другой ошибкой. Кстати, в моем магазине мы не используем строгий режим, из-за этого (мы используем E_ALL, IIRC). – notJim

28

Это сообщение означает, что есть определенные возможные вызовы методов, которые могут не работать во время выполнения. Предположим, у вас есть

class A { public function foo($a = 1) {;}} 
class B extends A { public function foo($a) {;}} 
function bar(A $a) {$a->foo();} 

Компилятор проверяет только вызов $ a-> Foo() против требований A :: Foo(), который не требует никаких параметров. Однако $ a может быть объектом класса B, который требует параметра, и поэтому вызов будет терпеть неудачу во время выполнения.

Это, однако, не может потерпеть неудачу и не вызывает ошибку

class A { public function foo($a) {;}} 
class B extends A { public function foo($a = 1) {;}} 
function bar(A $a) {$a->foo();} 

Так ни один метод не может иметь больше, чем требуемые параметры родительского метода.

Такое же сообщение также генерируется, когда типы подсказок не совпадают, но в этом случае PHP еще более ограничительный. Это дает ошибку:

class A { public function foo(StdClass $a) {;}} 
class B extends A { public function foo($a) {;}} 

, как это делает:

class A { public function foo($a) {;}} 
class B extends A { public function foo(StdClass $a) {;}} 

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

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

+2

в вашем последнем примере - здесь не должно быть ошибок, потому что оно является законным, stdClass $ a более ограничительным, чем смешанный $ a. есть ли способ обойти это? я имею в виду, в этом случае PHP должен это допускать, но он все равно дает ошибку ... – galchen

+2

Ваш последний пример безопасен по типу, поэтому он, безусловно, «более ограничительный, чем он должен быть». Это может быть случай программирования с грузом-культурой, поскольку он конфликтует с полиморфизмом в C++ и Java. Http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#Contravariant_method_argument_type – Warbo

16

если вы хотите сохранить форму объектно-ориентированного программирования, не поворачивая какую-либо ошибку отключена, вы можете также:

class A 
{ 
    public function foo() { 
     ; 
    } 
} 
class B extends A 
{ 
    /*instead of : 
    public function foo($a, $b, $c) {*/ 
    public function foo() { 
     list($a, $b, $c) = func_get_args(); 
     // ... 

    } 
} 
+0

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

+18

Я думаю, что это очень хаки и грязно ... –

+0

Зависит от ситуации, я думаю. Тем не менее Да, возможно, это немного взломанно, но это php? уже, иногда это может быть хорошей работой, спасибо! <@ –

0

Просто расширить на этой ошибки в контексте интерфейса, если вы тип намекая ваши параметры функции, как так :

интерфейс Более

use Bar; 

interface A 
{ 
    public function foo(Bar $b); 
} 

Класс B

class B implements A 
{ 
    public function foo(Bar $b); 
} 

Если вы забыли включить use заявления о вашем реализующем классе (класс B), то вы также получите эту ошибку, даже если параметры метода идентичны.

-1

Абстрактный класс A

abstract class A { 
    function foo(); 
} 

Детский Класс B

class B { 
    function foo($a=null, $b=null, $c=null) 
    { 
     //do what you want with the parameters. 
    } 
} 

экземпляра:

$b = new B(); 
$b->foo(); 
$b->($m, $n, $l); 

Цель состоит в том, чтобы сделать как $b->foo и $b->($m, $n, $l) хорошо работать.

 Смежные вопросы

  • Нет связанных вопросов^_^