php實現面向對象的一個顯著特征是大量使用關鍵字,本文將詳細介紹關鍵字
public表示公有,它具有最大的訪問權限,被定義為公有的類成員可以在任何地方被訪問
如果屬性用 var 定義,則被視為公有,如果方法沒有設置關鍵字,則該方法默認為公有
<?php
class demo{
public $public = 1;
function test($var){
echo "{$var}000";
}
}
$d1 = new demo;
$d1->test($d1->public);//1000
?>
protected表示受保護的,被定義為受保護的類成員則可以被其自身以及其子類和父類訪問
<?php
class demo{
protected function fn(){
echo '111';
}
}
class demo1 extends demo{
function test(){
parent::fn();
}
}
$d1 = new demo1;
$d1->test();//111
?>
private表示私有的,被定義為私有的類成員則只能被其定義所在的類訪問
<?php
class demo{
private $private = 1;
function test(){
echo($this->private);
}
}
$d1 = new demo;
$d1->test();//1
?>
PHP5新增了final關鍵字,它只能用來修飾類和方法,不能使用final這個關鍵字來修飾成員屬性,因為final是常量的意思,我們在PHP裡定義常量使用的是define()函數和const關鍵字,所以不能使用final來定義成員屬性
如果父類中的方法被聲明為final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
?>
static關鍵字表示靜態的意思,用於修飾類的成員屬性和成員方法(即為靜態屬性和靜態方法)
類中的靜態屬性和靜態方法不用實例化(new)就可以直接使用類名訪問
[注意]靜態屬性不能通過一個類已實例化的對象來訪問,但靜態方法可以
由於靜態方法不需要通過對象即可調用,所以偽變量 $this 在靜態方法中不可用,靜態屬性不可以由對象通過 -> 操作符來訪問
用靜態方式調用一個非靜態方法會導致一個 E_STRICT 級別的錯誤
就像其它所有的 PHP 靜態變量一樣,靜態屬性只能被初始化為文字或常量,不能使用表達式。所以可以把靜態屬性初始化為整數或數組,但不能初始化為另一個變量或函數返回值,也不能指向一個對象
<?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'
$foo = new Foo();
print $foo->staticValue() . "\n";//'foo'
print $foo::$my_static . "\n";//'foo'
print $foo->my_static . "\n"; //報錯
?>
可以把在類中始終保持不變的值定義為常量。在定義和使用常量的時候不需要使用$符號,而是使用const
常量的值必須是一個定值,不能是變量,類屬性,數學運算的結果或函數調用
<?php
class MyClass
{
const constant = 'constant value';
function showConstant() {
echo self::constant . "\n";
}
}
echo MyClass::constant . "\n";//'constant value'
$classname = "MyClass";
echo $classname::constant . "\n"; //'constant value'
$class = new MyClass();
$class->showConstant();//'constant value'
echo $class::constant."\n";//'constant value'
?>
當一個方法在類定義內部被調用時,有一個可用的偽變量this,特殊對象的引用this就是在對象內部的成員方法中,代表本對象的一個引用,但只能在對象的成員方法中使用,不管是在對象內部使用$this訪問自己對象內部成員。還是在對象外部通過對象的引用名稱訪問對象中的成員,都需要使用特殊的運算符“->”來完成訪問
[注意]this在靜態方法中不可用
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this is not defined.\n";
}
}
}
class B
{
function bar()
{
// Note: the next line will issue a warning if E_STRICT is enabled.
A::foo();
}
}
$a = new A();
$a->foo();//$this is defined (A)
A::foo();//$this is not defined.
$b = new B();
$b->bar();//$this is defined (B)
B::bar();//$this is not defined.
?>
在類的方法中,不能用this來引用靜態變量或靜態方法,而需要用self來引用
<?php
class MyClass
{
const constant = 'constant value';
static function showConstant() {
echo self::constant . "\n";
}
}
$var = new MyClass;
echo $var->showConstant();//constant value
?>
parent用於調用父類中定義的成員方法或常量
<?php
class MyClass{
function fn(){
echo('111');
}
const A = 'a';
}
class Class1 extends MyClass{
function test(){
echo parent::fn().parent::A;
}
}
$var = new Class1;
$var->test();//111a
?>