PHP 访问控制
-
公共成员(public)
通过将成员指定为私有的,可以将其可访问性限制为声明它的类。私有成员不能从继承声明它的类的类引用,也不能从类外部访问。通过使用成员的private
关键字指定,可以使类成员变为私有的。
尝试一下function getPrice() { echo $this->price . "<br/>"; echo "我是来自子类的方法1<br/>"; } function getTitle(){ echo $this->title . "<br/>"; echo "我是来自子类的方法1<br/>"; }
-
私有成员(private)
除非您另行指定,否则类的属性和方法是公共的,可以显式的用关键字public
指定。也就是说,可以在三种可能的情况下访问它们- 从声明它的类之外
- 从声明它的类中
- 从另一个实现声明它的类的类中
class MyClass { private $car = "skoda"; $driver = "SRK"; /*构造方法*/ function __construct($par) { } function myPublicFunction() { return("外部和继承类,我是可见的!"); } private function myPrivateFunction() { return("外部和继承类,我是不可见的!"); } }
当MyClass类由另一个使用extends
继承的类时,myPublicFunction()将是可见的,$driver也是可见的。子类不会对myPrivateFunction和$car有任何意识或访问权限,因为它们被声明为私有的。 -
受保护成员(protected)
受保护的属性或方法可以在声明它的类中以及扩展该类的类中访问。受保护的成员在这两类之外是不可用的。可以通过在成员使用protected
关键字来保护类成员。class MyClass { protected $car = "skoda"; $driver = "SRK"; /*构造方法*/ function __construct($par) { } function myPublicFunction() { return("我外部和继承类都可见"); } protected function myPrivateFunction() { return("我只是在类内部和继承类中可见,外部不可见"); } }
-
接口(interface)
定义接口以向实现者提供通用函数名称。不同的实现者可以根据需要实现这些接口(换句话说接口只是声明,没有实现,是一种特殊的类,可以用interface
来声明接口)。可以说,接口是开发人员实现的骨架。interface Mail { public function sendMail(); }
然后,如果另一个类实现了该接口(用implements
来实现),就像这样class Report implements Mail { // sendMail() 函数的具体实现写在这里 public function sendMail(){ echo 'send mail!!'; } }
-
类常量(interface)
常量有点像变量,因为它保存一个值,但实际上更像是一个函数,因为常量是不可变的。一旦声明了常量,它就不会改变。声明一个常量很容易,访问类常量可以用类名加两个冒号来访问,就像在这个版本的MyClass中一样
尝试一下class MyClass { const requiredMargin = 1.7; function __construct($incomingValue) { //构造函数 } } echo MyClass::requiredMargin;
在这个类中,requiredMargin是一个常量。它使用关键字const
声明,并且在任何情况下都不能将其更改为1.7以外的任何值。请注意,常量的名称没有前导$,因为变量名称可以。 -
抽象类(abstract)
抽象类是无法实例化的,只能继承的类。您使用关键字abstract
声明一个抽象类,如下所示,从抽象类继承时,父类声明中标记为abstract的所有方法都必须由子类定义实现; 此外,必须使用相同的可见性定义这些方法。<?php abstract class MyAbstractClass { abstract function myAbstractFunction(); function test(){ echo 'test'; } } class MyClass extends MyAbstractClass{ // 这个类继承了一个抽象类,必需实现里面的抽象方法 function myAbstractFunction(){ echo 'abstract'; } }
请注意,抽象类中的函数定义也必须以关键字abstract
开头。在非抽象类中包含抽象函数定义是不合法的。 -
static 关键字
将类成员或方法声明为静态使得它们可以访问而无需实例化类。声明为static
的成员无法使用实例化的类对象访问(尽管静态方法可以)。试试下面的例子
尝试一下<?php class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } public static function staticMethod(){ echo 'test11<br/>'; } } //静态类成员属性通过类名访问 print Foo::$my_static . "<br/>"; $foo = new Foo(); print $foo->staticValue() . "<br/>"; //静态类成员方法通过类名访问 和 通过实例访问都可以 Foo::staticMethod(); $foo->staticMethod(); ?>
-
final 关键字
PHP 5引入了final
关键字,它通过在方法中添加final
前缀来阻止子类覆盖方法。如果类本身被定义为final
,则无法被继承。以下示例结果导致致命错误:无法覆盖最终方法BaseClass::moreTesting()
尝试一下<?php class BaseClass { public function test() { echo "BaseClass::test() called<br>"; } final public function moreTesting() { echo "BaseClass::moreTesting() called<br>"; } } class ChildClass extends BaseClass { /*这里重写父类的final方法将报致命错误*/ public function moreTesting() { echo "ChildClass::moreTesting() called<br>"; } } ?>
查看下面继承final类的示例:也会报致命错误。
尝试一下<?php final class BaseClass { public function test() { echo "BaseClass::test() called<br>"; } public function moreTesting() { echo "BaseClass::moreTesting() called<br>"; } } /*这里继承final类将报致命错误*/ class ChildClass extends BaseClass { } ?>