zephir-(8)類和物件1
#zephir-類和物件1#
##前言## 先在這裡感謝各位zephir開源技術提供者
zephir全面使用物件程式設計,這就是為什麼拓展的使用方式只能是方法和類,你也將看到,大部分的時間,執行時錯誤引發異常,而不是致命錯誤或警告。今天講一步步講解zephir類方法變數範圍等等的使用,希望大家喜歡.
注:筆者水平有限,說的不正確的地方希望大家多多指正,一同交流技術
附上:
喵了個咪的部落格:w-blog.cn
zephir官網地址:http://zephir-lang.com/
github地址:https://github.com/phalcon/zephir
##Class##
每個Zephir檔案必須實現一個類或一個介面(只能一個)。類的結構非常類似於PHP的一個類:
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); // 列印空陣列
}
##可見性##
- Public:方法標記為“Public”,這意味著公共方法都能使用它。
- Protected:方法標記為“Protected”,這意味著只能呼叫在類中或類繼承中被呼叫。
- Private:方法標記為“Private”,這意味著私有方法僅對當前類使用。
##可修改性##
- Final:如果一個方法使用了這個修飾符將不能被過載
- Deprecated:方法標記為“Deprecated”丟擲E_DEPRECATED錯誤時呼叫。
##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() -> <AppMyInterface>
{
// 這將丟擲一個編譯器異常
// 如果沒有實現返回的物件
// 預期的結果是AppMyInterface
return new AppMyObject;
}
public function process()
{
var myObject;
//型別,提示會告訴編譯器
// myObject是一個類的例項
// 實現應用 AppMyInterface
let myObject = this->getSomeOther();
// 如果使用AppMyInterface編譯器將檢查
// 實現了一個名為“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開發人員: