PHP物件導向雜談

2021-06-22 00:25:23 字數 3861 閱讀 2414

php5.0還沒有命名空間的概念,所以通常類檔案的載入都是通過require,require_once,include,include_once. include()和require()語句的不同在於它們如何處理錯誤。使用require()呼叫檔案發生錯誤時,將會停止整個程式;呼叫include()時遇到相同的錯誤,則會生成警告並停止執行包含檔案,跳出呼叫**然後繼續執行。

require()和require_once用於包含庫檔案時更加安全,而include()和include_once()則適用於載入模板這樣的操作。必須了解的一點是require和require_once是語句而不函式。出於安全的考慮,應盡可能使用require & require_once

常常要載入一些基本的類檔案,如果通過using命名空間來匯入有時候也會過於繁雜,當然可以寫一些函式來包括某些類檔案,php5還提供了自動載入這一功能,只要實現function __autoload($classname)即可。

動態引用類

php可以動態地引用類,這一功能類似於反射,所謂的動態地引用類,只不過是給乙個類的字串,同樣也可例項化物件,如下**所示:

class testc 

}require_once './testc.php';

$classname = "testc";

$pro = new $classname();

print $pro->sayhello();

如果想讓系統能夠執行使用者建立的外掛程式,這個功能非常有用。在開發實際專案時,需要先檢查類是否存在、它是否擁有將要使用的方法等,以避免可能存在的風險。雖然php5有功能更強大的反射api,然而這些類函式更加接地氣,首選原因大概是它能夠與php4相容。

查詢類

class_exists()函式接受表示類的字串,檢查並返回布林值。檢查乙個類是否存在。**如下:

$classname = "testc";

$path = "./".$classname.'.php';

if(!file_exists($path))

require_once $path;

if(!class_exists($classname))

get_declared_classes()函式來獲得指令碼程序中定義的所有類的陣列。

get_class()函式用於獲取物件的類名字串。

對於判斷乙個物件是否某家族的乙個物件,instanceof可以解決。

get_class_methods()獲取類的方法陣列

is_callable()函式它接受字串變數形式的方法名作為第乙個引數,如果類方法存在且可被呼叫,則返回true.

也可以傳遞乙個陣列引數,陣列第乙個引數是類名或物件,第二個引數是方法。

method_exists()函式檢查乙個類或者物件是否存在某一方法,它比is_callable低階一些。

get_class_vars()函式返回乙個類或者物件的屬性陣列,屬性名為鍵名,屬性值作為鍵值。

get_parent_class()可以獲得乙個類的父類,如果不存在這樣的類,則返回false.

is_subclass_of()函式檢測類是否是另乙個類的派生類,它需要乙個子類物件和父類的名字。如果第二個引數是第乙個引數的父類的話,該函式就返回true. 乙個類是否實現了某個介面不能使用這個函式來確定。

call_user_func()可以呼叫方法或函式,要呼叫乙個函式,需要將字串作為它的第乙個引數。要呼叫類方法,則需要乙個陣列,第乙個引數是物件,第二個是呼叫的方法名。

call_user_func_array()函式可能更好用,因為它可以傳遞實實在在的引數,php中有__call***,也可以呼叫函式,但引數只能當成乙個陣列傳過去,而這個函式則可以還原成對應的引數列表。

反射

php對於反射實現了一些類,具體與下圖所示:

簡單的檢視乙個類的所有資訊**如下:

$classinfo = new reflectionclass($classname);

reflection::export($classinfo);

可以使用反射類中的函式來檢視關於的類的所有資訊,類宣告如下:類詳情

reflectionclass implements reflector

通過反射我們可以很容易實現檢視類的源**,乙個簡單的工具類如下:

class reflectionutil

}

也可以很容易檢視類的方法和屬性,這些可以使用另外兩個類reflectionmethod及reflectionproperty,它們可以通過reflectionclass類的方法getmethod(getmethods)及getproperty(getproperties)

來獲得.具體如何獲得相關資訊,可以檢視這兩個類的實現。reflectionproperty   |  reflectionmethod

其它一些反射類可以檢視php手冊。

下面乙個摘自一本書的例項,和大家分享一下,反射除了獲取類的基本資訊,還有乙個重要的方法:newinstance

它可以建立類的例項。

例項概要:從配置檔案中讀取要例項化類的相關資訊,然後例項化類,執行。也就是說這個類可以載入第三方外掛程式。為所有的外掛程式實現乙個module介面,它包含方法execute,有乙個modulerunner,負責依據配置檔案例項化類。所的實現了module介面的類中的設定方法都是setproperty的形式,這樣的做的原因是要能夠使modulerunner能夠識別這些方法並呼叫。具體**如下:

<?php 

class person

}inte***ce module

class personmodule implements module

public function execute() }

class ftpmodule implements module

public function setuser($user)

public function execute() }

<?php

require_once './testc.php';

class modulerunner

$module = $module_class->newinstance();

//對模組類的設定方法進行執行

foreach ($module_class->getmethods() as $method)

array_push($this->modulearr, $module);

} }private function handlemethod(module $module,reflectionmethod $method,$param)

//設定引數不在時

$property = strtolower(substr($methodname, 3));

if(!isset($param[$property]))

//確定引數的型別並執行之

$arg_class = $args[0]->getclass();

if(empty($arg_class))

else

}public function execute() }

$test = new modulerunner();

$test->init();

$test->execute();

?>

java 物件導向雜談

1.this在構造器中的應用 在不同的構造器中使用到相同的其它構造器內所有的因素,可以通過this呼叫。原因 便於維護 this.name name this.color color this name,color this.weight weight 2.過載 同乙個類中的帶有不同參的構造器。重寫...

C 物件導向以及STL雜談

繼承多型 動態多型 模板stl 關聯容器 封裝是什麼 隱藏物件的屬性和實現細節,僅對外公開介面和物件進行互動,將資料和運算元據的方法進行有機結合 c 語言中,強化了c語言的封裝特性,對內開放資料,對外遮蔽資料 提供介面 函式是封裝的一種形式 函式所執行的細節行為被封裝在函式本身這個更大的實體中,被封...

PHP物件導向

1 什麼是物件導向 起初,物件導向 是專指在程式設計中採用封裝 繼承 抽象等設計方法。可是,這個定義顯然不能再適合現在情況。物件導向的思想已經涉及到軟體開發的各個方面。如 物件導向的分析 ooa,object oriented analysis 物件導向的設計 ood,object oriented...