日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Zephir入门 —— 语法篇

發布時間:2025/5/22 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Zephir入门 —— 语法篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

Zephir的語法跟PHP很相似,所以這里不會把官網的文檔照搬過來翻譯一遍,而是會把一些Zephir相較于PHP比較特別的語法挑出來講一下。如果想要要完整學習Zephir的語法,沒有比官網的文檔更好的地方了。

基本語法

Zephir的文件后綴名為zep,每個文件都必須包含且只能包含一個類。每個類必須有一個命名空間,且目錄結構必須跟類名和命名空間匹配。例如下面的目錄結構:

mylibrary/router/exception.zep # MyLibrary\Router\Exceptionrouter.zep # MyLibrary\Router

那么exception.zep的命名空間和類名如下:

namespace MyLibrary\Router;class Exception extends \Exception { }

Zephir里的變量名不需要像PHP那樣帶$符號,且有兩種聲明的方式:

// 可以使用var來定義變量,或者指定具體的變量類型 var a; int b; bool c = true; // 可以在一行里聲明多個變量 var a = "hello", b = 0, c;

要修改變量,屬性或者數組的值,需要使用let關鍵字。

let name = "Tony"; // 變量 let this->name = "Tony"; // 對象屬性 let data["name"] = "Tony"; // 數組 let self::_name = "Tony"; // 靜態變量

Zephir不支持全局變量,也不允許訪問用戶域的全局變量,但是可以訪問PHP的超級全局變量:

var price = _POST["price"];var requestMethod = _SERVER["REQUEST_METHOD"];

變量類型

Zehpir支持動態和靜態類型。

動態類型

動態類型變量跟PHP一樣,可以在賦值后修改為不同類型的值。動態類型變量必須用var來聲明。

var a, b, c;// 初始化變量 let a = "hello", b = false; // 改變它們的值 let a = 10, b = "140"; // 對它們進行操作 let c = a + b;

Zephir不會檢查整型的溢出,如果要操作比較大的數字,可以使用浮點型或者靜態型變量'unsigned long':

unsigned long my_number = 2147483648;

Zephir不支持在字符串里使用變量的方式,你可以使用拼接方式:

var name = "peter";echo "hello: " . name;

數組的定義要用中括號[],且字符串型的鍵需要使用雙引號:

let myArray = [1, 2, 3]; let myHash = [0: "first", 1: true, 2: null]; let myHash = ["first": 7.0, "second": "some string", "third": false];

靜態變量

靜態變量一旦聲明類型后就不能再改變。雖然失去了動態型變量的靈活性,但是在編譯時靜態變量能進行更多的優化。

Zephir支持以下的靜態類型:

  • boolean: A boolean expresses a truth value. It can be either ‘true’ or ‘false’.
  • integer: Signed integers. At least 16 bits in size.
  • unsigned integer: Unsigned integers. At least 16 bits in size.
  • char: Smallest addressable unit of the machine that can contain basic character set.
  • unsigned char: Same size as char, but guaranteed to be unsigned.
  • long: Long signed integer type. At least 32 bits in size.
  • unsigned long: Same as long, but unsigned.
  • float/double: Double precision floating-point type. The size is platform-dependent.
  • string: A string is series of characters, where a character is the same as a byte.
  • unsigned long: Same as long, but unsigned.
  • array: An structure that can be used as hash, map, dictionary, collection, stack, etc.

布爾型,非布爾值會自動轉化為true或者false:

boolean a;let a = true,a = 100, // 自動轉換為true a = null, // 自動轉換為false a = "hello"; // 拋出編譯器異常

整型:

int a;let a = 50,a = -70, a = 100.25, // 自動轉換為100 a = null, // 自動轉換為0 a = false, // 自動轉換為0 a = "hello"; // 拋出編譯器異常

無符號整型,帶符號整型的值會自動轉換為無符號。另外要注意的是,無符號整型的最大值要比普通整型大一倍,所以在把無符號整型的值賦予普通整型時要注意下:

uint a, int b;let a = 50,a = -70, // 自動轉換為70 let a = 2147483648, b = a; // 可能會丟失數據

長整型/無符號長整型變量的值范圍是普通整型/無符號整型的兩倍,除此以外跟普通整型/無符號整型一致。

ulong a, long b;let a = 4294967296,b = a; // 可能會丟失數據

字符型:

har ch, string name = "peter";let ch = name[2]; // 存儲't' let ch = 'Z'; // 需要用單引號

字符串:

string a;let a = "",a = "hello", // 使用用雙引號 a = 'A', // 自動轉換為"A" a = null; // 自動轉換為""

更詳細的類型語法請看這里:http://zephir-lang.com/types.html

操作符

Zephir支持的運算符基本跟PHP一致:

// 算術運算符 // Zephir支持PHP中除了`$a ** $b`(PHP 5.6才開始支持)這種方式外的算術運算符。 let c = a + b;// 比較運算符 // Zephir支持的比較運算符跟PHP一致(除了PHP 7增加支持的兩個比較運算符外)。 if a == b { return 0; } // 邏輯運算符 // Zephir支持`&&`、`||`和`!`這三個邏輯運算符,但不支持PHP里`And`、`Or`和`Xor`這三個邏輯運算符。 if a && b || !c { return -1; } // 位運算符 // 跟PHP一致 if a & SOME_FLAG { echo "has some flag"; } // 三元運算符 // 跟PHP一致 let b = a == 1 ? "x" : "y";

然后,Zephir還支持empty、isset等特殊的運算符:

// empty // 如果表達式的值為null、空字符串或者空數組,則為empty let someVar = ""; if empty someVar { echo "is empty!"; } // isset // 用于檢查數組的索引或者對象的屬性是否已定義 // 功能更類似于PHP中的array_key_exists方法 let someArray = ["a": 1, "b": 2, "c": 3]; if isset someArray["b"] { echo "yes, it has an index 'b'\n"; } // fetch // 用于簡化在PHP中以下的操作: if (isset($myArray[$key])) { $value = $myArray[$key]; echo $value; } // 使用fetch可以用以下代碼實現,只有在key存在的情況下,fetch才返回true: if fetch value, myArray[key] { echo value; } // typeof // 用于檢查變量的類型 if (typeof str == "string") { echo str; }

更詳細的操作符語法請看這里:http://zephir-lang.com/operators.html

數組

數組可以使用關鍵字var和array進行聲明:

var a = []; // 類型可以改變 array b = []; // 運行過程中,類型不可以改變

數組使用中括號進行創建,操作方式跟PHP一樣:

let elements = [];let elements = [1, 3, 4]; let elements = ["first", 2, true]; let elements[0] = "bar"; let elements = ["foo": "bar", "bar": "foo"]; let foo = elements["foo"];

更詳細的數組操作語法請看這里:http://zephir-lang.com/arrays.html

類和對象

前面說過,每個zephir文件都必須包含一個類,而且只能包含一個類。

Zehpir的類支持final和abstract兩個修飾符,修飾符的作用跟PHP中的一致,例如:

namespace Test;/*** 這個類不能被擴展*/ final class MyClass { }

方法

類的成員方法支持的可見性修飾符也跟PHP一致,支持public、protected和private,但Zephir強制方法必須顯式的帶上修飾符。

同時方法還支持final和deprecated兩個修飾符:

// 這個方法不能被重寫 public final function foo() { } // 調用此方法會拋出E_DEPRECATED 異常 public deprecated function foo() { }

方法的參數也支持PHP中可選參數的方式,同時也支持靜態類型:

public function doSum(a, b = 3) { return a + b; } public function doSum2(int a = 4, int b = 2) { return a + b; }

使用靜態類型參數時,如果傳入的參數類型不一致,Zephir會試圖對傳入值進行類型的轉換。如果基于某些考慮不想Zephir自動去做這個事情,我們可以通過添加一個!號禁止這個行為:

public function filterText(string! text, boolean escape=false) { //... }

另外我們還能通過const關鍵字設置參數為只讀:

// a為只讀 public function getSomeData(const string a) { // 這里會拋出編譯錯誤 let a = "hello"; }

Zephir還提供了方法返回類型的提示功能,使得編譯器可以知道方法返回的類型:

namespace App;class MyClass { public function getSomeData() -> 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(); } // 一個方法可以有多個的返回類型,使用|進行分隔 public function getSomeData2(a) -> string | bool { if a == false { return false; } return "error"; } // 如果返回類型為void,則表示此方法不允許返回任何數據 public function setConnection(connection) -> void { let this->_connection = connection; } }

屬性

類的屬性同樣支持public、protected和private三個修飾符,而且必須顯式指定:

namespace Test;class MyClass { public myProperty1; protected myProperty2; private myProperty3; // 屬性可以賦予默認值,但是這個值必須在編譯的時候就能知道而不需要依賴于運行環境 protected myProperty4 = 5; protected myProperty5 = "my value"; public function setMyProperty1(var myProperty) { // 修改屬性的值 let this->myProperty1 = myProperty; } public function getMyProperty1() { // 讀取屬性的值 return this->myProperty1; } }

Zephir還提供了一個快捷的方式去實現Getter和Setter,例如下面的代碼:

namespace App;class MyClass {protected myProperty { set, get, toString }; protected someProperty = 10 { set, get }; }

相當于:

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; } }

另外常量的使用也是支持的:

namespace Test;class MyClass { const MYCONSTANT1 = false; const MYCONSTANT2 = 1.0; public function someMethod() { return MyClass::MYCONSTANT1; } }

更詳細的類和對象的使用方式請看這里:http://zephir-lang.com/oop.html

內置方法

Zephir自身也內置了不少的方法,這些方法基本都是PHP中某些方法的OO實現。例如:

public function foo(string! s) { return strlen(s); } // 使用內置方法 public function foo(string! s) { return s->length(); }

更詳細的內置方法使用方式請看這里:http://zephir-lang.com/builtin-methods.html

流程控制

條件語句

條件判斷語句中,if和switch語句跟PHP類似,但需要注意的是,條件表達式的括號可以省略:

if a > 100 {echo "to big"; } elseif a < 0 { echo "to small"; } else { echo "ok"; } switch count(items) { }

循環語句

循環語句中,用while、loop和for三種語句。

while語句跟PHP差不多,loop為Zephir增加的語句,用于創建一個無限的循環:

let n = 40; loop {let n -= 2;if n % 5 == 0 { break; }echo x, "\n"; }

for的用法跟PHP有很大不同,例如:

// 循環數組 for item in ["a", "b", "c", "d"] { echo item, "\n"; } let items = ["a": 1, "b": 2, "c": 3, "d": 4]; for key, value in items { echo key, " ", value, "\n"; } // 遍歷字符串 string language = "zephir"; char ch; for ch in language { echo "[", ch ,"]"; }

三種循環語句中均支持break語句和continue語句。

文件包含

Zephir中也提供了類似PHP中require語句的語句:

if file_exists(path) {require path; }

注意這個語句只能用于包含PHP文件,而不能包含zephir文件。

更詳細的流程控制語法請看這里:http://zephir-lang.com/control.html

異常處理

異常處理跟PHP也類似:

try {// 可以在這里拋出異常throw new \Exception("This is an exception"); } catch \Exception, e { // 異常處理 echo e->getMessage(); }

如果不需要的話,保存異常信息的變量e可以省略:

try {throw new \Exception("This is an exception"); } catch \Exception { echo e->getMessage(); }

同時捕捉不同類型的異常:

try {throw new \Exception("This is an exception"); } catch RuntimeException|Exception, e { echo e->getMessage(); }

更詳細的異常處理的使用方式請看這里:http://zephir-lang.com/exceptions.html

調用PHP函數

可以直接調用PHP中內置的函數,例如調用base64_encode函數:

namespace MyLibrary;class Encoder {public function encode(var text) { if strlen(text) != 0 { return base64_encode(text); } return false; } }

用戶自己定義的函數也可以調用:

namespace MyLibrary;class Encoder {public function encode(var text) { if strlen(text) != 0 { if function_exists("my_custom_encoder") { return my_custom_encoder(text); } else { return base64_encode(text); } } return false; } }

由于PHP的函數只接收和返回動態變量,所以如果你傳入靜態變量的話,Zephir會隱式的創建一個臨時變量用于函數的調用。而返回的結果如果要賦值給靜態變量的話,需要作適當的類型轉換:

namespace MyLibrary;class Encoder {public function encode(string text) { string encoded = ""; if strlen(text) != 0 { let encoded = (string) base64_encode(text); return '(' . encoded . ')'; } return false; } }

最后,如果我們需要動態的對函數進行調用,可以使用以下的方式:

namespace MyLibrary;class Encoder {public function encode(var callback, string text) { return {callback}(text); } }

更詳細的函數的調用方法請看這里:http://zephir-lang.com/functions.html

閉包

Zephir里也支持閉包和匿名函數,你可以把它返回給PHP:

namespace MyLibrary;class Functional { public function map(array! data) { return function(number) { return number * number; }; } }

也可以直接調用:

namespace MyLibrary;class Functional { public function map(array! data) { return data->map(function(number) { return number * number; }); } }

另外Zephir還提供了一個短語法用來定義閉包:

namespace MyLibrary;class Functional { public function map(array! data) { return number => number * number; } }

總結

以上是生活随笔為你收集整理的Zephir入门 —— 语法篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。