欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP面向对象(一)

程序员文章站 2022-06-29 08:02:25
1 面向对象介绍 1.1 介绍 ​ 面向对象是一个编思想. 编程思想有面向过程和面向对象. ​ 面向过程: 编程思路集中的是过程上 ​ 面向对象: 编程思路集中在参与的对象 1.2 好处 多人合作方便 减少代码冗余, 灵活性高 代码的可用性发挥到极致 可扩展性强 OOP: 面向对象编程 OOA: 面 ......

1 面向对象介绍

1.1 介绍

​ 面向对象是一个编思想. 编程思想有面向过程和面向对象.

​ 面向过程: 编程思路集中的是过程上

​ 面向对象: 编程思路集中在参与的对象

1.2 好处

  1. 多人合作方便

  2. 减少代码冗余, 灵活性高

  3. 代码的可用性发挥到极致

  4. 可扩展性强

    oop: 面向对象编程
    ooa: 面向对象分析
    ood: 面向对象设计 

1.2 类和对象

​ 1. 对象是具体存在的事物,对象是由属性(变量)和(方法)组成的

​ 2. 类是具体相同属性和行为的一组对象的集合

​ 在开发的时候,先写类, 通过类创建对象, 通过对象调用方法和属性

​ 一个类可以创建多个对象

 

2 在php中实现类和对象

2.1 创建类

class 类名{
    //属性
    //方法
    //常量
}
类是由属性,方法,常量组成的
_________________________________________________________________________    
<?php 
    calss student {
    };
 ?>

 

命名规则

  1. 以字母, 下划线开头, 后面跟的是字母, 数字, 下划线

    1. 不能用php关键字做类名

      1. 类名不区分大小写 (变量名区分, 关键字,类名不区分带小写). 类名用帕斯卡命名法 (大驼峰, 首字母大写)

2.2 对象实例化

​ 通过new关键字来实例化对象

<?php 
    // 定义类
    class student{
    }
    //实例化
    $stu1=new student();
    // 小括号可以省略
    $stu2=new student;

2.3 对象的比较

对象的传递是地址传递

​ 相等: 结构和保存的值一样就相等

​ 全等: 指向同一个对象才是全等

<?php  
    class stu{
​
    }
    $stu1=new stu;
    $stu2=new stu;
    // 对象传递的是地址
    $stu3=$stu2;
​
    //true
    var_dump($stu1==$stu2);
    //false
    var_dump($stu1===$stu2);
    //true
    var_dump($stu2===$stu3);

 

3 属性 & 方法 & 修饰符

3.1 属性

​ 属性本质就是变量

​ 通过->调用对象的成员 对象名 -> 属性名 对象名 -> 方法名()

<?php  
    // 定义类
    class stu {
        public $name;
        public $add='地址不详';
    }
    // 实例化对象
    $stu=new stu;
    $stu->name='tom';
    $stu->add='北京';
    // 获取属性的值
    echo '姓名:'.$stu->name,'<br>';
    echo '地址:'.$stu->add,'<br>';
    // 添加属性
    $stu->age=20;
    echo '年龄:'.$stu->age,'<br>';
    //删除属性
    unset($stu->add);
    print_r($stu);
?>
 
3.2 方法
​ 方法的本质就是函数
 
<?php  
    // 定义类
    class stu{
        public function show() {
            echo '这是show方法<br>';
        }
        function test(){
            echo '这是test方法<br>';
        }
    }
    // 调用方法
    $stu=new stu;
    $stu->show();
    $stu->test();
?>

 

  1. 方法前面的public是可以省略的, 如果省略, 默认是public

    1. 属性前面的public不能省略

3.3 修饰符

​ 用来控制成员的访问权限

修饰符 描述
public (公有的) 在类的内部和外部都能访问
private (私有的) 只能在类的内部访问
protected (受保护的) 在整个继承链*问

​ 一般来说,属性都用私有的,通过公有的方法对私有的属性进行赋值和取值

​ 作用: 保证数据的合法性

<?php  
    class stu{
        private $name;
        private $sex;
        function setinfo($name,$sex){
            if($sex!='男'&&$sex!='女'){
                echo '性别必须为男或女';
            exit;
        }
        $this->name=$name;
        $this->sex=$sex;
        }
        function getinfo(){
            echo '姓名: '.$this->name,'<br>';
            echo '性别: '.$this->sex,'<br>';
        }
    }
    $stu=new stu;
    $stu->setinfo('tom','男');
    $stu->getinfo();
    echo '<hr>';
    $stu1=new stu;
    $stu->setinfo('sunny','难啊难');
    $stu->getinfo();
?>

4 类和对象在内存中的分布

4.1 分布

  1. 对象的本质是一个复杂的变量

    1. 类的本质是一个自定义的复杂数据类型

      1. 展区: 运行速度快, 体积小, 保存基本类型

      2. 堆区: 运行速度稍慢, 体积大, 保存复杂类型

      3. 实例化的过程就是分配内存空间的过程

      4. 对象保存在堆区, 将堆区的地址保存到栈区

4.2 计算机的内存管理

​ 计算机内存管理方式: 先进先出, 先进后出

​ 先进先出的内存管理方式一般用在业务逻辑中, 比如秒杀, 购票等等

​ 先进后出是计算机的默认内存管理方式

 

5 构造方法 & 析构方法

5.1 介绍

​ 构造方法也叫构造函数, 当实例化对象的时候自动执行

<?php  
    // 前面是两个下划线
    function __construct(){
    }
___________________________________________________________________
    
    class stu{
        function __construct(){
            echo '这是构造方法<br>';
        }
    }
    new stu();
    new stu();
?>

​ 在其它语言中, 与类名同名的函数时构造函数, 在php中不允许这种写法

5.2 构造函数作用

​ 初始化成员变量

​ 构造函数可以带参数, 但不能有return

<?php  
    class stu{
        private $name;
        private $sex;
        function __construct($name,$sex){
            $this->name=$name;
            $this->sex=$sex;
        }
        function show(){
            echo "姓名: {$this->name}<br>";
            echo "性别: {$this->sex}<br>";
        }
    }
    $stu=new stu('wang','男');
    $stu->show();
?>

5.3 析构方法

​ 当对象销毁的时候自动调用

​ 析构函数不可以带参数

function __destruct(){
    }
______________________________________________________________
    
<?php  
    class stu{
        private $name;
        function __construct($name){
            $this->name=$name;
            echo "{$name}出生了<br>";
        }
        function __destruct(){
            echo "{$this->name}销毁了<br>";
        }
    }
    $stu1=new stu('tom');
    $stu2=new stu('wang');
    echo '<hr>';
?>

6 继承

6.1介绍

  1. 继承使得代码具有层次结构

    1. 子类继承父类的属性和方法, 实现代码的可重用性

      1. 使用extends关键字实现继承

      2. 父类和子类是相对的

class 子类 extends 父类{
}
____________________________________________________________
    
<?php  
    class person{
        function show(){
            echo '这是人类<br>';
        }
    }
    // 子类继承父类
    class stu extends person{
    }
    $stu=new stu;
    $stu->show();
?>    

执行过程

  1. 在stu类中查找show(), 如果找到就调用, 找不到就到父类中查找

    1. 在person类中查询show()

6.2 子类中调用父类成员

 
<?php  
    class person{
        function show(){
            echo '这是人类<br>';
        }
    }
    // 子类
    class stu extends person{
        function test(){
            // 方法一
            // $person=new person();
            // $person->show();
            
            // 方法二
            $this->show();
        }
    }
    $stu=new stu;
    $stu->test();
?>
  1. 通过实例化父类调用父类的成员

  2. 通过$this关键字调用父类的成员

6.3 protected

​ protected: 受保护的, 在整个继承链上使用

// 一
<?php  
    class a{
        protected $num=10;
    }
    class b extends a {
        function getnum(){
            echo $this->num;
        }
    }
    $obj=new b();
    $obj->getnum();
?>
______________________________________________________________________
    
//二
<?php  
    class a {
        function getnum(){
            echo $this->num;
        }
    }
    class b extends a {
        protected $num=10;
    }
    $obj=new b();
    $obj->getnum();
?>
______________________________________________________________________________
    
//三
<?php  
    class a {
        function getnum(){
            echo $this->num;
        }
    }
    class b extends a {
        protected $num=10;
    }
    //整个继承链上只有a
    $obj=new a();
    //报错: notice:undefined property: a::$num 
    $obj->getnum();
?>

 

6.4 继承中的构造函数

  1. 如果子类有构造函数就调用子类的, 如果子类没有就调用父类的构造函数

    1. 子类的构造函数调用后, 默认不再调用父类的构造函数

通过类名调用父类的构造函数

 
类名::__construct()
_______________________________________________________________________
    
    <?php  
    class person{
        public function __construct(){
            echo '这是父类<br>';
        }
    }
    class stu extends person{
        public function __construct(){
            person::__construct();
            parent::__construct();
            echo '这是子类<br>';          
        }
    }
    new stu();
?>

parent关键字表示父类的名字, 可以降低程序的耦合性

给父类传递参数

<?php  
    class person{
        protected $name;
        protected $sex;
        public function __construct($name,$sex){
            $this->name=$name;
            $this->sex=$sex;
        }
    }
    class stu extends person{
        private $score;
        public function __construct($name,$sex,$score){
            parent::__construct($name,$sex);
            $this->score=$score;
        }
    public function getinfo(){
        echo "姓名: {$this->name}<br>";
        echo "性别: {$this->sex}<br>";
        echo "成绩: {$this->score}<br>";
        }
    }
    $stu=new stu('wang','男',90);
    $stu->getinfo();
?>

 

6.5 $this详解

​ this表示当前对象的引用, 也就是this保存的当前对象的地址

<?php  
    class a{
        public function __construct(){
            var_dump($this);
        }
    }
    class b extends a {
    }
    new a();
    echo '<br>';
    new b();
?>

6.6 多重继承

​ php不允许多重继承, 因为多次继承容易产生二义性.

​ 如何实现c继承a和b, 使用继承链