首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >php oop -强制静态方法的参数成为当前类的对象

php oop -强制静态方法的参数成为当前类的对象
EN

Stack Overflow用户
提问于 2017-04-06 15:52:31
回答 3查看 234关注 0票数 2

我想做这样的事情:

代码语言:javascript
运行
复制
class myclass{

   public static function(__class__ $param){
    // do somthing
   }
}

但是__class__self::class以及nor static不起作用。

我该怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2017-04-06 15:59:35

只需使用self即可

代码语言:javascript
运行
复制
class A 
{
    public function foo(self $arg)
    {
        var_dump($arg);
    }
}

$a = new A();
$a->foo($a); // object(A)#1 (0) { }

不,但是,伙计们,假设类被扩展到,他可能想要确保对此方法的调用使用子类,而不是父类

您可以手动限制子类的此约定,如其他anwsers (instanceof等)中所示,但它违反了Liskov substitution principle

子类应该始终满足父类的约定( contract )。在良好的设计中,您不应该缩小被覆盖方法中的参数类型。

允许加宽:Contravariant method argument type和PHP7.2部分supports它。

票数 3
EN

Stack Overflow用户

发布于 2017-04-06 16:00:41

如果您想对子类动态执行此操作,恐怕这是不可能的。在这种情况下,您能做的最好的事情是:

代码语言:javascript
运行
复制
class myclass {
    public static function doStuff(self $a) {
        if (!$a instanceof static) {
            throw new InvalidArgumentException(sprintf('First argument must be of type %s', static::class));
        }
        // Do things with $a
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-04-06 16:02:22

您所要求的在强类型语言中没有多大意义,所以我不认为在PHP中可以做到这一点。

请考虑以下内容:

代码语言:javascript
运行
复制
abstract class A {
     public abstract function a(A $myTypeObject);
}

class B extends A { 
     public function a(B $myTypeObject) {
         return $this;
     }
}

现在,这段代码的问题是它不能存在,因为被覆盖的函数必须与父函数匹配相同的签名。在强类型语言中,a实际上是一个重载,因此B将有两个a声明,一个接受A,另一个接受B。然而,在PHP中,你只会得到一个解析错误。如果你真的想强制执行一些东西,你需要运行时检查:

代码语言:javascript
运行
复制
abstract class A {
     public function a($myTypeObject) {
          if (!($myTypeObject instanceof static)) {
              throw new \Exception("Invalid type");
          }
     }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43249010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档