1. 程式人生 > >PHP:使用範圍解析操作符

PHP:使用範圍解析操作符

面向物件程式設計中會使用到一些它自己的操作符,如->,這個符號用來在物件中訪問它自己的成員。另外一個是範圍解析操作符:兩個冒號連在一起(::)。這個符號用於在類中(而不是物件中)訪問成員。使用方式如下:

ClassName::methodName();
ClassName::propertyName;

這種結構在兩個地方可能被用到:

1.在使用類的時候,父類和子類具有相同的屬性和方法時,利用它可以避免混淆。

2.在類外的時候,沒有建立物件的情況下使用該操作符訪問類的成員。

正如我們可以在一個類中使用$this來引用當前物件的例項,關鍵字self被用作當前類的一個引用。

class SomeClass {
    function __construct() {
        self::do();
    }

    protected function do(){
        echo "done!";
    }
}

在這段程式碼中,self::do()會觸發當前類的do()方法。

要引用父類的一個成員,可以使用關鍵字parent和範圍解析操作符來引用:

class SomeOtherClass extends SomeClass {
    function __construct() {
        parent::do();
    }
}

在多數情況下,我們使用範圍解析操作符是為了訪問被重寫的方法。我們也可以用其訪問靜態和常數成員。

注:類常數和靜態屬性一樣,它可以被類(或其子類)的全部例項訪問。但是它的值不可改變。建立類常數是使用const關鍵字,後面緊跟著常數名(沒有美元符號)。常數不可通過物件訪問,比如$obj->PI或者$obj::PI都是不行的,但是我們可以在任何地方使用ClassName::CONSTANT_NAME。也可以在類中的方法使用self::CONSTANT_NAME。

示例程式:

<?php  
	class Rectangle {
		protected static $_count = 0;
		protected $width;
		protected $height;

		function __construct($width, $height) {
			$this->width = $width;
			$this->height = $height;
			self::$_count++;
			echo "已成功建立".self::$_count."個Rectangle物件<br>";
		}

		function __destruct() {
			echo "銷燬一個Rectangle物件<br>";
		}

		function getArea() {
			echo "Rectangle面積是:".($this->width * $this->height."<br>");
		}

		function getConunt() {
			return self::$_count;
		}
	}

	class Square extends Rectangle {
		function __construct($side) {
			$this->width = $side;
			$this->height = $side;
			parent::$_count++;
			echo "已成功建立".parent::$_count."個Rectangle(Square)物件<br>";
		}
	}

	$rec = new Rectangle(10, 5);
	$rec->getArea();

	$square = new Square(10);
	$square->getArea();

?>

執行結果: