由于php手册从这一章节开始没有翻译,都是英文,近来自己开始学习php5中的面向对象编程,为方便学习和阅读,所以把其翻译之,发上来与大家分享,有不妥之处请大家批评指正!
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
对类成员的访问控制
类成员都必须使用关键字public、protected 或 private 进行定义
例 10.9. 声明类成员
[color=#007700]<?[/color][color=#0000bb]php
[/color][color=#ff8000]/** Define MyClass */
[/color][color=#007700]class [/color][color=#0000bb]MyClass
[/color][color=#007700]{ public [/color][color=#0000bb]$public [/color][color=#007700]= [/color][color=#dd0000]'Public'[/color][color=#007700];
protected [/color][color=#0000bb]$protected [/color][color=#007700]= [/color][color=#dd0000]'Protected'[/color][color=#007700];
private [/color][color=#0000bb]$private [/color][color=#007700]= [/color][color=#dd0000]'Private'[/color][color=#007700];
function [/color][color=#0000bb]printHello[/color][color=#007700]()
{ echo [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]public[/color][color=#007700];
echo [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]protected[/color][color=#007700];
echo [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]private[/color][color=#007700];
}
}
[/color][color=#0000bb]$obj [/color][color=#007700]= new [/color][color=#0000bb]MyClass[/color][color=#007700]();
echo [/color][color=#0000bb]$obj[/color][color=#007700]->[/color][color=#0000bb]public[/color][color=#007700]; [/color][color=#ff8000]// // Works
[/color][color=#007700]echo [/color][color=#0000bb]$obj[/color][color=#007700]->[/color][color=#0000bb]protected[/color][color=#007700]; [/color][color=#ff8000]// Fatal Error
[/color][color=#007700]echo [/color][color=#0000bb]$obj[/color][color=#007700]->[/color][color=#0000bb]private[/color][color=#007700]; [/color][color=#ff8000]// Fatal Error
[/color][color=#0000bb]$obj[/color][color=#007700]->[/color][color=#0000bb]printHello[/color][color=#007700]();[/color][color=#ff8000]// Shows Public, Protected and Priv
[/color][color=#007700]class [/color][color=#0000bb]MyClass2 [/color][color=#007700]extends [/color][color=#0000bb]MyClass [/color][color=#ff8000]//Define MyClass2
[/color][color=#007700]{[/color][color=#ff8000]// We can redeclare the public and protected method, but not private
[/color][color=#007700]protected [/color][color=#0000bb]$protected [/color][color=#007700]= [/color][color=#dd0000]'Protected2'[/color][color=#007700];
function [/color][color=#0000bb]printHello[/color][color=#007700]()
{ echo [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]public[/color][color=#007700];
echo [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]protected[/color][color=#007700];
echo [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]private[/color][color=#007700];
}
}
[/color][color=#0000bb]$obj2 [/color][color=#007700]= new [/color][color=#0000bb]MyClass2[/color][color=#007700]();
echo [/color][color=#0000bb]$obj[/color][color=#007700]->[/color][color=#0000bb]public[/color][color=#007700]; [/color][color=#ff8000]// Works
[/color][color=#007700]echo [/color][color=#0000bb]$obj2[/color][color=#007700]->[/color][color=#0000bb]private[/color][color=#007700]; [/color][color=#ff8000]// Undefined
[/color][color=#007700]echo [/color][color=#0000bb]$obj2[/color][color=#007700]->[/color][color=#0000bb]protected[/color][color=#007700]; [/color][color=#ff8000]// Fatal Error
[/color][color=#0000bb]$obj2[/color][color=#007700]->[/color][color=#0000bb]printHello[/color][color=#007700]();[/color][color=#ff8000]// Shows Public, Protected2, not Private
[/color][color=#0000bb]?>[/color]
注意:
在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 的面向对象语法中不再使用。为了顾及兼容性,在类中定义一个变量的话,该变量会被自动设为 public,并且产生一个 E_STRICT 警告。
对方法的访问控制
类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
例 10.10. 声明类中的方法 [color=#007700]<?[/color][color=#0000bb]php
[/color][color=#007700]class [/color][color=#0000bb]MyClass [/color][color=#ff8000]//Define MyClass
[/color][color=#007700]{ public function [/color][color=#0000bb]__construct[/color][color=#007700]() { }
public function [/color][color=#0000bb]MyPublic[/color][color=#007700]() { }
protected function [/color][color=#0000bb]MyProtected[/color][color=#007700]() { }
private function [/color][color=#0000bb]MyPrivate[/color][color=#007700]() { }
function [/color][color=#0000bb]Foo[/color][color=#007700]()
{ [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]MyPublic[/color][color=#007700]();
[/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]MyProtected[/color][color=#007700]();
[/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]MyPrivate[/color][color=#007700]();
}
}
[/color][color=#0000bb]$myclass [/color][color=#007700]= new [/color][color=#0000bb]MyClass[/color][color=#007700];
[/color][color=#0000bb]$myclass[/color][color=#007700]->[/color][color=#0000bb]MyPublic[/color][color=#007700](); [/color][color=#ff8000]//
[/color][color=#0000bb]$myclass[/color][color=#007700]->[/color][color=#0000bb]MyProtected[/color][color=#007700](); [/color][color=#ff8000]//
[/color][color=#0000bb]$myclass[/color][color=#007700]->[/color][color=#0000bb]MyPrivate[/color][color=#007700](); [/color][color=#ff8000]//
[/color][color=#0000bb]$myclass[/color][color=#007700]->[/color][color=#0000bb]Foo[/color][color=#007700]();
class [/color][color=#0000bb]MyClass2 [/color][color=#007700]extends [/color][color=#0000bb]MyClass [/color][color=#ff8000]//Define MyClass2
[/color][color=#007700]{ [/color][color=#ff8000]// This is public
[/color][color=#007700]function [/color][color=#0000bb]Foo2[/color][color=#007700]()
{ [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]MyPublic[/color][color=#007700]();
[/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]MyProtected[/color][color=#007700]();
[/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]MyPrivate[/color][color=#007700]();
}
}
[/color][color=#0000bb]$myclass2 [/color][color=#007700]= new [/color][color=#0000bb]MyClass2[/color][color=#007700];
[/color][color=#0000bb]$myclass2[/color][color=#007700]->[/color][color=#0000bb]MyPublic[/color][color=#007700]();
[/color][color=#0000bb]$myclass2[/color][color=#007700]->[/color][color=#0000bb]Foo2[/color][color=#007700]();
[/color][color=#0000bb]?>[/color][color=#000000] [/color]
第19章 类与对象(PHP5)之二:范围解析操作符(::)--Scope Resolution Operator (::)
[size=12px]范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。把 Paamayim Nekudotayim 选作该操作符的名字似乎有些奇怪。然而,这是Zend开发小组在写Zend Engine 0.5(被用于 PHP 3 中)时所作出的决定。事实上这个词在希伯莱文就是双冒号的意思。
例 10.11. 在类的外部使用 :: 操作符
[color=#007700]<?[/color][color=#0000bb]php
[/color][color=#007700]class [/color][color=#0000bb]MyClass
[/color][color=#007700]{ const [/color][color=#0000bb]CONST_VALUE [/color][color=#007700]= [/color][color=#dd0000]'A constant value'[/color][color=#007700];
}
echo [/color][color=#0000bb]MyClass[/color][color=#007700]::[/color][color=#0000bb]CONST_VALUE[/color][color=#007700];
[/color][color=#0000bb]?>[/color][color=#000000]
[/color]
[/size]
self和parent这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。
例 10.12. :: from inside the class definition
[color=#007700]<?[/color][color=#0000bb]php
[/color][color=#007700]class [/color][color=#0000bb]OtherClass [/color][color=#007700]extends [/color][color=#0000bb]MyClass
[/color][color=#007700]{ public static [/color][color=#0000bb]$my_static [/color][color=#007700]= [/color][color=#dd0000]'static var'[/color][color=#007700];
public static function [/color][color=#0000bb]doubleColon[/color][color=#007700]()
{ echo [/color][color=#0000bb]parent[/color][color=#007700]::[/color][color=#0000bb]CONST_VALUE [/color][color=#007700]. [/color][color=#dd0000]"\n"[/color][color=#007700];
echo [/color][color=#0000bb]self[/color][color=#007700]::[/color][color=#0000bb]$my_static [/color][color=#007700]. [/color][color=#dd0000]"\n"[/color][color=#007700];
}
}
[/color][color=#0000bb]OtherClass[/color][color=#007700]::[/color][color=#0000bb]doubleColon[/color][color=#007700]();
[/color][color=#0000bb]?>[/color][color=#000000] [/color]
当一个子类覆盖其父类中的方法时,PHP不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止。这种机制也作用于构造函数和析构函数、重载及魔术函数。
例 10.13. 调用父类的方法
[color=#007700]<?[/color][color=#0000bb]php
[/color][color=#007700]class [/color][color=#0000bb]MyClass
[/color][color=#007700]{ protected function [/color][color=#0000bb]myFunc[/color][color=#007700]() { echo[/color][color=#dd0000]"MyClass::myFunc()\n"[/color][color=#007700]; }
}
class [/color][color=#0000bb]OtherClass [/color][color=#007700]extends [/color][color=#0000bb]MyClass
[/color][color=#007700]{ [/color][color=#ff8000]// Override parent's definition
[/color][color=#007700]public function [/color][color=#0000bb]myFunc[/color][color=#007700]()
{ [/color][color=#ff8000]// But still call the parent function
[/color][color=#0000bb]parent[/color][color=#007700]::[/color][color=#0000bb]myFunc[/color][color=#007700]();
echo [/color][color=#dd0000]"OtherClass::myFunc()\n"[/color][color=#007700];
}
}
[/color][color=#0000bb]$class [/color][color=#007700]= new [/color][color=#0000bb]OtherClass[/color][color=#007700]();
[/color][color=#0000bb]$class[/color][color=#007700]->[/color][color=#0000bb]myFunc[/color][color=#007700]();
[/color][color=#0000bb]?>[/color][color=#000000]
[/color]
第19章 类与对象(PHP5)之三:静态关键字(Static Keyword)
[size=12px]声明静态的类的成员和方法,使它不需要一个类的实例.一个static成员的声明不能通过一个类对象的实例来访问(尽管一个静态方法可以)。
静态声明必须在可见性声明之后。为了兼容PHP 4,如果没有可见性被声明,那么成员和方法将被当作是已经声明为public。
由于静态方法可以调用非对象实例,伪变量$this不可以在声明为静态的方法中使用。
事实上static方法调用形式在编译时被确定。当使用必须要声明的类名时,方法是完全标识和无继承规则的应用。当使用必须要声明的类名时,这种方法就被完全确认,而且没有使用继承的规则。
如果self已经被声明,那么self就被当前所属的类所解释。也不适用与继承规则。静态属性不能通过箭头操作符->.访问非静态方法,这将产生一个E_STRICT 级的警告。
例子 19-13. 静态成员的例子
[color=#007700]<?[/color][color=#0000bb]php
[/color][color=#007700]class [/color][color=#0000bb]Foo
[/color][color=#007700]{ public static [/color][color=#0000bb]$my_static[/color][color=#007700]=[/color][color=#dd0000]'foo'[/color][color=#007700];
public function [/color][color=#0000bb]staticValue[/color][color=#007700](){ return [/color][color=#0000bb]self[/color][color=#007700]::[/color][color=#0000bb]$my_static[/color][color=#007700]; }
}
class [/color][color=#0000bb]Bar [/color][color=#007700]extends [/color][color=#0000bb]Foo
[/color][color=#007700]{ public function [/color][color=#0000bb]fooStatic[/color][color=#007700](){ return [/color][color=#0000bb]parent[/color][color=#007700]::[/color][color=#0000bb]$my_static[/color][color=#007700]; }
}
print [/color][color=#0000bb]Foo[/color][color=#007700]::[/color][color=#0000bb]$my_static[/color][color=#007700].[/color][color=#dd0000]"\n"[/color][color=#007700];
[/color][color=#0000bb]$foo [/color][color=#007700]= new [/color][color=#0000bb]Foo[/color][color=#007700]();
print [/color][color=#0000bb]$foo[/color][color=#007700]->[/color][color=#0000bb]staticValue[/color][color=#007700]().[/color][color=#dd0000]"\n"[/color][color=#007700];
print [/color][color=#0000bb]$foo[/color][color=#007700]->[/color][color=#0000bb]my_static[/color][color=#007700].[/color][color=#dd0000]"\n"[/color][color=#007700];[/color][color=#ff8000]// Undefined "Property" my_static
// $foo::my_static is not possible
[/color][color=#007700]print [/color][color=#0000bb]Bar[/color][color=#007700]::[/color][color=#0000bb]$my_static[/color][color=#007700].[/color][color=#dd0000]"\n"[/color][color=#007700];
[/color][color=#0000bb]$bar [/color][color=#007700]= new [/color][color=#0000bb]Bar[/color][color=#007700]();
print [/color][color=#0000bb]$bar[/color][color=#007700]->[/color][color=#0000bb]fooStatic[/color][color=#007700]().[/color][color=#dd0000]"\n"[/color][color=#007700];
[/color][color=#0000bb]?>[/color][color=#000000]
[/color]
[/size]
例子 19-14.静态方法实例(Static method example)
[color=#007700]<?[/color][color=#0000bb]php
[/color][color=#007700]class [/color][color=#0000bb]Foo
[/color][color=#007700]{ public static function [/color][color=#0000bb]aStaticMethod[/color][color=#007700]() { }
}
[/color][color=#0000bb]Foo[/color][color=#007700]::[/color][color=#0000bb]aStaticMethod[/color][color=#007700]();
[/color][color=#0000bb]?>[/color][color=#000000] [/color]