摘要:變量對(duì)象屬性數(shù)組靜態(tài)變量不支持全局變量,也不允許訪問(wèn)用戶(hù)域的全局變量,但是可以訪問(wèn)的超級(jí)全局變量變量類(lèi)型支持動(dòng)態(tài)和靜態(tài)類(lèi)型。雖然失去了動(dòng)態(tài)型變量的靈活性,但是在編譯時(shí)靜態(tài)變量能進(jìn)行更多的優(yōu)化。
概述
Zephir的語(yǔ)法跟PHP很相似,所以這里不會(huì)把官網(wǎng)的文檔照搬過(guò)來(lái)翻譯一遍,而是會(huì)把一些Zephir相較于PHP比較特別的語(yǔ)法挑出來(lái)講一下。如果想要要完整學(xué)習(xí)Zephir的語(yǔ)法,沒(méi)有比官網(wǎng)的文檔更好的地方了。
基本語(yǔ)法Zephir的文件后綴名為zep,每個(gè)文件都必須包含且只能包含一個(gè)類(lèi)。每個(gè)類(lèi)必須有一個(gè)命名空間,且目錄結(jié)構(gòu)必須跟類(lèi)名和命名空間匹配。例如下面的目錄結(jié)構(gòu):
mylibrary/ router/ exception.zep # MyLibraryRouterException router.zep # MyLibraryRouter
那么exception.zep的命名空間和類(lèi)名如下:
phpnamespace MyLibraryRouter; class Exception extends Exception { }
Zephir里的變量名不需要像PHP那樣帶$符號(hào),且有兩種聲明的方式:
// 可以使用var來(lái)定義變量,或者指定具體的變量類(lèi)型 var a; int b; bool c = true; // 可以在一行里聲明多個(gè)變量 var a = "hello", b = 0, c;
要修改變量,屬性或者數(shù)組的值,需要使用let關(guān)鍵字。
let name = "Tony"; // 變量 let this->name = "Tony"; // 對(duì)象屬性 let data["name"] = "Tony"; // 數(shù)組 let self::_name = "Tony"; // 靜態(tài)變量
Zephir不支持全局變量,也不允許訪問(wèn)用戶(hù)域的全局變量,但是可以訪問(wèn)PHP的超級(jí)全局變量:
var price = _POST["price"]; var requestMethod = _SERVER["REQUEST_METHOD"];變量類(lèi)型
Zehpir支持動(dòng)態(tài)和靜態(tài)類(lèi)型。
動(dòng)態(tài)類(lèi)型動(dòng)態(tài)類(lèi)型變量跟PHP一樣,可以在賦值后修改為不同類(lèi)型的值。動(dòng)態(tài)類(lèi)型變量必須用var來(lái)聲明。
var a, b, c; // 初始化變量 let a = "hello", b = false; // 改變它們的值 let a = 10, b = "140"; // 對(duì)它們進(jìn)行操作 let c = a + b;
Zephir不會(huì)檢查整型的溢出,如果要操作比較大的數(shù)字,可以使用浮點(diǎn)型或者靜態(tài)型變量"unsigned long":
unsigned long my_number = 2147483648;
Zephir不支持在字符串里使用變量的方式,你可以使用拼接方式:
var name = "peter"; echo "hello: " . name;
數(shù)組的定義要用中括號(hào)[],且字符串型的鍵需要使用雙引號(hào):
let myArray = [1, 2, 3]; let myHash = [0: "first", 1: true, 2: null]; let myHash = ["first": 7.0, "second": "some string", "third": false];靜態(tài)變量
靜態(tài)變量一旦聲明類(lèi)型后就不能再改變。雖然失去了動(dòng)態(tài)型變量的靈活性,但是在編譯時(shí)靜態(tài)變量能進(jìn)行更多的優(yōu)化。
Zephir支持以下的靜態(tài)類(lèi)型:
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.
布爾型,非布爾值會(huì)自動(dòng)轉(zhuǎn)化為true或者false:
boolean a; let a = true, a = 100, // 自動(dòng)轉(zhuǎn)換為true a = null, // 自動(dòng)轉(zhuǎn)換為false a = "hello"; // 拋出編譯器異常
整型:
int a; let a = 50, a = -70, a = 100.25, // 自動(dòng)轉(zhuǎn)換為100 a = null, // 自動(dòng)轉(zhuǎn)換為0 a = false, // 自動(dòng)轉(zhuǎn)換為0 a = "hello"; // 拋出編譯器異常
無(wú)符號(hào)整型,帶符號(hào)整型的值會(huì)自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)。另外要注意的是,無(wú)符號(hào)整型的最大值要比普通整型大一倍,所以在把無(wú)符號(hào)整型的值賦予普通整型時(shí)要注意下:
uint a, int b; let a = 50, a = -70, // 自動(dòng)轉(zhuǎn)換為70 let a = 2147483648, b = a; // 可能會(huì)丟失數(shù)據(jù)
長(zhǎng)整型/無(wú)符號(hào)長(zhǎng)整型變量的值范圍是普通整型/無(wú)符號(hào)整型的兩倍,除此以外跟普通整型/無(wú)符號(hào)整型一致。
ulong a, long b; let a = 4294967296, b = a; // 可能會(huì)丟失數(shù)據(jù)
字符型:
har ch, string name = "peter"; let ch = name[2]; // 存儲(chǔ)"t" let ch = "Z"; // 需要用單引號(hào)
字符串:
string a; let a = "", a = "hello", // 使用用雙引號(hào) a = "A", // 自動(dòng)轉(zhuǎn)換為"A" a = null; // 自動(dòng)轉(zhuǎn)換為""
操作符更詳細(xì)的類(lèi)型語(yǔ)法請(qǐng)看這里:http://zephir-lang.com/types.html
Zephir支持的運(yùn)算符基本跟PHP一致:
// 算術(shù)運(yùn)算符 // Zephir支持PHP中除了`$a ** $b`(PHP 5.6才開(kāi)始支持)這種方式外的算術(shù)運(yùn)算符。 let c = a + b; // 比較運(yùn)算符 // Zephir支持的比較運(yùn)算符跟PHP一致(除了PHP 7增加支持的兩個(gè)比較運(yùn)算符外)。 if a == b { return 0; } // 邏輯運(yùn)算符 // Zephir支持`&&`、`||`和`!`這三個(gè)邏輯運(yùn)算符,但不支持PHP里`And`、`Or`和`Xor`這三個(gè)邏輯運(yùn)算符。 if a && b || !c { return -1; } // 位運(yùn)算符 // 跟PHP一致 if a & SOME_FLAG { echo "has some flag"; } // 三元運(yùn)算符 // 跟PHP一致 let b = a == 1 ? "x" : "y";
然后,Zephir還支持empty、isset等特殊的運(yùn)算符:
// empty // 如果表達(dá)式的值為null、空字符串或者空數(shù)組,則為empty let someVar = ""; if empty someVar { echo "is empty!"; } // isset // 用于檢查數(shù)組的索引或者對(duì)象的屬性是否已定義 // 功能更類(lèi)似于PHP中的array_key_exists方法 let someArray = ["a": 1, "b": 2, "c": 3]; if isset someArray["b"] { echo "yes, it has an index "b" "; } // fetch // 用于簡(jiǎn)化在PHP中以下的操作: if (isset($myArray[$key])) { $value = $myArray[$key]; echo $value; } // 使用fetch可以用以下代碼實(shí)現(xiàn),只有在key存在的情況下,fetch才返回true: if fetch value, myArray[key] { echo value; } // typeof // 用于檢查變量的類(lèi)型 if (typeof str == "string") { echo str; }
數(shù)組更詳細(xì)的操作符語(yǔ)法請(qǐng)看這里:http://zephir-lang.com/operators.html
數(shù)組可以使用關(guān)鍵字var和array進(jìn)行聲明:
var a = []; // 類(lèi)型可以改變 array b = []; // 運(yùn)行過(guò)程中,類(lèi)型不可以改變
數(shù)組使用中括號(hào)進(jìn)行創(chuàng)建,操作方式跟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"];
類(lèi)和對(duì)象 類(lèi)更詳細(xì)的數(shù)組操作語(yǔ)法請(qǐng)看這里:http://zephir-lang.com/arrays.html
前面說(shuō)過(guò),每個(gè)zephir文件都必須包含一個(gè)類(lèi),而且只能包含一個(gè)類(lèi)。
Zehpir的類(lèi)支持final和abstract兩個(gè)修飾符,修飾符的作用跟PHP中的一致,例如:
namespace Test; /** * 這個(gè)類(lèi)不能被擴(kuò)展 */ final class MyClass { }方法
類(lèi)的成員方法支持的可見(jiàn)性修飾符也跟PHP一致,支持public、protected和private,但Zephir強(qiáng)制方法必須顯式的帶上修飾符。
同時(shí)方法還支持final和deprecated兩個(gè)修飾符:
// 這個(gè)方法不能被重寫(xiě) public final function foo() { } // 調(diào)用此方法會(huì)拋出E_DEPRECATED 異常 public deprecated function foo() { }
方法的參數(shù)也支持PHP中可選參數(shù)的方式,同時(shí)也支持靜態(tài)類(lèi)型:
public function doSum(a, b = 3) { return a + b; } public function doSum2(int a = 4, int b = 2) { return a + b; }
使用靜態(tài)類(lèi)型參數(shù)時(shí),如果傳入的參數(shù)類(lèi)型不一致,Zephir會(huì)試圖對(duì)傳入值進(jìn)行類(lèi)型的轉(zhuǎn)換。如果基于某些考慮不想Zephir自動(dòng)去做這個(gè)事情,我們可以通過(guò)添加一個(gè)!號(hào)禁止這個(gè)行為:
public function filterText(string! text, boolean escape=false) { //... }
另外我們還能通過(guò)const關(guān)鍵字設(shè)置參數(shù)為只讀:
// a為只讀 public function getSomeData(const string a) { // 這里會(huì)拋出編譯錯(cuò)誤 let a = "hello"; }
Zephir還提供了方法返回類(lèi)型的提示功能,使得編譯器可以知道方法返回的類(lèi)型:
namespace App; class MyClass { public function getSomeData() -> string { // 這里會(huì)拋出編譯異常。因?yàn)榉祷刂凳遣紶栃?,跟期待的返回?lèi)型不一致 return false; } public function getSomeOther() ->屬性{ // 這里會(huì)拋出編譯異常,如果返回的對(duì)象不是AppMyInterface接口的一個(gè)實(shí)現(xiàn) return new AppMyObject; } public function process() { var myObject; // 類(lèi)型提示會(huì)告訴編譯器myObject是AppMyInterface的一個(gè)實(shí)例 let myObject = this->getSomeOther(); // 編譯器會(huì)檢查AppMyInterface是否實(shí)現(xiàn)了一個(gè)叫someMethod的方法 echo myObject->someMethod(); } // 一個(gè)方法可以有多個(gè)的返回類(lèi)型,使用|進(jìn)行分隔 public function getSomeData2(a) -> string | bool { if a == false { return false; } return "error"; } // 如果返回類(lèi)型為void,則表示此方法不允許返回任何數(shù)據(jù) public function setConnection(connection) -> void { let this->_connection = connection; } }
類(lèi)的屬性同樣支持public、protected和private三個(gè)修飾符,而且必須顯式指定:
namespace Test; class MyClass { public myProperty1; protected myProperty2; private myProperty3; // 屬性可以賦予默認(rèn)值,但是這個(gè)值必須在編譯的時(shí)候就能知道而不需要依賴(lài)于運(yùn)行環(huán)境 protected myProperty4 = 5; protected myProperty5 = "my value"; public function setMyProperty1(var myProperty) { // 修改屬性的值 let this->myProperty1 = myProperty; } public function getMyProperty1() { // 讀取屬性的值 return this->myProperty1; } }
Zephir還提供了一個(gè)快捷的方式去實(shí)現(xiàn)Getter和Setter,例如下面的代碼:
namespace App; class MyClass { protected myProperty { set, get, toString }; protected someProperty = 10 { set, get }; }
相當(dāng)于:
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; } }
內(nèi)置方法更詳細(xì)的類(lèi)和對(duì)象的使用方式請(qǐng)看這里:http://zephir-lang.com/oop.html
Zephir自身也內(nèi)置了不少的方法,這些方法基本都是PHP中某些方法的OO實(shí)現(xiàn)。例如:
public function foo(string! s) { return strlen(s); } // 使用內(nèi)置方法 public function foo(string! s) { return s->length(); }
流程控制 條件語(yǔ)句更詳細(xì)的內(nèi)置方法使用方式請(qǐng)看這里:http://zephir-lang.com/builtin-methods.html
條件判斷語(yǔ)句中,if和switch語(yǔ)句跟PHP類(lèi)似,但需要注意的是,條件表達(dá)式的括號(hào)可以省略:
if a > 100 { echo "to big"; } elseif a < 0 { echo "to small"; } else { echo "ok"; } switch count(items) { }循環(huán)語(yǔ)句
循環(huán)語(yǔ)句中,用while、loop和for三種語(yǔ)句。
while語(yǔ)句跟PHP差不多,loop為Zephir增加的語(yǔ)句,用于創(chuàng)建一個(gè)無(wú)限的循環(huán):
let n = 40; loop { let n -= 2; if n % 5 == 0 { break; } echo x, " "; }
for的用法跟PHP有很大不同,例如:
// 循環(huán)數(shù)組 for item in ["a", "b", "c", "d"] { echo item, " "; } let items = ["a": 1, "b": 2, "c": 3, "d": 4]; for key, value in items { echo key, " ", value, " "; } // 遍歷字符串 string language = "zephir"; char ch; for ch in language { echo "[", ch ,"]"; }
三種循環(huán)語(yǔ)句中均支持break語(yǔ)句和continue語(yǔ)句。
文件包含Zephir中也提供了類(lèi)似PHP中require語(yǔ)句的語(yǔ)句:
if file_exists(path) { require path; }
注意這個(gè)語(yǔ)句只能用于包含PHP文件,而不能包含zephir文件。
異常處理更詳細(xì)的流程控制語(yǔ)法請(qǐng)看這里:http://zephir-lang.com/control.html
異常處理跟PHP也類(lèi)似:
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(); }
同時(shí)捕捉不同類(lèi)型的異常:
try { throw new Exception("This is an exception"); } catch RuntimeException|Exception, e { echo e->getMessage(); }
調(diào)用PHP函數(shù)更詳細(xì)的異常處理的使用方式請(qǐng)看這里:http://zephir-lang.com/exceptions.html
可以直接調(diào)用PHP中內(nèi)置的函數(shù),例如調(diào)用base64_encode函數(shù):
namespace MyLibrary; class Encoder { public function encode(var text) { if strlen(text) != 0 { return base64_encode(text); } return false; } }
用戶(hù)自己定義的函數(shù)也可以調(diào)用:
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的函數(shù)只接收和返回動(dòng)態(tài)變量,所以如果你傳入靜態(tài)變量的話,Zephir會(huì)隱式的創(chuàng)建一個(gè)臨時(shí)變量用于函數(shù)的調(diào)用。而返回的結(jié)果如果要賦值給靜態(tài)變量的話,需要作適當(dāng)?shù)念?lèi)型轉(zhuǎn)換:
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; } }
最后,如果我們需要?jiǎng)討B(tài)的對(duì)函數(shù)進(jìn)行調(diào)用,可以使用以下的方式:
namespace MyLibrary; class Encoder { public function encode(var callback, string text) { return {callback}(text); } }
閉包更詳細(xì)的函數(shù)的調(diào)用方法請(qǐng)看這里:http://zephir-lang.com/functions.html
Zephir里也支持閉包和匿名函數(shù),你可以把它返回給PHP:
namespace MyLibrary; class Functional { public function map(array! data) { return function(number) { return number * number; }; } }
也可以直接調(diào)用:
namespace MyLibrary; class Functional { public function map(array! data) { return data->map(function(number) { return number * number; }); } }
另外Zephir還提供了一個(gè)短語(yǔ)法用來(lái)定義閉包:
namespace MyLibrary; class Functional { public function map(array! data) { return number => number * number; } }參考
http://zephir-lang.com/index.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21045.html
摘要:概述是一個(gè)開(kāi)源的用于簡(jiǎn)化擴(kuò)展的創(chuàng)建和維護(hù)的語(yǔ)言。它使得不擅長(zhǎng)的開(kāi)發(fā)人員也能寫(xiě)出擴(kuò)展。是縮寫(xiě),讀音為。然后我們?cè)诶镎{(diào)用方法正常的話會(huì)輸出。至此我們也完成了我們的第一個(gè)擴(kuò)展。 概述 Zephir是一個(gè)開(kāi)源的用于簡(jiǎn)化PHP擴(kuò)展的創(chuàng)建和維護(hù)的語(yǔ)言。它使得不擅長(zhǎng)C/C++的PHP開(kāi)發(fā)人員也能寫(xiě)出PHP擴(kuò)展。Zephir是Zend Engine/PHP/Intermediate縮寫(xiě),讀音為zep...
摘要:變量作為函數(shù)返回值時(shí),必須聲明為動(dòng)態(tài)類(lèi)型。動(dòng)態(tài)變量與中的變量基本完全相同支持在使用時(shí)改變類(lèi)型。比較運(yùn)算符在運(yùn)算時(shí)考慮變量類(lèi)型,如果是動(dòng)態(tài)變量與一致。與不一致,語(yǔ)句可以沒(méi)有,表示忽略所有異常。 上一篇 《Zephir 簡(jiǎn)介》 簡(jiǎn)單介紹了環(huán)境搭建,編寫(xiě)了一個(gè)的簡(jiǎn)單示例。這一篇繼續(xù)介紹 Zephir 基礎(chǔ)。 基本語(yǔ)法Zephir 中,每個(gè)文件都必須有且只有一個(gè)類(lèi),每個(gè)類(lèi)都必須有一個(gè)命名空間,...
摘要:四使用語(yǔ)言開(kāi)發(fā)是我重點(diǎn)推薦的擴(kuò)展開(kāi)發(fā)框架,簡(jiǎn)明易懂,功能強(qiáng)大,開(kāi)發(fā)效率高,代碼易維護(hù),執(zhí)行速度快。優(yōu)點(diǎn)三支持,的擴(kuò)展開(kāi)發(fā)有兩套擴(kuò)展開(kāi)發(fā)框架,分別支持,,雖然框架代碼有兩個(gè),但是接口卻是一樣的。 PHP擴(kuò)展是高級(jí)PHP程序員必須了解的技能之一,對(duì)于一個(gè)初入門(mén)的PHP擴(kuò)展開(kāi)發(fā)者,怎么才能開(kāi)發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開(kāi)發(fā)的高級(jí)領(lǐng)域呢?本系列開(kāi)發(fā)教程將手把手帶您從入門(mén)進(jìn)入高級(jí)階段。本教程系列...
摘要:什么是是一種中間語(yǔ)言,以接近的語(yǔ)法來(lái)編寫(xiě)代碼,然后轉(zhuǎn)換編譯成擴(kuò)展,旨在簡(jiǎn)化擴(kuò)展的創(chuàng)建和可維護(hù)性。如果成功,會(huì)自動(dòng)生成文件到目錄你需要編輯填加擴(kuò)展測(cè)試一下就這樣,你也會(huì)擴(kuò)展開(kāi)發(fā)了附附編譯擴(kuò)展的方法 什么是 Zephir Zephir 是一種中間語(yǔ)言,以接近 PHP 的語(yǔ)法來(lái)編寫(xiě)代碼,然后轉(zhuǎn)換編譯成 PHP 擴(kuò)展,旨在簡(jiǎn)化 PHP 擴(kuò)展的創(chuàng)建和可維護(hù)性。利用編譯來(lái)提高性能和資源消耗,又不需...
摘要:更多關(guān)于的技術(shù)文章的擴(kuò)展是用語(yǔ)言編寫(xiě),是語(yǔ)言引擎,內(nèi)核。見(jiàn)提供了一種類(lèi)似的高級(jí)語(yǔ)言語(yǔ)法的方式,來(lái)自動(dòng)生成擴(kuò)展的語(yǔ)言代碼,使編寫(xiě)擴(kuò)展變得非常的簡(jiǎn)單。直接修改該文件的代碼,使用原擴(kuò)展的編輯方法也是可以滴。 更多關(guān)于PHP的技術(shù)文章http://www.codefrom.com/ php的擴(kuò)展是用c語(yǔ)言編寫(xiě),Zend是語(yǔ)言引擎,PHP內(nèi)核。在實(shí)際編寫(xiě)php擴(kuò)展的時(shí)候,需要使用大量的...
閱讀 1471·2021-09-30 09:57
閱讀 1480·2021-09-09 09:33
閱讀 2246·2021-09-04 16:40
閱讀 1811·2021-09-01 10:50
閱讀 3257·2021-09-01 10:31
閱讀 2549·2019-08-30 15:56
閱讀 2980·2019-08-30 15:44
閱讀 3484·2019-08-29 17:29