引用:
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 // 调用成员函数,设置标题和URL30 $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 // 调用成员函数,获取标题和URL39 $runoob->getTitle();40 $taobao->getTitle();41 $google->getTitle();42 43 $runoob->getUrl();44 $taobao->getUrl();45 $google->getUrl();46 ?>
执行以上代码,输出结果为:
菜鸟教程淘宝Google 搜索www.runoob.comwww.taobao.comwww.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 // 调用成员函数,获取标题和URL34 $runoob->getTitle();35 $taobao->getTitle();36 $google->getTitle();37 38 $runoob->getUrl();39 $taobao->getUrl();40 $google->getUrl();41 ?>
运行结果:
菜鸟教程淘宝Google 搜索www.runoob.comwww.taobao.comwww.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 MyClass237 ?*/38 class MyClass2 extends MyClass39 {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 Bar11 {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 Bar27 {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::testPrivate40 // Foo::testPublic41 ?>
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; ?//foo15 $foo = new Foo(); //foo16 17 print Foo::staticValue() . PHP_EOL; //foo18 print $foo->staticValue() . PHP_EOL; //foo19 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(); //foo12 13 print $foo->staticValue() . PHP_EOL; //foo14 ?> ???
PHP 面向对象
原文地址:https://www.cnblogs.com/haima/p/9393778.html