php中static和abstractor有啥区别?

定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

看描述感觉一样

阅读 3.8k
4 个回答

PHP在类上没有静态标识符,因此需要其他方法来防止实例化。

你可以通过定义一个抽象类来防止一个类被实例化,这是一个廉价的方法,虽然这不是一个抽象类的目的。

其他方法包括定义私有

私有函数__construct(){}
或者在构造函数中抛出一个异常,如果你想给一个更有意义的消息,为什么它不能被实例化。

function __construct(){throw new Exception('This is an static class'); }}

如果你也不想要类的子类声明类final

 final class foo {}

或者在奇数情况下,你想要能够子类化它,但不允许任何它的孩子实例化声明构造函数final。 (远的情况,但为了完整性)

最终私有函数__construct(){}

这两个差别很大!static 可以直接用,abstractor是抽象的。
打个比方,静态类好比小明的一辆汽车,我们谁用谁去开就好了,abstractor好比一个图纸,谁用,谁就得开发,去生产这一辆车,
汽车厂商拿到abstractor这个图纸,就可以生产汽车,生产可以用new来表示,new一个就是单独的一辆汽车

静态类static意味着你不需要实例化这个类就能够使用这个类里面的方法或者属性。

抽象类abstractor意味着这个类只是一个空壳子或者是一个需要你来继续完善的类,让你来参与这个类的实现。而且时强制性的。

我觉得根本就没有读明白那几句话的意思,也没有去实际编写代码试试,两者有根本的不同,楼上几个说的都对,但是和问题其实关系不大。

因为没有抽象属性,所以不需要讨论静态属性。
静态方法首先来说是一个方法,而抽象方法只有方法的接口定义。例如

class a {
//静态方法
static function foo(){
    //方法定义,你可以什么都不写
} 
//抽象方法
abstract function foo2(array $rows); //你不需要定义方法的具体逻辑,但是这个对象的子类必须补充定义,而且不能修改参数格式。
}
class b extends a {
    function foo2(array $rows) {
        print_r($rows);
    }
}

为什么要定义抽象方法,等你理解了接口再说,几句话解释不清楚,开发经验不够也理解不到接口的价值,所以不多废话了。
总结:你可以简单的理解为抽象方法是没写完的代码,所以不补齐它自然无法调用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题