美文网首页
如何在线学习PHP开发(五)面向对象

如何在线学习PHP开发(五)面向对象

作者: 简简天天 | 来源:发表于2020-04-03 13:03 被阅读0次

面向对象编程的基本概念

image.png
image.png
image.png

类和对象的关系

image.png
  • 类的概念


    image.png
  • 对象的概念


    image.png
  • 类和对象的关系


    image.png

类的声明和对象的创建

image.png
  • 如何声明一个类


    image.png
  • 如何创建一个对象


    image.png
    image.png

类的属性和方法

image.png
  • 属性的定义


    image.png
  • 方法的定义


    image.png
  • 属性和方法的访问


    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

对象的比较

image.png
  • 不使用命名空间


    image.png
  • 使用命名空间


    image.png
    image.png
    image.png

构造方法

image.png
image.png
  • 构造方法的声明


    image.png
    image.png
    image.png
image.png

析构函数与PHP的垃圾回收机制

image.png
  • 析构函数


    image.png
  • 垃圾回收


    image.png
class Person{
    public function __construct()
    {
        echo '有新对象创建了<br/>';
    }
    public function __destruct()
    {
        echo '对象被销毁了<br/>';
    }
}
$person = new Person();
echo xdebug_debug_zval('person');
//unset($person); // 显示销毁$person指向的Person对象
$person = 10; // 赋值也可以销魂Person对象
echo xdebug_debug_zval('person');
echo '<hr/>';
image.png
<?php
class Person{
    public function __construct()
    {
        echo '有新对象创建了<br/>';
    }
    public function __destruct()
    {
        echo '对象被销毁了<br/>';
    }
}
$p1 = new Person();
echo xdebug_debug_zval('p1');
$p2 = $p1;
echo xdebug_debug_zval('p1');
unset($p1);
echo xdebug_debug_zval('p2');
echo '<hr/>';
image.png
<?php
class Person{
    public function __construct()
    {
        echo '有新对象创建了<br/>';
    }
    public function __destruct()
    {
        echo '有对象被销毁了<br/>';
    }
}
/**
 * 有多少个对象创建就有多少个对象销毁
 */
$p1 = new Person();
$p2 = new Person();
$p3 = new Person();

$p1=$p2=$p3=new Person();// 只有一个对象创建和销毁

image.png
<?php
class Person{
    public function __construct()
    {
        echo '有新对象创建了<br/>';
    }
    public function __destruct()
    {
        echo '有对象被销毁了<br/>';
    }
}

$p1[] = new Person();
echo xdebug_debug_zval('p1');
$p1[] = &$p1;
echo xdebug_debug_zval('p1');
unset($p);
echo xdebug_debug_zval('p1');
echo '<hr/>';
image.png

面向对象和面向过程实例的对比

  • 面向过程的


    image.png
    image.png
    image.png
  • 面向对象的
<?php
class User{
    public $userInfo = array();//用户信息
    public $userName = '';//可查询的用户名

    /**
     * 构造方法
     * User constructor.
     * @param $userName string 用户名
     */
    public function __construct($userName)
    {
        $this->userName = $userName;
    }

    /**
     * 获取用户信息
     * @return array 用户信息
     */
    public function getUserInfo(){
        // 1.连接数据库,mysqli_connect 返回的是一个数据库连接句柄,如果连接失败,返回false并输出相关错误信息
        $link = mysqli_connect('localhost','root','123456', 'test');
        if(!$link){
            die('数据库连接失败,错误代码:'.mysqli_connect_errno().'错误信息:'.mysqli_connect_error().'<br/>');
        }
        $sql = "select * from test where name='{$this->userName}'";
        $result = mysqli_query($link, $sql);
        $this->userInfo = mysqli_fetch_array($result);
        return $this->userInfo;
    }
}

$user= new User('lxy');
$userInfo = $user->getUserInfo();
print_r($userInfo);

面向对象三大特征之封装

image.png
image.png
image.png
image.png
image.png
image.png

面向对象编程三大特性之继承

image.png
image.png
image.png
  • 普通方式
<?php
// 普通方式描述三个类Animal、Dog、Cat
class Animal
{
    public $name = 'Animal';

    public function shout()
    {
        echo '动物叫';

    }
}
class Dog{
    public $name = 'Dog';
    public $owner = 'D';
    public function shout(){
        echo '狗叫';
    }
    public function swim(){
        echo '狗游泳';
    }
}
class Cat{
    public $name = 'Cat';
    public $owner = 'C';
    public function shout(){
        echo '猫叫';
    }
    public function eatFish(){
        echo '猫吃鱼';
    }
}
$dog = new Dog();
echo $dog->name;
echo $dog->shout();
  • 继承方式
<?php
// 继承
class Animal
{
    public $name = 'Animal';

    public function shout()
    {
        echo '动物叫';

    }
}
class Dog extends Animal {
    public $owner = 'D';
    // 重写
    public function shout()
    {
        echo '狗叫';

    }
    public function swim(){
        echo '狗游泳';
    }
}

$dog = new Dog();
echo $dog->name;
echo $dog->owner;
echo $dog->shout();
echo $dog->swim();
image.png
image.png

访问控制修饰符

image.png

方法重载和方法重写

image.png
image.png
<?php
// PHP模拟JAVA的方法重载
class Person
{

    public function test()
    {
        echo 'Person->test()<br/>';
        echo '参数个数:'.func_num_args();//获取方法调用时的参数个数
        print_r(func_get_args());//获取方法调用时的参数值
        $args = func_num_args();
        $args_arr = func_get_args();
        switch($args){
            case 0:
                echo '这是没有参数调用<br/>';
                break;
            case 1:
                echo '这是有1个参数的调用<br/>';
                break;
            case 2:
                echo '这是有两个参数的调用<br/>';
                break;
            default:
                echo '未定义的参数调用方式<br/>';
                break;

        }
    }

    /**
     * 在JAVA中实现方法重载
     * @param $a
     * @param $b
     */
 /*   public function test($a,$b){


    }*/
}
$a = new Person();
$a->test(); // Person->test()
$a->test('我叫a');// Person->test()
image.png
<?php
// PHP模拟JAVA的方法重载
class Person
{
    public $name;
    public function __construct($name='a')
    {
        $this->name=$name;
    }

    public function test()
    {
        echo '我是父类的test方法<br/>';

    }

}
class Stu extends Person{
    public $age;
    function  __construct($name = 'a', $age = 22)
    {
            $this->name = $name;
            $this->age = $age;
    }
    public function test()
    {
        echo '我是Stu里的test方法<br/>';

    }
}
$b = new Stu('b',22);
echo $b->test();

this关键词

image.png
image.png
image.png
image.png
  • 实例


    image.png
<?php

class Person
{
    private $work_year = 0; // 工龄
    private $salary; // 工资

    /**
     * 获取工龄
     * @return int
     */
    public function getWorkYear()
    {
        return $this->work_year;
    }

    public function setWorkerYear($year = 0)
    {
        $this->work_year = $year;
    }

    /**
     * 获取工资
     * @return int
     */
    public function getSalary()
    {
        // 通过工资工龄的对应关系计算工资
        $payoff = new PayOff();
        // 通过发工资类的一个方法计算工资
        // 谁调用获取工资的方法,$this指向谁
        $this->salary = $payoff->pay($this);
        return $this->salary;
    }

}

/**
 * 工资和工龄对应关系类
 * Class PayOff
 */
class PayOff {
    public function pay(Person $person){
        $salary = 0;
        $year = $person->getWorkYear();
        if($year<=1){
            $salary=1000;
        }elseif($year>1 && $year<3){
            $salary = 2000;
        }elseif($year>=3){
            $salary = 3000;
        }
        return $salary;
    }
}
$a = new Person();
echo '工龄:'.$a->getWorkYear().'工资是:'.$a->getSalary();
$a->setWorkerYear(10);
echo '工龄:'.$a->getWorkYear().'工资是:'.$a->getSalary();

self与parent

image.png
  • self关键词及用法


    image.png
<?php

class Person{
    public $name = 'A';
    public static $age = 22; //static修饰的是静态属性
    public $self = null;
    public function  intro(){
        echo 'My name is'.$this->name.'<br/>';
        // 静态属性必须使用类名调用
        echo 'My age is'. self::$age;
        echo 'My age is'.self::getAge();
        $this->self = new self(); // 相当于new Person()
    }
    public static function getAge(){
        return self::$age;
    }
}
$a = new Person();
$a->intro();
  • parent关键词及用法


    image.png
    image.png
    image.png
    image.png
    image.png
image.png

相关文章

网友评论

      本文标题:如何在线学习PHP开发(五)面向对象

      本文链接:https://www.haomeiwen.com/subject/xzlxphtx.html