PHP5中的类与对象


PHP5中对类的属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。

对类成员的访问控制

类成员都必须使用关键字public、protected 或 private 进行定义
声明类成员

<?php /** Define MyClass */ class MyClass { public $public = ’Public’; protected $protected = ’Protected’; private $private = ’Private’; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // // Works echo $obj->protected; // Fatal Error echo $obj->private; // Fatal Error $obj->printHello();// Shows Public, Protected and Priv class MyClass2 extends MyClass //Define MyClass2 {// We can redeclare the public and protected method, but not private protected $protected = ’Protected2’; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj->public; // Works echo $obj2->private; // Undefined echo $obj2->protected; // Fatal Error $obj2->printHello();// Shows Public, Protected2, not Private ?> 注意:
    在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 的面向对象语法中不再使用。为了顾及兼容性,在类中定义一个变量的话,该变量会被自动设为 public,并且产生一个 E_STRICT 警告

对方法的访问控制

    类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
例 10.10. 声明类中的方法
<?php class MyClass //Define MyClass { public function __construct() { } public function MyPublic() { } protected function MyProtected() { } private function MyPrivate() { } function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // $myclass->MyProtected(); // $myclass->MyPrivate(); // $myclass->Foo(); class MyClass2 extends MyClass //Define MyClass2 { // This is public function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass2 = new MyClass2; $myclass2->MyPublic(); $myclass2->Foo2(); ?>

    范围解析操作符(::)--Scope Resolution Operator (::)

    范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。把 Paamayim Nekudotayim 选作该操作符的名字似乎有些奇怪。然而,这是Zend开发小组在写Zend Engine 0.5(被用于 PHP 3 中)时所作出的决定。事实上这个词在希伯莱文就是双冒号的意思

例 10.11. 在类的外部使用 :: 操作符

<?php class MyClass { const CONST_VALUE = ’A constant value’; } echo MyClass::CONST_VALUE; ?> self和parent这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。
例 10.12. :: from inside the class definition

<?php class OtherClass extends MyClass { public static $my_static = ’static var’; public static function doubleColon() { echo parent::CONST_VALUE . "\n"; echo self::$my_static . "\n"; } } OtherClass::doubleColon(); ?>

    当一个子类覆盖其父类中的方法时,PHP不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止。这种机制也作用于构造函数和析构函数、重载及魔术函数。

例 10.13. 调用父类的方法
<?php class MyClass { protected function myFunc() { echo"MyClass::myFunc()\n"; } } class OtherClass extends MyClass { // Override parent’s definition public function myFunc() { // But still call the parent function parent::myFunc(); echo "OtherClass::myFunc()\n"; } } $class = new OtherClass(); $class->myFunc(); ?>

静态关键字(Static Keyword)

    声明静态的类的成员和方法,使它不需要一个类的实例.一个static成员的声明不能通过一个类对象的实例来访问(尽管一个静态方法可以)。

    静态声明必须在可见性声明之后。为了兼容PHP 4,如果没有可见性被声明,那么成员和方法将被当作是已经声明为public。
由于静态方法可以调用非对象实例,伪变量$this不可以在声明为静态的方法中使用。

    事实上static方法调用形式在编译时被确定。当使用必须要声明的类名时,方法是完全标识和无继承规则的应用。当使用必须要声明的类名时,这种方法就被完全确认,而且没有使用继承的规则。

    如果self已经被声明,那么self就被当前所属的类所解释。也不适用与继承规则。静态属性不能通过箭头操作符->.访问非静态方法,这将产生一个E_STRICT 级的警告。

例子 19-13. 静态成员的例子


<?php class Foo { public static $my_static=’foo’; public function staticValue(){ return self::$my_static; } } class Bar extends Foo { public function fooStatic(){ return parent::$my_static; } } print Foo::$my_static."\n"; $foo = new Foo(); print $foo->staticValue()."\n"; print $foo->my_static."\n";// Undefined "Property" my_static // $foo::my_static is not possible print Bar::$my_static."\n"; $bar = new Bar(); print $bar->fooStatic()."\n"; ?> 静态方法实例(Static method example)

<?php class Foo { public static function aStaticMethod() { } } Foo::aStaticMethod(); ?>

类常量(Class Constants)

    可以在每个基类中定义常量使它保持不变。在你不使用$符号去声明或使用它时,常量不同于普通变量。就象静态成员,常量值不能通过对象的实例来访问(而应使用$object::constant). 常量值必须是一个常量表达式,而不是一个变量,一个类的成员,一个数学表达式或函数调用的结果。

定义并使用一个常量
<?php class MyClass { const constant = ’constant value’; function showConstant() { echo self::constant."\n"; } } echo MyClass::constant."\n"; $class = new MyClass(); $class->showConstant();// echo $class::constant; is not allowed ?>

抽象类(Class Abstraction)

    PHP 5中引入了抽象类和抽象方法。不允许创建一个已经定义为abstract的类的一个实例。任何至少包含一个抽象方法的类也必须是抽象的。被定义为抽象的方法仅仅是声明方法的一个信号,并不能定义它们的实现。
当从一个抽象类继承时,在父类中所有抽象方法的标记的声明必须通过子类定义;另外,这些方法必须用定义相同的访问属性。例如,如果方法被定义为protected类型,执行函数必须定义为protected或public.
例子 抽象类例子

<?php abstract class AbstractClass { // Force Extending class to define this method abstract protected function getValue(); abstract protected function prefixValue($prefix); public function printOut() // Common method { print $this->getValue()."\n"; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return"{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1->printOut();//ConcreteClass1 echo $class1->prefixValue(’FOO_’) ."\n";//FOO_ConcreteClass1 $class2 = new ConcreteClass2; $class2->printOut();//ConcreteClass2 echo $class2->prefixValue(’FOO_’) ."\n";//FOO_ConcreteClass2 ?>

本文作者:



相关阅读:
Javascript操纵Cookie实现购物车程序
MySQL两种表存储结构性能比较测试过程
win2000上怎么装PHP+MYSQL(IIS版)
使用透明叠加法美化文件上传界面
SQL查询性能提高的10个技巧
一个简单的ASP+AJAX留言本源码下载
MSSQL经典语句
Vista系统自带IIS 7.0设置图解
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
JavaScript 图片放大效果及代码说明
Oracle数据库Spfile学习总结
PHP+MySQL教程(10):Database ODBC
JSP用中收集数据:javascript 实现输入多行动态输入
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
快速导航

Copyright © 2016 phpStudy | 皖ICP备18014864号-4