面向对象总结(php)

文章来自:源码在线https://www.shengli.me/php/59.html

一、面向对象有一下几个特性

  1. 重用性 ——每个对象模块都可以在项目中重复使用。

  2. 拓展性——模块上添加新功能是很方便的.

  3. 灵活性——每个模块都很方便被替换修改。

二、类和对象——类生成对象。

     一个类里面只有属性和方法,还有一个项目中不能有两个同名类,但是一个类实例化出来的对象可以有多个。

 

三、类的属性和方法

属性有三种:

 (1)public 公共属性, 都可以访问;

 (2)private 私有的 只有内部可以访问

 (3)protected 受保护 继承的子类和类本身内部可以访问,外部访问不了,如: $computer->output();如果output()方法设了protected,则会报错。

方法

方法里面调用一个属性,需要实例化类才能访问属性,而$this可以理解为是这个类的一个实例

构造方法与析构方法(实例化时执行和销毁时执行)

构造方法可以传递参数,在实例化时传入

 

析构方法:不能有参数

类常量

内部访问 self::常量名

外部访问不需要实例化:类名::常量名

一个是对象$this 相当于实例化后,可以说除了静态和const常量,基本上其他都可以使用this联络 ;

self则是类本身 self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化的

类的继承


子类也可以覆盖父类的方法

子类没有构造方法时,会调用父类的构造方法,有则调用自己的,
用关键字 parent:: __construct();可以调用父类的构造方法
用final关键字加在类前面就不会被继承;加到方法面前,此方法就不会被重写

命名空间(解决命名冲突问题)
利用文件系统不用目录的原理
被引入的php文件中加入 namespace 目录\子目录;
使用时调用:new 目录\子目录\类名();如 new com\session\computer();
受命名空间影响的有,类(包括抽象类,traits),接口,函数,常量(const和define都是用来声明常量的(它们的区别不详述),但是在命名空间里,define的作用是全局的,而const则作用于当前空间。)

要注意的是,当前脚本文件的第一个命名空间前面不能有任何代码,下面的写法都是错误的:

由于每次调用都要写上路径,很麻烦,所以出现use的用法(use引入必须带类名或者函数名)
在调用时先用use引入,use 目录\子目录\类;还可以起个别名区别 as

重点:在命名空间里面调用全局的类,函数,常量的区别,
页面a定义了命名空间 namespace venter;引入b页面(全局空间)后,此时想调用b页面的类,必须:
New \venter() 加个\代表全局空间下的
但是调用函数和常量时,就不需要加,因为他会自动寻找,向全局寻找。

类自动加载:
当你实例化一个类时,这个类不存在,就会自动执行我们写的 function __autoload($className){},在这个自动函数的内部去执行我们想要操作的代码,参数就是我们实例化的类名,因此可以根据参数去引入php文件。
__autoload将被淘汰,使用新的函数 spl_autoload_register();参数可以传函数名或者匿名函数

利用命名空间和自动加载实现项目自动引用
1,文件目录就和命名空间名一样,文件名和类名一样 new models\imooc() 就是在models文件下的imooc.php文件,
2,然后利用spl_autoload_register(function($classname){
include str_replace("\\","/",$classname.".php");
});
这里的作用是models\imooc替换掉models/imooc.php 引入
而imooc.php文件中必须命名 namespace models;

static 静态
当属性和方法被定义为 static 时就变成类的属性和方法,不属于对象的,不需要实例化

 

子类用parent::调用父类的静态方法

静态方法不能调用非静态属性
//因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象

后期静态绑定:

魔术方法
__set($var,$val) 设置私有属性,当外部调用设置一个私有属性时会自动执行这个方法,
__get($var)获取私有属性,原理是外部调用一个私有属性时会自动执行这个方法
例子:

 

__isset($var)方法,当外部调用isset($test-abc)访问一个不能访问的属性时,就会自动执行

__unset($var),当外部想删除一个私用属性时,会自动执行

__call($func方法名,$arguments参数)当外部调用一个没有定义的方法时,就会调用

__callStatic($meethod,$arg)当调用一个不存在的静态方法时,会自动执行 注意在function 前也要加入 static 因为是静态方法

__invoke($rag)当实例化一个类后,把这个对象变量当成函数调用时,会自动执行 
例如:$test = new test();
$test("go....");

__toString()当要打印一个对象变量时,会执行,比如 echo($test);

对象拷贝:
浅拷贝:是地址传递(对象是浅拷贝)
深拷贝:复制一份,新开辟一块内存(普通变量是深拷贝)

加clone 使对象成为深拷贝,互不影响;
$a = new A();
$b = clone $a;

__clone()当使用clone时,会自动执行
$a = new A();
$b = clone $a; 在A类中会执行__clone()
例子:

 

 类型约束

trait 关键字

解决单继承问题 配合use 使用

接口

可以理解为类的模板 不能直接被实例化

抽象类

内部有自己的执行方法


单例模式:

让一个类只会被实例化一次,节省内存空间
先把构造函数和克隆函数变成私用属性

 

工厂模式:

就是在多处实例化一个类,当这个类名需要改变时,就会导致大量地方需要更改,使用工厂模式避免这种情况发生

 /*--------------多态的一个应用实例 模拟USB设备的使用------------------*/

猜你喜欢

转载自blog.csdn.net/hugejihu9/article/details/83105104