引用:

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\n";
19     }
20 
21     private function testPrivate() {
22         echo "Bar::testPrivate\n";
23     }
24 }
25 
26 class Foo extends Bar
27 {
28     public function testPublic() {
29         echo "Foo::testPublic\n";
30     }
31 
32     private function testPrivate() {
33         echo "Foo::testPrivate\n";
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 ?>

打印结果:

PHP 面向对象_成员变量

 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 ?>