#zephir-類和對象1#git
##前言## 先在這裏感謝各位zephir開源技術提供者github
zephir全面使用對象編程,這就是爲何拓展的使用方式只能是方法和類,你也將看到,大部分的時間,運行時錯誤引起異常,而不是致命錯誤或警告。今天講一步步講解zephir類方法變量範圍等等的使用,但願你們喜歡.編程
注:筆者水平有限,說的不正確的地方但願你們多多指正,一同交流技術c#
附上:數組
喵了個咪的博客:w-blog.cnthis
zephir官網地址:http://zephir-lang.com/spa
github地址:https://github.com/phalcon/zephircode
##Class##對象
每一個Zephir文件必須實現一個類或一個接口(只能一個)。類的結構很是相似於PHP的一個類:blog
namespace Test; /** * 這是一個示例類 */ class MyClass { }
##類的修飾符##
支持下面的類修飾符:
Final:這個類不能被extended:
namespace Test; /** * 他的類不能被另外一個類extended */ final class MyClass { }
Abstract:這個類不能被實例化:
namespace Test; /** * 這個類不能被實例化 */ abstract class MyClass { }
##類的方法##
「function」關鍵字引入了一個方法。通常的方法都實現了可見性的定義,每一個方法都必須設置可見性這是zephir強制的:
namespace Test; class MyClass { public function myPublicMethod() { // ... } protected function myProtectedMethod() { // ... } private function myPrivateMethod() { // ... } }
方法能夠接收必需和可選參數:
namespace Test; class MyClass { /** * 全部參數是必需的 */ public function doSum1(a, b) { return a + b; } /** * 只有「a」是必需的,「b」是可選的,它有一個默認值 */ public function doSum2(a, b = 3) { return a + b; } /** * 這兩個參數是可選的 */ public function doSum3(a = 1, b = 2) { return a + b; } /** * 參數須要和它們的值必須是整數 */ public function doSum4(int a, int b) { return a + b; } /** * 靜態類型的默認值 */ public function doSum4(int a = 4, int b = 2) { return a + b; } }
##可選參數能夠爲空##
這個編譯器保證當一個變量是null值時,Zephir會把null轉換成最接近的值:
public function foo(int a = null) { echo a; // 「打印0 } public function foo(boolean a = null) { echo a; // 打印false } public function foo(string a = null) { echo a; // 打印空字符串 } public function foo(array a = null) { var_dump(a); // 打印空數組 }
##可見性##
##可修改性##
##Getter/Setter 快捷操做##
在c#中,您可使用get / set / toString Zephir-shortcuts,該特性容許輕鬆地編寫setter和getter屬性而不用明顯的去實現這些方法。
例如,沒有捷徑,咱們能找到的代碼:
namespace Test; class MyClass { protected myProperty; protected someProperty = 10; public function setMyProperty(myProperty) { this->myProperty = myProperty; } public function getMyProperty() { return this->myProperty; } public function setSomeProperty(someProperty) { this->someProperty = someProperty; } public function getSomeProperty() { return this->someProperty; } public function __toString() { return this->myProperty; } }
您可使用shortcuts寫相同的代碼以下:
namespace App; class MyClass { protected myProperty { set, get, toString }; protected someProperty = 10 { set, get }; }
當代碼編譯這些方法導出爲真正的方法,但你不須要把它們寫一個接一個。
##返回類型提示##
類和接口中的方法能夠返回類型提示,這些將爲編譯器提供有用的額外信息 通知您關於您的應用程序中的錯誤。 參考下面的例子:
namespace App;
class MyClass { public function getSomeData() -> string { // 這將拋出一個編譯器異常 // 返回值以來(boolean)不匹配 // 預期的返回類型爲string return false; }
public function getSomeOther() -> <App\MyInterface> { // 這將拋出一個編譯器異常 // 若是沒有實現返回的對象 // 預期的結果是App\MyInterface return new App\MyObject; } public function process() { var myObject; //類型,提示會告訴編譯器 // myObject是一個類的實例 // 實現應用 App\MyInterface let myObject = this->getSomeOther(); // 若是使用App\MyInterface編譯器將檢查 // 實現了一個名爲「someMethod」的方法 echo myObject->someMethod(); }
}
##返回類型:Void##
方法也能夠標記爲「Void」。 這意味着一個方法不容許返回任何數據:
public function setConnection(connection) -> void { let this->_connection = connection; }
這是爲何有用嗎?由於若是程序指望從這些方法的返回值,編譯器能夠檢測和產生一個編譯器異常:
let myDb = db->setConnection(connection); myDb->execute("SELECT * FROM robots"); // 這將產生一個異常
##總結##
應爲確實zephir的類方法這一塊的類容比較多,筆者在這裏分紅兩個小節進行說明,多謝你們的支持!
注:筆者能力有限有說的不對的地方但願你們可以指出,也但願多多交流!
zephir技術交流:246348908 歡迎你們的加入!
感謝zephir開發人員: