• PHP 面向对象


    引用:

    http://www.runoob.com/php/php-oop.html

    PHP 类定义

    实例:

     1 <?php
     2 class Site {
     3   /* 成员变量 */
     4   var $url;
     5   var $title;
     6   
     7   /* 成员函数 */
     8   function setUrl($par){
     9      $this->url = $par;
    10   }
    11   
    12   function getUrl(){
    13      echo $this->url . PHP_EOL;
    14   }
    15   
    16   function setTitle($par){
    17      $this->title = $par;
    18   }
    19   
    20   function getTitle(){
    21      echo $this->title . PHP_EOL;
    22   }
    23 }
    24 ?>

    变量 $this 代表自身的对象。

    PHP_EOL 为换行符。


    PHP 中创建对象

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

    1 $runoob = new Site;
    2 $taobao = new Site;
    3 $google = new Site;

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

    调用成员方法

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

    完整代码如下:

     1  <?php
     2 class Site {
     3   /* 成员变量 */
     4   var $url;
     5   var $title;
     6   
     7   /* 成员函数 */
     8   function setUrl($par){
     9      $this->url = $par;
    10   }
    11   
    12   function getUrl(){
    13      echo $this->url . PHP_EOL;
    14   }
    15   
    16   function setTitle($par){
    17      $this->title = $par;
    18   }
    19   
    20   function getTitle(){
    21      echo $this->title . PHP_EOL;
    22   }
    23 }
    24 
    25 $runoob = new Site;
    26 $taobao = new Site;
    27 $google = new Site;
    28 
    29 // 调用成员函数,设置标题和URL
    30 $runoob->setTitle( "菜鸟教程" );
    31 $taobao->setTitle( "淘宝" );
    32 $google->setTitle( "Google 搜索" );
    33 
    34 $runoob->setUrl( 'www.runoob.com' );
    35 $taobao->setUrl( 'www.taobao.com' );
    36 $google->setUrl( 'www.google.com' );
    37 
    38 // 调用成员函数,获取标题和URL
    39 $runoob->getTitle();
    40 $taobao->getTitle();
    41 $google->getTitle();
    42 
    43 $runoob->getUrl();
    44 $taobao->getUrl();
    45 $google->getUrl();
    46 ?> 

    执行以上代码,输出结果为:

    菜鸟教程
    淘宝
    Google 搜索
    www.runoob.com
    www.taobao.com
    www.google.com

    PHP 构造函数

    构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。

    PHP 5 允许开发者在一个类中定义一个方法作为构造函数,语法格式如下:

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

    在上面的例子中我们就可以通过构造方法来初始化 $url 和 $title 变量:

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

    现在我们就不需要再调用 setTitle 和 setUrl 方法了

     1 <?php
     2 class Site {
     3   /* 成员变量 */
     4   var $url;
     5   var $title;
     6 
     7   function __construct( $par1, $par2 ) {
     8     $this->url = $par1;
     9     $this->title = $par2;
    10   }
    11   /* 成员函数 */
    12   function setUrl($par){
    13      $this->url = $par;
    14   }
    15   
    16   function getUrl(){
    17      echo $this->url . PHP_EOL;
    18   }
    19   
    20   function setTitle($par){
    21      $this->title = $par;
    22   }
    23   
    24   function getTitle(){
    25      echo $this->title . PHP_EOL;
    26   }
    27 }
    28 
    29 $runoob = new Site('www.runoob.com', '菜鸟教程');
    30 $taobao = new Site('www.taobao.com', '淘宝');
    31 $google = new Site('www.google.com', 'Google 搜索');
    32 
    33 // 调用成员函数,获取标题和URL
    34 $runoob->getTitle();
    35 $taobao->getTitle();
    36 $google->getTitle();
    37 
    38 $runoob->getUrl();
    39 $taobao->getUrl();
    40 $google->getUrl();
    41 ?>

    运行结果:

    菜鸟教程
    淘宝
    Google 搜索
    www.runoob.com
    www.taobao.com
    www.google.com

    方法重写

    如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

    实例中重写了 getUrl 与 getTitle 方法:

    1 function getUrl() {
    2    echo $this->url . PHP_EOL;
    3    return $this->url;
    4 }
    5    
    6 function getTitle(){
    7    echo $this->title . PHP_EOL;
    8    return $this->title;
    9 }

    访问控制

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

    1     public(公有):公有的类成员可以在任何地方被访问。
    2     protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。不能被子类重写
    3     private(私有):私有的类成员则只能被其定义所在的类访问。不能被子类重写,子类重写无效,运行不会报错.

    属性的访问控制

    类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。

     1 <?php
     2 /**
     3  * Define MyClass
     4  */
     5 class MyClass
     6 {
     7     // 声明一个公有的构造函数
     8     public function __construct() { }
     9 
    10     // 声明一个公有的方法
    11     public function MyPublic() { }
    12 
    13     // 声明一个受保护的方法
    14     protected function MyProtected() { }
    15 
    16     // 声明一个私有的方法
    17     private function MyPrivate() { }
    18 
    19     // 此方法为公有
    20     function Foo()
    21     {
    22         $this->MyPublic();
    23         $this->MyProtected();
    24         $this->MyPrivate();
    25     }
    26 }
    27 
    28 $myclass = new MyClass;
    29 $myclass->MyPublic(); // 这行能被正常执行
    30 $myclass->MyProtected(); // 这行会产生一个致命错误
    31 $myclass->MyPrivate(); // 这行会产生一个致命错误
    32 $myclass->Foo(); // 公有,受保护,私有都可以执行
    33 
    34 
    35 /**
    36  * Define MyClass2
    37  */
    38 class MyClass2 extends MyClass
    39 {
    40     // 此方法为公有
    41     function Foo2()
    42     {
    43         $this->MyPublic();
    44         $this->MyProtected();
    45         $this->MyPrivate(); // 这行会产生一个致命错误
    46     }
    47 }
    48 
    49 $myclass2 = new MyClass2;
    50 $myclass2->MyPublic(); // 这行能被正常执行
    51 $myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
     1 <?php
     2 /**
     3  * Created by Haima.
     4  * Author:Haima
     5  * QQ:228654416
     6  * Date: 2018/7/31
     7  * Time: 4:00
     8  */
     9 
    10 class Bar
    11 {
    12     public function test() {
    13         $this->testPrivate();
    14         $this->testPublic();
    15     }
    16 
    17     public function testPublic() {
    18         echo "Bar::testPublic
    ";
    19     }
    20 
    21     private function testPrivate() {
    22         echo "Bar::testPrivate
    ";
    23     }
    24 }
    25 
    26 class Foo extends Bar
    27 {
    28     public function testPublic() {
    29         echo "Foo::testPublic
    ";
    30     }
    31 
    32     private function testPrivate() {
    33         echo "Foo::testPrivate
    ";
    34     }
    35 }
    36 
    37 $myFoo = new foo();
    38 $myFoo->test();
    39 // Bar::testPrivate
    40 // Foo::testPublic
    41 ?>

    Static 关键字

    声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

    静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

    由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

    静态属性不可以由对象通过 -> 操作符来访问。

    自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

     1 <?php
     2 class Foo {
     3     public static $my_static = 'foo';
     4 
     5     public static function staticValue() {
     6         return self::$my_static;
     7     }
     8 
     9     public function staticValue2() {
    10         return $this->my_static;  //静态属性不能这样调用
    11     }
    12 }
    13 
    14 print Foo::$my_static . PHP_EOL;  //foo
    15 $foo = new Foo(); //foo
    16 
    17 print Foo::staticValue() . PHP_EOL; //foo
    18 print $foo->staticValue() . PHP_EOL; //foo
    19 print $foo->staticValue2() . PHP_EOL; //报错
    20 ?>

    打印结果:

     1 <?php
     2 class Foo {
     3   public static $my_static = 'foo';
     4   
     5   public function staticValue() {
     6      return self::$my_static;
     7   }
     8 }
     9 
    10 print Foo::$my_static . PHP_EOL;
    11 $foo = new Foo(); //foo
    12 
    13 print $foo->staticValue() . PHP_EOL; //foo
    14 ?>    


     

    [Haima的博客] http://www.cnblogs.com/haima/
  • 相关阅读:
    第二章例2-9
    第二章例2-8
    第二章例2-7
    第二章例2-6
    第二章例2-5
    第二章例2-4
    第二章例2-3
    第二章例2-2
    第二章例2-1
    第一章例1-2
  • 原文地址:https://www.cnblogs.com/haima/p/9393778.html
Copyright © 2020-2023  润新知