面向对象(二)

========关键字======

一、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);
?>
原文地址:https://www.cnblogs.com/zhengleilei/p/9350599.html