笔记php:php面向对象
- public只能被实例访问
protected 被父类和子类访问,不能直接被实例访问
private 只能在本类内部访问 - 类内部 函数和属性 用 $this访问,外部用实例访问
常量 类内部用self::const访问 外部用Class::const访问 - php面向对象中的final关键字
可以用在类或函数前面,防止类被继承或函数在子类中被重写 - 命名空间(防止不同文件导入同一个文件时两个相同名字的类或函数冲突)
先在其文件中用namespace定义,然后在其他文件中使用它中的类、函数、常量时use venter\a\ClassName; use venter\a\ClassName as AliasName; use function venter\myFunc; use const venter\MYCONST; namespace index; include '3.php';//全局命名空间(没有设置命名空间) //当调用全局命名空间的类时类不能直接调用,要加\代表全局空间中查找 var_dump(new \Test1()); echo test2();//属性和常量则可以直接调用 echo TEST3
4. 类自动加载
function my_autoloader($class) {
include 'classes/' . $class . '.class.php';
}
spl_autoload_register('my_autoloader');
// 或者,自 PHP 5.3.0 起可以使用一个匿名函数
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});
根据类models\Imooc传入自动加载函数达到自动加载类文件的目的。
6. static关键字
变成类属性和方法
属性
函数
上图会报错,静态方法不能调用非静态属性,静态方法调用静态属性,使用self关键词, t h i s 没 有 上 下 文 。 因 为 this没有上下文。因为 this没有上下文。因为this是类的实例,是对象。而加static的函数是类本身的函数,所以不能调用$a.
子类继承父类的带有static的函数时,可用parent::method();如下图:
7. 后期静态绑定
上图返回 “A类的who方法”
下图使用后期静态绑定,返回 “B类的静态方法”
8. 魔术方法
1). __set(),__get():
上图,类的实例改变类的私有属性,有魔术方法__set()实例才可以访问私有属性
2).__isset():
上图,当实例需要查询的属性未发现时会调用__isset()魔术方法,去类中寻找私有属性
3).__unset():
4).__call():
上图。当实例调用不存在的方法时,在类中定义魔术变量__call(),则此时不会报错,程序会执行魔术方法。
5).__callStatic():
上图,如果调用不存在的静态方法时,会调用该魔术方法,程序不会报错。
6).__invoke():
上图,当对象被当函数使用时,会调用__invoke()魔术方法
9. 对象拷贝和类型约束
1).浅拷贝(对象的赋值是浅拷贝,地址传递)(一个地址放一把钥匙,也可放其它东西)
2).深拷贝
$b = clone a ; ( a;( a;(a赋值了一份给$b)(两个值互不影响了)
上图,当对象a深拷贝给对象b时,但$a->obj = new B()还是浅拷贝,所以需要在在类A内部使用__clone()魔术变量,使obj深拷贝一份给自己。当b的obj改变时,a的obj不受影响.
类型约束
10. Trait(代码复用)
Trait A{
//
}
Trait B{
//
}
Trait C{
Use A,B;
}
Calss Test{
Use A,B;
//Use C;
}
这样Test类中就拥有Trait类中全部的方法和属性了。
11. 接口(接口是类的模板,类是对象的模板,接口里的方法不定义,但接口里面的方法全部要在类中实现)
定义
接口可继承:
如下图,不过一般不这样做,而是直接class Test implements Ia,Ib{}
接口也可使用常量,如Ia中有const ABC=”abc”;则可以Ia::ABC;
12.抽象类(abstract)(抽象类中的方法在类中可部分实现,而且抽象类可以具体实现方法,接口只写方法名,不能具体实现,必须在类中全部实现)
要加class
13.单例模式和工厂模式
单例模式:实例化一个类多次,做到只开辟一个内存空间,节省内存空间
工厂模式:在多个位置实例化一个类,建另一个类来存它的实例并调用
单例模式:(本身类中定义方法)
工厂模式:(另外类中定义方法)