脚本宝典收集整理的这篇文章主要介绍了PHP严格标准:声明应兼容,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
class O_Base {...} class O extends O_Base {...} abstract class A_Abstract { public function save(O_Base $obj) {...} } class A extends A_Abstract { public function save(O $obj) { echo 'save!'; } } $o = new O; $a = new A; $a->save($o);@H_502_3@当我运行这个代码,我得到消息:
@H_502_3@考虑这个:
abstract class Foo { abstract public function save(Guaranteed $obj); //or worse still: final public function DOStuff(Guaranteed $obj) { $obj->setSomething('to string'); return $this->save($obj);//<====!!!! } } class FBar extends Foo { public function save(Guaranteed $obj) { return $obj->setFine(true); } } class FBar2 extends Foo { public function save(ChildOfGuaranteed $obj) {//FaiL: This method is required by Foo::doStuff to accept ALL instances of Guaranteed } }@H_502_3@看这里,在这种情况下,完全有效的抽象类正在调用一个保证实例的save方法.如果您被允许在此类的子级中强制执行更严格的类型提示,则可以轻松地打破此doStuff方法.为了帮助您保护自己免受这些自我伤害的伤害,儿童课程不应该被允许对父母继承的方法执行更严格的类型.
$arg = new OtherChildOfGuaranteed; $array = array( 'fb' => new FBar,'fb2' => new FBar2 ); foreach($array as $k => $class) { if ($class instanceof Foo) $class->save($arg); }@H_502_3@现在,如果您只是在方法签名中提示“保证”,则此操作将正常工作.但是在第二种情况下,我们已经提出了类型提示有点太严格,这个代码将导致致命的错误.在一个更复杂的项目中调试这个有趣的乐趣… @H_502_3@PHP在很多情况下是非常原谅的,如果不是宽恕,但不在这里.而不是让你搔头,直到你的听力下降,PHP非常明智地给你一个头脑,说你的方法的执行违反了合同,所以你必须解决这个问题.
@H_502_3@现在,快速的解决方法(也是一个常用的)将是这样的:
class FBar2 extends Foo { /** * FBar2 save implementation requires instance of ChildOfGuaranteed * Signature enforced by Foo * @return Fbar2 * @throw InvalidargumentException **/ public function save(Guaranteed $obj) { if (!$obj instanceof ChildOfGuaranteed) throw new InvalidArgumentException(__METHOD__.' Expects instance of ChildOfGuaranteed,you passed '.get_class($obj)); //do save here... } }@H_502_3@所以,你只是按照原样离开抽象类型提示,但是使用docblock来记录你的代码
以上是脚本宝典为你收集整理的PHP严格标准:声明应兼容全部内容,希望文章能够帮你解决PHP严格标准:声明应兼容所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。