PHP面向对象

208 阅读3分钟

面向对象

一、什么是面向对象

面向对象是一种编程思想,是相对面向过程来说的,之前的编程都是面向过程的,面向过程的编程都是采用程序调用或者函数调用的方式进行流程控制,但是每个函数都是为了完成特定功能,不易维护,不易复用,不易扩展,而在上世纪81年代,由于C的扩展语言c++的出现,面向对象程序设计成为主导思想,面向对象弥补了面向过程编程的缺点,使程序拥有很强的可扩展性,可复用性,可维护性,现在,大部分编程语言都是面向对象,像c++语
言,Java语言,php语言等。
面向对象编程有三大特性,包括封装,继承,多态,而不同的语言对于三大特性又略有不同的解释,php中的面向对象有与其他语言相似的地方,也有属于自身的独特方法。

二、PHP面向对象三大特性

1 封装
面向对象的封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
calss Human{
    public $name;
    protected $age;
    private $job;
    
    public function speak(){
        echo "我可以说话";
    }
    
    public function eating(){
        echo "我可以吃东西";
    }
}
以上就是一个封装好的类,该类的类名为Human,PHP中类名的首字母应该大写,类中的变量称为类属性或类成员变量,类中的函数称为类方法或者类成员方法,我们可以通过关键字去设置类成员的访问权限
权限有三种,public公有权限,使用该关键字声明的属性或方法,可以随意的访问,protected关键字是保护权限,该权限下,声明的属性和方法只能在类内和类的子类可以访问,private关键字声明的是私有权限,仅有类内可以访问,其他允许访问。
三种访问权限的比较
/* 类内 子类 类内
public yes yes yes
protected yes yes no
private yes no no
在类中,我们可以通过$this来反问类中的成员属性和成员方法
    public $name;
    protected $age;
    private $job;
    
    public function speak(){
        echo $this->name."我可以说话"."<br>";
    }
    
    public function eating(){
        echo "我可以吃东西"."<br>"$this->speak();
    }
类是对现实事物的一个抽象,类属性描述了事物具备的特征,描述事物长什么样子,类方法描述了事物的功能,描述事物能干些什么事情,我们可以通过new关键字实例化一个对象
$man = new Human();
通过对象调用类的属性和方法
$man->speak(); //类方法调用
$man->$name;   //类属性调用
当使用对象调用类的保护属性或者私有属性时
$man->$age;
$man->$job;
此时程序会报错,第一条错误是,你没有权限调用受保护的属性,第二条是,你没有权限调用私有属性,那么当我们需要时使用类内的私有或者受保护的属性时,怎么办呢?
当然是有办法的,我们可以通过公有函数去调用类内的私有属性,我们再通过调用公有的方法,就可以获取到想要的私有属性
    public $name;
    protected $age;
    private $job;
    
    public function speak(){
        echo $this->name."我可以说话"."<br>";
    }
    
    public function eating(){
        echo "我可以吃东西"."<br>"$this->speak();
    }
    
    public function get(){
        return $this->age;
        return $this->job;
    }
$man = new Human('小明','18','worker');
echo $man->get();
执行之后,程序运行正常,会打印出 "18" 和 "worker" ,就是我们想要的受保护的,和私有的属性
魔术方法
魔术方法是php独有的,其他编程语言没有的,封装好的一些具有固定功能的方法
魔术方法特点
    1. php面向对象中,多余的魔术方法 __下划线开头
    2. php魔术方法在满足某种特定条件下,将会自动调用

__construct 与 __destruct
__construct是PHP中构造函数,在实例化时,会自动调用,用于初始化对象
class Person{
    public $name;
    function __construct($name)
    {
        echo "我是初始化函数,实例化时,会自动调用";
        $this->name = $name;
    }
}
代码实现了对name属性的初始化操作,使name属性有了一个初始值,实例化对象时,构造函数就会执行,为name属性赋值
 __destruct是PHP中析构函数,用于在程序结束时,销毁对象
class Person{
    public $name;
    function __construct($name)
    {
        echo "我是初始化函数,实例化时,会自动调用";
        $this->name = $name;
    }
        public function __destruct()
    {
        echo $this->name.'我是对象被销毁前自动来调用的<br>';
    }
}
运行程序,会在程序的最后执行输出 "我是对象被销毁前自动来调用的",析构函数也是自动调用,但是我们也可以控制析构函数的执行时机,
$p = new Person('张三');
$p = null;
$p->name;
执行程序,系统会报错,因为此时,$p = null 会触发析构函数,$p对象已经被销毁,所以$p->name会报错,这就是PHP中析构函数

__set 与 __get
class Person{
    public $name; //公有
    protected $age;//受保护的
    private $money; //私有的
    
   function __set($k, $v)
   {
       $this->$k = $v;
   }
   function __get($name)
   {
       echo $this->$name;
   }
}
$p = new Person();
$p->age = 18;  //设置保护属性
$p->money = '1000';  //设置私有属性
echo "<hr>";
echo $p->age; //获取保护属性
echo $p-?money; //获取私有属性
__isset 和 __unset
class Person{
    public $name = '小明';
    public $abc = 'abc';
    protected $age = 18;
    protected $sex = '男';
    public function __isset($name)
    {
        if(isset($this->$name)){ //$this->age
            return true;
        }else{
            return false;
        }
    }
    public function __unset($name)
    {
        echo "???$";
    }

}
echo '<hr>';
//在类外判断类内的属性是否存在
$p = new Person();
var_dump(isset($p->name));
var_dump(isset($p->abc));
echo '<hr>';
var_dump(isset($p->age));
unset($p->age);
当检查类内属性是否存在时,会自动调用__isset方法,当销毁内类的属性时,会自动调用__unset方法
魔术方法,给我带来了很大的便利,省去了我们自己编写的麻烦。
2 继承
继承是三大特性中的第二个,继承的主要作用是,提高了代码的复用性,子类通过extends关键字就可以继承父类的全部属性和方法
 //父类
class Person{
    public $name = '张三'; //公有
    protected $age = 18; //受保护
    private $money = 100; //私有

    public function speak(){
        return 'i can speak'.' 我的年龄是:'.$this->age.' 我的money是'.$this->money;
    }
}
//子类
class Teacher extends Person {
    public  $sex = '男';
    public function run(){
        return 'i can run'.'我的年龄是'.$this->age.'我的money是'.$this->money;
    }
}
Teacher类是Person类的子类,子类拥有父类的全部属性和方法,通过Teacher实例化的对象,就可以调用
Person类中的属性和方法
$t = new Teacher();
echo $t->speak();  //输出:i can speak 我的年龄是:18 我的money是100