PHP面向对象初中高级之由浅入深
php面向对象编程基本实践:(了解类,类到对象的实例化,构造和析构,对象的引用);
类的概念:
物以类聚,把具有相似特性的对象对垒到一个类中
类定义了这些相似对象拥有的相同的属性和方法
类是相似对象的描述,成为类的定义,是该类对象的蓝图或者原型
类的对象称为一个类的实例、
类的属性和方法统称为类成员
实例化的概念、类的定义和调用
类的实例化就是通过类的定义创建一个对象
类的定义以关键字class开始,后面跟着这个类的名称。类的命名通常每个单词的第一个字母大写,以大括号开始和结束
类的实例化为对象时使用关键字new,new之后紧跟类的名称和一对括号
对象中得成员属性和方法可以通过->符号来访问
构造函数
默认构造函数在对象被实例化的时候自动调用 (在所有的属性后面写 __construct方法,自动被调用);
$this是Php里面的伪变量,表示对象本身。可以通过$this-> 的方式访问对象的属性和方法。表示变量自身,(谁调用就指谁)
每一次用new实例化对象的时候,都会用类名后面的参数列表调用构造函数
data_default_timezone_set("PRC");在PHP头部设置默认时区;设定用于所有日期时间函数的默认时区
析构函数
destruct 析构函数关键字(在程序执行到最后时会自动调用);;
function destruct(){} 析构函数,与构造函数不同的是,构造函数必须在new实例化对象的时候才会被调用
析构函数是实例化对象在所有程序运行完结束才调用析构函数的,而且是根据实例化对象后入先出的原则,除非在执行过程中触发了析构函数,会立即调用析构函数
把实例化变量设置为空NULL可以立即调用析构函数(立即触发析构函数),(前提:实例化的对象没有引用且不会再被使用,设置NULL时才会被立即执行析构函数;)
在实例化一个对象并且访问成员属性,再实例第二个对象,再继续访问成员属性,这样析构函数也不会立即触发,直到程序执行结束(就是到末尾啦)
当一个类被实例化,不再引用时会自动调用析构函数
析构函数通常被用于清理程序使用的资源。比如程序使用了打印机,那么可以在析构函数里面释放打印机资源。
自总:类的每个实例化都会执行一次构造和析构函数,PHP程序执行结束后按照类创建的实例化对象后入先出的原则依次调用该类的析构函数,除非在执行过程中触发析构函数会立即调用析构函数。
构造和析构函数必须是类实例化后才会执行;
对象的引用
当对象的所有的引用全部设为 null 时才会调用 __destruct()函数
$james=new NbaPlayer('params') ;
$james1 = $james; //相当于复制出来多一个引用,两者是独立的两个引用。
$james2 = &$james; //相当于为james取一个别名,两者其实是一体的,只是有两个名字。
php面向对象编程高级实践:(继承、访问控制、Static静态关键字、重写、Final、接口、多态、抽象类)
面向对象--继承
提取想同的属性和方法汇总成一个大的class类,然后让子类对象继承想同的属性和方法,在子类的对象上可以直接访问父类中定义的方法和属性
php中可以用extends关键字来表示类的继承,后面跟父类(也叫基类)的类名。
php中extends后面只能跟一个类的类名,这就是php的单继承原则。
父类中定义的属性和方法,可以通过$this来访问使用。
重写(Overwrite):
一旦子类修改了父类的属性和方法,就按照子类修改之后的功能执行。
访问控制:
面向对象三种访问权限
public 自身 其子类 其他类
protected 其自身以及其子类
private 其自身
private不能被子类访问,为了访问私有元素:
可以定义getPrivate函数与setPrivate函数进行控制
静态成员Static
定义时在访问控制关键字后添加 static 关键字即可
(访问控制关键字:public. protected. private)
1.静态属性用于保存类的公有数据
2.静态方法里面只能访问静态属性
3.静态成员不需要实例化对象就可以访问,是全局的,修改既是全局修改。如果没有定义Static,实例化的修改则是独立的。
静态成员不需要创建对象就能访问,$this要在对象中才能使用,因此。。。
静态方法和属性定义时都要使用static关键字;访问静态属性,必须在::后加$ ;
static 方法内部不能使用$this获取static属性而是要用self:: 或static::或parent:: ;
即:
(当前类中)静态方法里面(只能访问静态成员属性)使用静态成员时用self/static::+成员名
静态方法里面使用父类中的静态成员时用parent::+成员名
外部访问静态方法或静态成员属性时用类名+::+方法名/成员属性名(不是静态的属性和方法不能这样访问;)。
Final成员;(PHP5之前不支持)
重写时参数不一定要跟父类完全一致,只要方法名一致就可以被重写
有关键字final的方法不可以重写,有final关键字的类不可以被继承
数据访问的补充:
parent关键字可以用于调用父类中被子类重写的方法; self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类中定义的常量;但不能用于访问类自身的属性;使用常量的时候不需要再常量名称前面加$符号;(const abc="在类中定义常量的方法") static关键字用于访问了自身定义的静态成员,访问静态成员时需要加$符号;属性 方法 备注
$this -> $ 动 静、动 无
self:: const、静 静、动 可访问父类const,访问静态属性要在前加$符号
parent:: const、静 静、动 重写的方法中调用父类同名的方法,另同下
static:: const、静 静 访问静态属性要在前加$符号
静态、动态的属性和方法都可以被重写;
复制代码
接口 interface
接口继承关键字implement ;
类的方法必须有实现,接口的方法必须为空。
一个类可以继承多个接口: class A implements B,C{}
接口继承接口的关键字也是extend;子类必须要实现所有接口的方法;接口不能创建自己的对象。
类可以接多个接口,接口可以继承接口,接口所有方法默认public,具体实现在类中实现,接口的方法为空。接口中有几个方法,子类中必须实现几个方法,这就是接口的作用,能统一取名;
instanceof 用来判断某个对象是否实现了某个接口,可以风险规避。
多态
对于同一个接口里面的方法,可以被多个类实现,这就是多态。接口主要是为了实现多态。
抽象类
接口里面的方法都是没有实现的,而类里面的方法都是有是实现的,那么抽象类就是允许类里面既有实现的也可以没有实现的。
继承抽象类的共有方法和抽象类方法; 关键字用extends;有只能继承一个抽象类;
php简直就是java和C++面向对象混到一块的,我都凌乱了,几股真气乱窜,分不清了
abstract 就是interface和extends的结合
魔术方法
如 创建一个MagicTest类的实例
$obj=new MagicTest();
construct(), destruct() ;
tostring(); Echo $obj; 会在把对象转换为string的时候自动调用
invoke(); $obj(4); 会在把对象当做一个方法调用的时候自动调用
call() ; 当对象访问不存在的方法名称时,此方法自动调用。
①调用示例:public function call($name,$argument){}
②注意:访问控制关键字必须为public;必须有两个参数:对象访问的方法名称($name)、方法包含的参数($argument,数组)。
callStatic() ; 当对象访问不存在的方法名称时,此方法自动调用。注意同上
call()和)callStatic()在PHP里面也被称为方法的重载(overloading)。通过这两个方法可以实现同一个方法的名称的调用可以对应不同的方法实现。
属性的重载get(),set(),isset(),unset(),empty()
get(),set(); $obj->name = "Name Value";在给不可访问的属性读取和赋值时会被分别调用;
isset(); isset($obj->name) 对不可访问属性调用isset()和empty()时,会触发isset()魔术方法
注意isset和empty不是相反的关系,isset判断的是值是否被定义过,empty认为没定义过的返回true
unset();对不可访问属性调用unset时,调用unset;
不能echo '$obj->name is empty?' .unset($obj->name);
clone; 可形成新的对象并调用类里面的clone()方法;
clone复制出来的对象与原对象互不干扰,并且可以用__clone()给复制出来的结果重新赋值。
implode(,$arr)将数组用","分隔开输出
面向对象
对内是高内聚,对外是低耦合。面向对象的设计追求:高内聚低耦合
魔术方法分三组:
1,toString(); invoke();
2,call(); callStatic();
3,get();set();isset();unset(); __clone();
PHP面向对象的概念也就这么多,其实和前端的面向对象大同小异,更接近ES6面向对象的思想,并不太难。但要结合实际运用在项目中,才能发挥最大的作用。(来源:程序员)