2017-07-06 63 views
2
class Param() { 
} 
class Subparam extends Param { 
} 

class Base { 

    function mymethod(Param a) { 
    } 

} 

class Sub extends Base { 

function mymethod(Subparam a) { 
} 

} 

如何做在PHP中,这会导致一个警告:Declaration should be compatible with Base->mymethod(a : \Param)协方差在PHP(OOP) - 在工作

我能做些什么来防止这种情况,除了仅使用注释?

+1

你真的不能。 –

回答

-1

可以利用接口:

interface Test { 
} 
class Param implements Test { 
} 
class Subparam extends Param implements Test { 
} 

class Base { 

    function mymethod(Test $a) { 
    } 

} 

class Sub extends Base { 

function mymethod(Test $a) { 
} 

} 
+0

这是如何指定'Sub :: mymethod()'只应该用'Param'对象来调用的? – Barmar

+0

发生错误。我改变了它:) –

+0

我仍然没有看到这是如何使方法协变。 – Barmar

-1
class Param() { 
} 
class Subparam extends Param { 
} 

class Base { 

    function mymethod(a) { 
    // Remove the parameter type from the method declaration. 
    if (a !instanceof Param) { 
     throw new \Exception('Paramater type should be of 'Param.'); 
    } 

} 

class Sub extends Base { 

function mymethod(a) { 
} 

} 

这应该让你关闭。