先说说我想达到的目的
所有的模型类共用AppModel中的方法,并且直接操作也是操作模型对象本身。
所以这里有个方法就很重要:get_called_class(),可以获取真实调用的子类的类名
当方法和属性都写好后,我怕AppModel的子类由于某种原因不小心把我父类的属性覆盖了怎么办,这样可能会导致方法数据计算错误
这时候私有化就很有用了,直接将AppMode类中的属性私有化,这样子类的定义就算和父类同名,也是互不影响的。
那如果子类想访问获取设置父类AppModel类中的私有属性怎么办?
这个时候get和set方法的作用就体现出来了,可以写两个方法,一个获取这个私有属性,一个用于修改这个私有属性
我怕别人不小心在子类中将我父类中的方法重写,而出现一些不可控的错误,但是又希望保持继承的关系
这个时候就可以用final关键字,用它来修饰方法可以保证方法不被子类重写
如果修饰类的话会使类变成最终类,也就是不可被继承的类。
我觉得一直用一个变量去调用一个方法这样很繁琐,我想实现链式调用用来方便我的操作
可以使用返回 t h i s , 在 方 法 结 束 后 返 回 this,在方法结束后返回 this,在方法结束后返回this,这样实际在调用的时候并不需要用变量来保留,可以直接继续调用下一个方法。
我想定义一个永远不会被改变的变量
可以用const 关键字定义一个属性,一旦被const定义后在程序中就不能更改。访问也必须用静态调用。
对象可以直接调用静态方法吗?
可以,用对象的方式可以直接调用静态方法,但是反过来是不行的。普通方法只能通过实例化对象后调用。我想是因为静态方法优先加载于普通方法,所以用静态的方法去调用普通方法,那个时候普通方法都不存在,拿什么调用呢。又或者说是普通方法是存在于对象中的,对象都没有何来普通方法。
名词解释
重载和重写的区别?
重载是定义相同的方法名,但是参数不同。重载是在一个类中的操作。重载是编译时的多态性。
重写是子类重写父类的方法,重写是在子类和父类之间。重写是运行时的多态性。
get_called_class()和get_class()的区别?
get_class(),获取的是当前的类名
get_called_class(),获取后期静态绑定类的名称,也就是非转发调用中存储的类。
什么非转发调用和转发调用?
非转发调用:类名明确 A::functionA()
转发调用:self:: , parent:: , static:: , forward_static_call() , get_called_class()
来源公众号:php 全栈技术