PHP学习(四)面向对象

179 阅读2分钟

一、软件工程学

分为结构化方法(按软件周期分为三个阶段 分析、设计、编程)和面向对象。

二、面向对象

OOP(Object-Oriented Programming,面向对象的编程)。

3个目标

重用性、灵活性、扩展性

特点

封装、继承、多态

面向对象的三个主要特征:

  • 对象的行为
  • 对象的状态
  • 对象的标识

三、最简单的类

<?php

/*
 *  类的声明
 * */

class Person
{
    public $age;

    public function say($word)
    {
        echo "she say$word";
    }

    public function info()
    {
        $this->say("Hi");
        return $this->age;
    }
}

$xiaoHong = new Person();
$xiaoHong->age = 22;
$age = $xiaoHong->info();
echo "<br/>";
echo $age;

?>

四、构造方法和析构方法

<?php

/*
 *  本 demo 为了测试构造方法和析构方法
 * */

class Person
{
    public function __construct($name, $age)
    {
        // 当这个类 new 的时候自动执行
        echo 'hello' . $name;
        echo "<hr/>";
        $this->name = $name;
        $this->age = $age;
    }

    public function data()
    {
        return $this->age;
    }

    public function __destruct()
    {
        // 可以进行资源的释放操作 数据库关闭
        // 对象被销毁的时候执行 没有代码再去运行了
        echo "bye bye {$this->name}";
        echo "<br/>";
    }
}

new Person("first", 30);
new Person("second", 30);

?>

PS:给我的感觉就是生命周期

五、封装

class Person
{
    public $name;
    private $age;
    protected $money;

    public function __construct($name, $age, $money)
    {
        $this->name = $name;
        $this->age = $age;
        $this->money = $money;
    }

    public function getName()
    {
        echo $this->name;
    }

    private function getAge()
    {
        return $this->age;
    }

    protected function getMoney()
    {
        return $this->money;
    }

    public function card()
    {
        echo "name:" . $this->getName() . ">>>>>>>>>>>>>>" . "age:" . $this->getAge() . ">>>>>>>>>>>>>>" . "money:" . $this->getMoney();
        return "haha";
    }

    public function __set($name, $value)
    {
        if ($name == "age" && $value == "50") {
            $this->age = 40;
        }
    }

    public function __get($name)
    {
        if ($name=="money"){
            return "我不告诉你~";
        }
    }

    public function __isset($name)
    {
        if ($name=="money"){
            return "钱不和你说";
        }
    }

    public function __unset($name)
    {
        if ($name=="money"){
            unset($this->money);
        }
    }
}


$xiaoHei = new Person("first", 30, 2000);
$xiaoHei->age=50;

echo $xiaoHei->card();
echo $xiaoHei->money;

var_dump(isset($xiaoHei->money)); // 要是类里面不写 __isset方法 为 false; 否则为true
unset($xiaoHei->money);
echo $xiaoHei->card();

PS:魔术方法只对私有变量和受保护的变量有效

六、继承和重写

<?php
class Person
{
    public $name;
    private $age; // 无法继承
    protected $money; // 可以继承但是外部不可读

    function __construct($name, $age, $money)
    {
        $this->name = $name;
        $this->age = $age;
        $this->money = $money;
    }

    public function info($pp)
    {
        echo "name:" . $this->name . "<br/>";
        echo "age:" . $this->age . "<br/>";
        echo "money:" . $this->money . "<br/>";
    }

}

class Yellow extends Person
{
    function __construct($name, $age, $money)
    {
        parent::__construct($name, $age, $money);
    }

    public function info($pp) // 在重写的时候,父类中方法的参数必须和子类一致,就是要兼容的意思。否则会报错。
    {
        parent::info("aa");
        echo $pp;
    }
}

$s = new Yellow("xiaobai", 23, 20000);
$s->info(123);
/**
    name:xiaobai
    age:23
    money:20000
    123
 * */
?>

七、抽象类

  1. 含有抽象方法的类必须是抽象类
  2. 抽象类不一定非得有抽象方法
  3. 抽象类可以存在普通方法
  4. 抽象类一定不能被实例化,必须有一个子类去继承,并且把抽象类的方法都实现了
abstract class Person
{
    // 抽象类没有实体
    public abstract function eat();
}

class Man extends Person{
    public function eat(){
        echo "eat";
    }
}
$man = new Man();
$man->eat();

八、接口

  1. 接口声明的关键字是 interface
  2. 接口可以声明常量也可以抽象方法
  3. 接口中的方法都是抽象法法 不用 abstract 去人肉的定义
  4. 接口不能被实例化 需要一个类去实现它
  5. 一个类不能继承多个类 一个类可以实现多个接口
interface Person
{
    const NAME = "xiaoBai";

    public function run();

    public function eat();
}

interface Study
{
    public function study();
}

class Student implements Person, Study
{
    const data = 3.14;

    public function run()
    {
        echo "run";
    }

    public function eat()
    {
        echo "eat";
    }

    public function study()
    {
        echo "study";
    }

    public static function test()
    {
        echo self::data;
    }
}

$xb = new Student();
$xb->study();
echo $xb::NAME; // xiaoBai
echo $xb->test(); // 3.14
echo Student::data; //3.14