前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP7-2: 面向对象开发

PHP7-2: 面向对象开发

作者头像
程序员海军
发布2021-10-11 11:10:20
5230
发布2021-10-11 11:10:20
举报
文章被收录于专栏:前端笔记ing前端笔记ing

PHP 语言是弱类型语言,学习过其他弱类型语言上手PHP也是不错的。 PHP 是面向对象语言, 和JAVA 挺像, 面向对象的思想都是一样的, 继承 接口 抽象类 静态属性 …… 语言都是互通的,语言只是实现的工具,学好面向对象对以后设计接口有很大的帮助,那么我们开始吧!

PHP 面向对象

静态属性 static
代码语言:javascript
复制
// 使用场景: 类的一些公用属性和方法,值有可能改变
// 如何访问 静态属性呢
// 通过  self::方法 或者 属性  , 就可以访问到类的静态属性

# 切记: 静态属性和方法只能类自己访问,不能实例对象访问。

<?php 
class People {

    protected static $className = '大三老学长';
    public function getClassName(){
        echo '他是'.self::$className;
        #他是大三老学长
    }
}
const 类常量定义使用
代码语言:javascript
复制
// 使用场景: 值不会变化时,使用
// 如何访问const 常量
// self::常量名字
<?php 
class Peole {
    const NAME = '海军';
    public function getName(){
        echo self::NAME;
    }
}

$hj = new Peole();
$hj->getName();
# 海军
禁止重写父类方法或者属性 final
代码语言:javascript
复制
//使用场景: 父类不想让子类重写自己的方法或者属性 时使用
# 使用  final 

<?php 
 # 父类
class Peole {
    const NAME = '海军';
    # 在 function 前加 final
    public  final function  getName(){
        echo self::NAME;
    }
}


# 子类
class Woman extends Peole {
    public function getName(){
        echo '子类不能重写父类';
    }
}


$woman = new Woman();
$woman->getName(); # 调用时,结果报错
抽象类抽象方法
代码语言:javascript
复制
// 使用场景:子类继承了父类, 并且必须实现父类的某些方法 时使用
# 格式:  abstract
# 注意:  类为抽象类时;不能实例化对象调用方法和属性,类本身也不能自身调用属性和方法。


<?php 
abstract class Peole {
    protected static $className = '大三老学长';
    //抽象方法
    abstract public function learn();
    public function getClassName(){
        echo '他是'.self::$className;
    }

}


class Woman extends Peole {
    public function getName(){
        echo '子类不能重写父类';
    }

    public function learn(){
        echo '有阅读的能力';
    }
}


// 类为抽象类时不能实例化对象,也不能自己调用自己
// $hj = new Peole();
// $hj->getName();
// echo "<hr/>";
// $hj->getClassName();


class Woman extends Peole {
    public function getName(){
        echo '子类不能重写父类';
    }

    public function learn(){
        echo '有阅读的能力';
    }
}

$woman = new Woman();
$woman->getName();
$woman->learn();
变相多继承 Trait 使用
代码语言:javascript
复制
//使用场景: 当类需要继承多个基类时采用,(PHP以前一直是单继承)
// 格式: 
#trait 变量名{}     类中使用trait:  use  变量名


# 1.基本使用
<?php 

trait Student {
    public $name = '姓名';
    public function getNames(){
        echo __METHOD__;
    }
}

class School {
    use Student;
}

$smallSchool = new School();
echo $smallSchool->name;
$smallSchool->getNames();
Trait 优先级
代码语言:javascript
复制
# 2.优先级问题,
    #2.1父类和基类有同样的方法,调用访问时会访问父类的方法
    #2.2子类继承了父类,也使用了trait,调取同样的方法时,优先采      用trait的方法
<?php 

trait Student {
    public $name = '姓名';
    public function getNames(){
        echo '我是 trait';
    }
}



class School  {
    use Student;
    public function getNames(){
        echo '我是 School';
    }
}


class Teacher extends School {
    use Student;
}

$teacher  = new Teacher();
$teacher->getNames();
// 结果为: 我是 trait  
//  当子类继承了父类, 父类和trait 有同样的方法, 子类实例对象调用同样方法名时,优先采用trait的方法
解决Trait 方法冲突 insteadOf as
代码语言:javascript
复制
// 应用场景:  当多个trait时,可能会有同名的方法,类的实例对象调用时,就会冲突;
# 解决办法:  1.insteadOf  2. as

# use 变量1,变量2{
#        变量1:: getNames insteadOf 变量2;  
        // 解释: 变量1的getNames 方法替代了 变量2
#        Patriarch:: getNames as getToName;
        // 解释: 将变量2的方法通过 as 别名,调用
#    }

<?php 

trait Student {
    public $name = '姓名';
    public function getNames(){
        echo '我是 Student';
    }
}
trait Patriarch {

    public function getNames(){
        echo '我是 Patriarch';
    }
}




class School  {
    use Student,Patriarch{
        Student:: getNames insteadOf Patriarch;
        Patriarch:: getNames as getToName;
    }
    public function getNames(){
        echo '我是 School';
    }
}

$school = new School();
$school->getNames();  //我是 School
echo "<hr/>";
$school->getToName();
echo "<hr/>";   //我是 Patriarch
Trait 访问控制 protected
代码语言:javascript
复制
trait Patriarch {

    protected function getNames(){
        echo '我是 Patriarch';
    }
}

class School  {
    use Patriarch{
        Patriarch:: getNames as getToName;
    }
}

$school = new School();
$school->getToName();   //访问就会报错,受保护的
Trait 使用情况
  • Trait 中可以使用 abstract 方法
  • Trati 中可以使用 静态方法

魔术方法

所谓魔术方法,它就是PHP 中提供了一些函数,在某些时刻自动调用,处理一些逻辑,执行时间不同。 类似于 生命周期, 钩子函数。

construct 构造函数
代码语言:javascript
复制
<?php

class Girl{
    private $name;
    public function __construct(String $names)
    {
        echo $this->name = $names;
    }
}

new Girl('小红');
_set and _get
代码语言:javascript
复制
// 使用场景: 一般类的属性或者方法为私有或者受保护的,这样类的实例是不能直接访问和修改的,想访问类的这些属性就得使用  _set   _get 方法, 当访问私有属性或者方法时,会自动调用_set  and  _get 方法中的内容。

# 格式:  set 有两个参数    get有一个参数
 public function __get($names)
    {
        echo '获取私有和受保护的属性时,自动调用';
        return $this->$names;
    }

    public function __set($name, $value)
    {
        echo '设置私有和受保护的属性时,自动调用------';
        $this->$name = $value;
    }


# 注意: 如果类中没有创建这两个函数 _set  _get ,在访问私有属性 方法和受保护属性方法就会警告。


#完整代码

<?php 
class Car {
    private $price = '$9w';
    private $name = '奥迪';
    public $place = '美国';

    public function __get($names)
    {
        echo '获取私有和受保护的属性时,自动调用';
        return $this->$names;
    }

    public function __set($name, $value)
    {
        echo '设置私有和受保护的属性时,自动调用------';
        $this->$name = $value;
    }
}

$car = new Car();
echo '<hr/>';
echo $car->name;
echo '<hr/>';
echo $car->place;
echo '<hr/>';
$car->prive = '22$';
echo $car->price;

# 输出内容
获取私有和受保护的属性时,自动调用奥迪
美国
设置私有和受保护的属性时,自动调用------获取私有和受保护的属性时,自动调用22$
_call
代码语言:javascript
复制
//使用场景:  当调用了类中不存在的方法时,程序会停止运行,为了防止 误调用,程序断开,使用_call 来处理此情况
# 格式
 __call($functionName, $arg)  参数1为方法名   参数2 为传递参数


# 完整代码
<?php 
class Car {

    public function __call($functionName, $arg)
    {
        echo '类中没有该函数,函数名为:'.$functionName;
        echo '<hr/>';
        print_r($arg);

    }
}

$car = new Car();
$car->run(1,2,3,4);  //类中没有该函数,函数名为:run  Array ([0] => 1[1] => 2[2] => 3[3] => 4 ) 
__callStatic
代码语言:javascript
复制
//使用场景:  __callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。

# 格式
 __callStatic($functionName, $arg)  参数1为方法名   参数2 为传递参数

#完整代码
<?php 
class Car {

    public function __call($functionName, $arg)
    {
        echo '调用函数名为'.$functionName;
        echo '<hr/>';
        print_r($arg);

    }

    public static function __callStatic($name, $arguments)
    {

        switch ($name) {
            case 'fly':
                echo 'Fly : ------->   通过switch 来判断执行不同的业务逻辑';
            break;
            default:
                echo '您访问的静态方法类没有';
        }
    }
}

Car::fly();//Fly : -------> 通过switch 来判断执行不同的业务逻辑
echo '<hr/>';
Car::eat();//您访问的静态方法类没有

以上是PHP7的 基础语法,通过本章的学习,可以对PHP有大体的认识。本章有的语法没有介绍到,学习过其他语言的话,很快会上手的。

更新详细的语法 可以去PHP 官方获取:https://www.php.net/manual/zh/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端自学社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PHP 面向对象
    • 静态属性 static
      • const 类常量定义使用
        • 禁止重写父类方法或者属性 final
          • 抽象类抽象方法
            • 变相多继承 Trait 使用
              • Trait 优先级
              • 解决Trait 方法冲突 insteadOf as
              • Trait 访问控制 protected
              • Trait 使用情况
              • construct 构造函数
              • _set and _get
              • _call
              • __callStatic
          • 魔术方法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档