引用:
PHP 类定义
实例:
1 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 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 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 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 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 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 staticValue() . PHP_EOL; //foo14 ?>