========关键字======
一、const 类常量(修饰属性)
<?php header("Content-type: text/html; charset=utf-8"); class Person{ private $name; const HOST = 'localhost';//定义常量,最好是大写,前面没有$符号 public function __construct($name='',$age=18){ $this->name = $name; $this->age = $age; } public function say(){ echo "my name is {$this->name}"; } } $p1 = new Person("lisi",25); $p1->say(); echo Person::HOST;//类常量是属于类的,不能用对象调用,只能用类调用 ?>
二、static 静态成员(修饰属性和方法)
1、静态属性和方法,在加载类的时候就分配空间,所以不需要实例化就可以直接访问
2、静态成员在内存中就一份,是属于类的,所以调用方法是 类::成员
3、静态方法是不能访问普通变量和方法,只能访问静态成员。因为静态方法是在加载类的时候就分配空间,
普通变量是在实例化对象的时候,才分配空间
三、final 最终版本(修饰类和方法)
final class Person{//定义了final关键字,该类不能被继承 private $name; public function say(){ echo "my name is {$this->name}"; } } class Tt extends Person{//报错,不能继承 } // ---------------------------------------- class Person1{ private $name; final public function say(){//定义了final关键字,该方法不能被重写或继承 echo "my name is {$this->name}"; } } class Tt extends Person{ public function say(){//报错,不能继承或重写 } }
==========设计模式=========
一、单例模式
一个类只有一个对象
三私一公:
(1)、私有的变量,用来接受内部造出的对象
(2)、私有的构造函数,用来防止外部实例化对象
(3)、私有的克隆方法,防止外部克隆
(4)、公有的方法:用来获得内部造出的对象
class Person{ private static $obj; private function __construct(){//私有化的构造函数的作用是,阻止类的外部实例化 } private function __clone(){//私有化的__clone()阻止外部克隆 } public static function getObj(){//由于静态方法只能访问静态变量,所以要把上面的$obj设为静态 if(self::$obj instanceof self){//判断变量是否已经被实例化,如果已经被实例化,则直接返回 self::$obj = new self; }else{ return self::$obj; } } }
二、工厂模式
通过传递不同的参数,获得不同的对象
abstract class Product{ abstract public function getName(); } class ProductA extends Product{ public function getName(){ echo "这是A商品<br>"; } } class ProductB extends Product{ public function getName(){ echo "这是B商品<br>"; } } class ProductFactory{ public static function create($num){ switch($num){ case 1: return new ProductA; break; case 2: return new ProductA; break; } return null; } } $objA = ProductFactory::create(1); $objA->getName(); $objB = ProductFactory::create(2); $objB->getName();
==========魔术方法==========
一、__construct:构造方法
二、__destruct:析构方法
三、__toString:对对象的说明
class Person{ public $name; public $age; public function __construct($name='',$age=18){ $this->name = $name; $this->age = $age; } public function test(){ echo "Person->test()"; } public function __toString(){ return "this is a object"; } } $p1 = new Person("lisi",25); echo $p1;
四、__call:当调用不存在或无权访问的方法时,会自动调用该方法
<?php header("Content-type: text/html; charset=utf-8"); class Person{ public $name; public $age; public function __construct($name='',$age=18){ $this->name = $name; $this->age = $age; } public function test(){ echo "Person->test()"; } public function __call($i,$j){//__call()方法必须提供两个参数 echo "你访问的方法不存在"; } } $p1 = new Person("lisi",25); $p1->say();//say()方法不存在,所以在调用的时候会报错,为了防止报错,在类中加__call()方法,当调用不存在的方法时,会自动调用该方法 ?>
五、__get:当调用无权访问的属性时,自动调用该方法
class Person{ private $name; public $age; public function __construct($name='',$age=18){ $this->name = $name; $this->age = $age; } public function test(){ echo "Person->test()"; } public function __get($i){ echo "你无权访问$i"; } } $p1 = new Person("lisi",25); $p1->name;
六、__set:类中某属性,对象无权访问或操作时,自动调用该方法
<?php header("Content-type: text/html; charset=utf-8"); class Person{ private $name; public $age; public function __construct($name='',$age=18){ $this->name = $name; $this->age = $age; } public function test(){ echo "Person->test()"; } public function __get($i){ echo "你无权访问$i"; } public function __set($i,$j){ echo "你无权设置{$i}为{$j}"; } } $p1 = new Person("lisi",25); $p1->name; $p1->name = "zhangsan"; ?>
七、__isset:当用isset()判断一个属性或方法存在与否时,自动触发__isset()
<?php header("Content-type: text/html; charset=utf-8"); class Person{ private $name; public $age; public function __construct($name='',$age=18){ $this->name = $name; $this->age = $age; } public function test(){ echo "Person->test()"; } public function __isset($i){ echo "你无权测试$i是否存在"; } } $p1 = new Person("lisi",25); $pp = isset($p1->name); var_dump($pp); ?>
八、__unset:当用unset()删除一个属性或方法时,自动触发__unset()
<?php header("Content-type: text/html; charset=utf-8"); class Person{ private $name; public $age; public function __construct($name='',$age=18){ $this->name = $name; $this->age = $age; } public function test(){ echo "Person->test()"; } public function __unset($i){ echo "你无权删除{$i}"; } } $p1 = new Person("lisi",25); unset($p1->name); ?>