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\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 ?>
打印结果:
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 ?>