PHP面向对象
php是单继承语言不能同时继承两个类
- 定义类用class 对象是类的实例化 项目由对象构成
- Public 公共类型 所有程序皆可使用
Private 私有类型 只有该类内可以使用
Protected 受保护类型 只有该类或者其子类或者父类可以使用
3.构造方法和析构方法
构造方法发 __contruct 实例类方法的时候自动执行
析构方法 __destruct 注销对象的时候自动执行
也可以手动关闭 unset($var) 手动注销对象
类常量关键字const 定义类里的常量,定义后就不再改变
调用类常量通常用self::常量名来调用 可以不用实例化直接使用
类名::类常量名
- 子类方法覆盖父类方法
当子类方法与服了方法重名,子类方法会覆盖父类方法,调用子类方法时不再显示父类同名方法内容
Parent关键字可以调用父类内的方法或属性 例如parent::父类内的方法或属性名
Final关键词写在class前 作用是令该类无法被继承
- 命名空间namespace
作用防止不同文件中的方法应用到一个页面时起冲突
使用的时候在对应类页面开头加上namespace 路径名(随意)给两个有同样方法的页面标上不同的命名空间,可避免冲突。引用的时候只需在调用处加上命名空间就可以引用,如果觉得命名空间太长,则可以用use关键字引入不同页面下的方法用as起个别名然后可以直接用别名来引用
全局空间包含命名空间 若命名空间内文件要调用全局空间内的东西,则在调用处加上字符 \ 就可以引用。注意命名空间中调用全局空间中的类必须加 \ ,而调用函数或常量的时候可以不加 \ ,因为php命名空间中没有这个类必须要用 \ 才可以到全局空间找需要使用的类,而命名空间中若没有要调用的函数或者变量则php会自动去全局空间寻找
- 类的自动加载机制
- php中一般一个类用一个文件来储存这样引用类时要用多个require/include引用多个类 这样很麻烦,所以用类的自动加载机制来简化这一个过程
- 每个类按照类所在文件名定义命名空间,文件名+类名=类所在路径
- 方法 spl_autoload_register(function($className){ include ---- })
- static方法
如果在类里定义static属性 就相当于const了一个类属性或者类方法 可以通过类名直接调用
代表类的对象的是this
代表类的本身的是self
后期绑定static方法 static绑定的都是后期子类,self绑定的是本身
- 魔术方法
__set($var,$val) 调用的时候只需要实例化对象 ,直接给私有变量赋值就可以比如
$实例化对象名->私有属性名=’新变量’
__get($var) 返回私有属性 调用举例$实例化对象名->私有属性名
__Isset($var) 判断私有属性是否已经存在 不存在返回ture
__unset($var) 删除一个私有属性的方法
__call($functionName,$val) 当调用的是实例化方法不存在时就会调用__call方法,避免程序抛错
__callStatic($staticFunctionName,$val) 当调用的静态方法不存在时会自动调用callStatic方法,避免程序抛错
__invoke($val) 把类方法当作函数调用的时候自动执行这个函数
__toString() 打印要输出的类对象时自动调用这个函数
__clone() 当调用clone关键字函数时会自动执行__clone()函数
- 对象复制
浅拷贝 php中对象的拷贝时浅拷贝,拷贝的物理地址,对物理地址的传递,这样修改其中一个其余的也跟着改变
若想深拷贝类对象,需要在传值时加上c lone 比如$b=clone$a;这样修改一个值其余的不变
深拷贝 php中处了对象之外的普通类型拷贝是深拷贝
- 类型约束
class test1{
public function test1(){
echo 'hello world!';
}
}
function test1(test1 $a){
$a->test1();
}
$test1=new models\test1();
models\test1($test1);
- Trait
由于php是单继承语言为了解决这一问题,引入trait关键字,trait相当于方法模板,类要应用的时候直接用use关键词比如use A/use A,B;
trait A{
public function A(){
echo'hello ';
}
}
trait B{
public function B(){
echo 'world ';
}
}
trait C{
use A,B;
}
class test3{
// use A,B;
use C;
}
- 接口
通俗讲接口是类的模板,类是对象的模板
接口中只写方法名,具体的实现方法由类来完成
我们学的是面向对象思维,但是叫面向接口思维更贴切
接口可以被继承但不能直接被实例化,接口可以多继承
类以此可以实现多个接口
关键词 interface
实现接口关键词implements
- 抽象类
抽象类类似接口但是抽象类中可以存在已经实现的方法,接口中只能由非实现的方法名
关键词abstract
类直接继承抽象类就可以,但是要实现抽象类中未实现的方法
- 单例工厂
防止被过多实例化占用空间,确保一个类只能实例化一次
class test5{
private static $_instance=NULL;
private function __construct(){
}
private function __clone(){
}
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance=new self();
}else {
return self::$_instance;
}
}
}
$test1=test5::getInstance();
$test2=test5::getInstance();
var_dump($test1);
var_dump($test2);
- 工厂模式
工厂模式应用于缓存类Memcache/Redis等缓存类的底层改变
class Memcache{
public $a=0;
public function set($a){
$this->a=$a;
}
public function get(){
return $this->a;
}
public function delete(){
unset($this->a);
}
}
class test6{
public static function factory(){
return new Memcache();
}
}