繁体   English   中英

PHP抽象静态类方法的替代模型

[英]Alternative model for PHP abstract static class methods

好的,所以我在这里阅读了很多有关此的文章 ,但是我认为这是一个特定的新问题。

我想要我们这里很多人错误地称为“抽象静态方法”的功能。 也就是说: 我想要一个类,它坚持要对其进行扩展的类来实现某些静态方法

围绕被广泛讨论的不允许抽象静态存在的问题,似乎有两条路可走,但两条路线似乎都很微不足道。

问题

以下生成错误:“ PHP Strict Standards:静态函数A :: fn()不应为抽象”。

<?php
abstract class A
{
     abstract static public function fn();
}

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

解决方案1:使用接口

<?php
interface iA {
    static function fn();
}


abstract class A implements iA 
{
} // obviously this would have other stuff in it in reality

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

问题在于接口假设(指示)所有方法都是公共的。 因此,尽管达到了坚持抽象类的子类具有某些静态方法的目的,但它只能用于公共方法; 仍然无法确保A的子类实现受保护的静态方法。

当静态方法完全适用于静态数据但不应从“外部”调用时,受保护的静态方法很有用。

解决方案2:例外

abstract class A
{
     static public function fn()
     {  
         throw new Exception(get_called_class() . " must implement fn()");
     }

}

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

如果在调用fn()时可以在运行时使用。 但是在运行时必须处理编码语法错误并没有什么用。 尽管这可能只是一种方法的破解,但每种方法都有很多代码。

这种设计有什么问题,以至于该语言正确地禁止了这种设计? 奇怪的是,有多种方法可以坚持要求子类提供大多数类型的方法,但不能提供静态方法。

这是因为静态方法属于定义它们的 不管继承树如何, A::fn()B::fn()是两种不同的方法。 因此,将A::fn()定义为abstract几乎没有意义。

也许您所讨论的方法根本不应该是抽象的? 如果要使用任何种类的多态性,都应该涉及对象。

我可能完全错了,但是我使用时没有问题

abstract class A
{
     abstract static public function fn();
}

class B extends A
{
    static public function fn()
    {
         print 1;
    }
}

B::fn();

它产生1作为输出。 我已经在这里运行您的代码。 您使用什么版本的php?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM