php中static和abstractor有啥区别?


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

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

看描述感觉一样


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


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

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


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

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

其他方法包括定义私有

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

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

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

 final class foo {}

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

最终私有函数__construct(){}


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

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

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

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



相关阅读:
如何删除选中的cell中对应的行?
js弹窗验证失败
关于STUN协议中属性的一点问题
vuejs 折叠面板的展开收缩动画应该怎么实现?用vue自带的过渡效果还是css3?
关于表单页面提交信息的判断
extjs3.2 panel组件能否添加focus和blur事件
如何将全局变量i变成函数的局部变量?
vue应用嵌在微信里 ,点击微信右上角的分享其中一个页面的链接 ,怎样让用户点开来就是当前页面呢?
AngularJS路由添加controller问题
PC端API和移动端API有什么不同吗?
pycharm 如何配置 python3 的开发环境?
vue中通过this.$router.push 到当前页面,只是参数不同,页面没有重新请求数据?
vue.js2.0中set和get的问题
$.ajax 跨域 options
mysql 的IFNULL失效
webpack在安装的时候出现问题
使用websocket上传视频文件后无法播放
作用域链的问题?
angular.js高级程序设计书本开头配置环境出错,谁能给解答一下
样式和类样式区别



快速导航

Copyright © 2016 phpStudy |