• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】

    本文实例讲述了PHP学习记录之面向对象(Object-oriented programming,OOP)基础。分享给大家供大家参考,具体如下:

    在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象,然而在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等,我们来看下对象的三个主要特征:

    举个栗子,比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态,来看张图片感受下:

    来看下面向对象的主要内容:

    接下来,咱们通过通过 Car 类 创建了三个对象,Mercedes, Bmw, 和 Audi ,看下代码:

    $mercedes = new Car ();
    $bmw = new Car ();
    $audi = new Car ();
    
    

    看了代码是不是一脸懵,不要紧,咱们看下图片感受下:

    到了这里呢,咱们对于对象有了一个简单的认知了已经,接下来咱们就看下这个类,PHP 定义类通常语法格式如下:

    ?php
    class phpClass {
     var $var1;
     var $var2 = "constant string";
     function myfunc ($arg1, $arg2) {
       [..]
     }
     [..]
    }
    ?>
    
    

    来看下文字解析:

    来看下实例:

    ?php
    class Site {
     /* 成员变量 */
     var $url;
     var $title;
     /* 成员函数 */
     function setUrl($par){
       $this->url = $par;
     }
     function getUrl(){
       echo $this->url . PHP_EOL;
     }
     function setTitle($par){
       $this->title = $par;
     }
     function getTitle(){
       echo $this->title . PHP_EOL;
     }
    }
    ?>
    
    

    当类创建后,我们可以使用 new 运算符来实例化该类的对象,如下:

    $luyaran = new Site;
    $cuijinpeng = new Site;
    
    

    通过以上代码,我们已经创建了两个对象,并且两个对象各自都是独立的,接下来我们来看看如何访问成员方法与成员变量。

    首先,在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量,如下:

    // 调用成员函数,设置标题和URL
    $luyaran->setTitle( "luyaran" );
    $cuijinpeng->setTitle( "cuijinpeng" );
    $luyaran->setUrl( 'www.luyaran.com' );
    $cuijinpeng->setUrl( 'www.cuijinpeng.com' );
    // 调用成员函数,获取标题和URL
    $luyaran->getTitle();
    $cuijinpeng->getTitle();
    $luyaran->getUrl();
    $cuijinpeng->getUrl();
    
    

    咱们接下来就要继续完善咱们刚刚创建的类了。

    先来看构造函数,它是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。PHP 5 允许开发者在一个类中定义一个方法作为构造函数,语法格式如下:

    void __construct ([ mixed $args [, $... ]] )
    

    接下来我们来通过构造方法来初始化 $url 和 $title 变量,以晚上Site类,如下:

    function __construct( $par1, $par2 ) {
      $this->url = $par1;
      $this->title = $par2;
    }
    
    

    到了这里呢,我们如果要设置url和title值,就不需要再调用 setTitle 和 setUrl 方法了,具体设置方法如下:

    $luyaran = new Site('www.luyaran.com', 'luyaran');
    $cuijinpeng = new Site('www.cuijinpeng.com', 'cuijinpeng');
    // 调用成员函数,获取标题和URL
    $luyaran->getTitle();
    $cuijinpeng->getTitle();
    $google->getTitle();
    $luyaran->getUrl();
    $cuijinpeng->getUrl(); 
    
    

    完事来看析构函数(destructor),它与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:

    void __destruct ( void )
    
    

    来看实例:

    ?php
    class MyDestructableClass {
      function __construct() {
        print "构造函数\n";
        $this->name = "MyDestructableClass";
      }
      function __destruct() {
        print "销毁 " . $this->name . "\n";
      }
    }
    $obj = new MyDestructableClass();
    ?>
    
    

    输出结果为:

    构造函数
    销毁 MyDestructableClass

    咱们接下来就来看下类的继承。

    PHP 使用关键字 extends 来继承一个类,但是PHP它不支持多继承,语法格式如下:

    class Child extends Parent {
      // 代码部分
    }
    
    

    咱们接下来使用Child_Site 类继承 Site 类,并扩展其功能,如下:

    ?php 
    class Child_Site extends Site {
      var $category;
      function setCate($par){
        $this->category = $par;
      }
      function getCate(){
        echo $this->category . PHP_EOL;
      }
    }
    
    

    再来看方法重写,它的定义就是,如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写,废话不多说,来看下重写了 getUrl 与 getTitle 方法的实例:

    function getUrl() {
      echo $this->url . PHP_EOL;
      return $this->url;
    }
    function getTitle(){
      echo $this->title . PHP_EOL;
      return $this->title;
    }
    
    

    PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的,来看下具体意思:

    类属性必须定义为公有,受保护,私有之一,如果用 var 定义,则被视为公有,看实例感受下:

    ?php
    /**
     * Define MyClass
     */
    class MyClass
    {
      public $public = 'Public';
      protected $protected = 'Protected';
      private $private = 'Private';
      function printHello()
      {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
      }
    }
    $obj = new MyClass();
    echo $obj->public; // 这行能被正常执行
    echo $obj->protected; // 这行会产生一个致命错误
    echo $obj->private; // 这行也会产生一个致命错误
    $obj->printHello(); // 输出 Public、Protected 和 Private
    /**
     * Define MyClass2
     */
    class MyClass2 extends MyClass
    {
      // 可以对 public 和 protected 进行重定义,但 private 而不能
      protected $protected = 'Protected2';
      function printHello()
      {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
      }
    }
    $obj2 = new MyClass2();
    echo $obj2->public; // 这行能被正常执行
    echo $obj2->private; // 未定义 private
    echo $obj2->protected; // 这行会产生一个致命错误
    $obj2->printHello(); // 输出 Public、Protected2 和 Undefined
    ?>
    
    

    类中的方法可以被定义为公有,私有或受保护,然而如果没有设置这些关键字,则该方法默认为公有,感受下实例:

    ?php
    /**
     * Define MyClass
     */
    class MyClass
    {
      // 声明一个公有的构造函数
      public function __construct() { }
      // 声明一个公有的方法
      public function MyPublic() { }
      // 声明一个受保护的方法
      protected function MyProtected() { }
      // 声明一个私有的方法
      private function MyPrivate() { }
      // 此方法为公有
      function Foo()
      {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
      }
    }
    $myclass = new MyClass;
    $myclass->MyPublic(); // 这行能被正常执行
    $myclass->MyProtected(); // 这行会产生一个致命错误
    $myclass->MyPrivate(); // 这行会产生一个致命错误
    $myclass->Foo(); // 公有,受保护,私有都可以执行
    /**
     * Define MyClass2
     */
    class MyClass2 extends MyClass
    {
      // 此方法为公有
      function Foo2()
      {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); // 这行会产生一个致命错误
      }
    }
    $myclass2 = new MyClass2;
    $myclass2->MyPublic(); // 这行能被正常执行
    $myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
    class Bar 
    {
      public function test() {
        $this->testPrivate();
        $this->testPublic();
      }
      public function testPublic() {
        echo "Bar::testPublic\n";
      }
      private function testPrivate() {
        echo "Bar::testPrivate\n";
      }
    }
    class Foo extends Bar 
    {
      public function testPublic() {
        echo "Foo::testPublic\n";
      }
      private function testPrivate() {
        echo "Foo::testPrivate\n";
      }
    }
    $myFoo = new foo();
    $myFoo->test(); // Bar::testPrivate 
            // Foo::testPublic
    ?>
    
    

    好啦,本次记录就到这里了。

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
    • 详解php中的类与对象(继承)
    • php面向对象全攻略 (七) 继承性
    • PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
    • PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
    • PHP面向对象继承用法详解(优化与减少代码重复)
    • PHP面向对象程序设计OOP继承用法入门示例
    • PHP面向对象程序设计继承用法简单示例
    • PHP面向对象程序设计之接口的继承定义与用法详解
    • PHP 对象继承原理与简单用法示例
    上一篇:PHP设计模式之策略模式(Strategy)入门与应用案例详解
    下一篇:PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】 PHP,学习,记录,之,面向,对象,