1. 程式人生 > 其它 >zephir-(8)類和物件1

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開發人員: