【PHP 擴展開發】Zephir 基礎篇

上一篇 《Zephir 簡介》 簡單介紹了環境搭建,編寫了一個的簡單示例。這一篇繼續介紹 Zephir 基礎。

基本語法
Zephir 中,每個文件都必須有且只有一個類,每個類都必須有一個命名空間,目錄結構必須與所使用的類和命名空間的名稱相匹配,這一點和 PSR4 的約定一致,但是它是強制的。空間名和類名首字母大寫,文件名全部小寫。

變量
Zephir 支持動態類型和靜態類型。變量作為函數返回值時,必須聲明為動態類型。

動態變量與 PHP 中的變量基本完全相同,支持在使用時改變類型。

clipboard.png

與 PHP 不一樣,變量名不需要帶$符號,所有變量在使用前都需要先定義,動態類型通過 var 關鍵字聲明。

var a = 10,b,c;
let b = 20;
let c = a + b;

與 PHP 不一樣,字符串文字只能使用雙引號指定,不能用單引號,也不支持變量解析,比如這樣是不支持的。

var a = "變量解析{$test}"

靜態變量

靜態類型一旦被聲明,就不能更改。支持如下類型

clipboard.png

給靜態類型變量賦值,會先嘗試自動轉換,轉換失敗拋出異常

boolean a;
let a = 0; // a = false
let a = "string"; // 拋出異常

運算符

Zephir 的運算符與 PHP 基本一致。比較運算符在運算時考慮變量類型,如果是動態變量與 PHP 一致。不支持太空船操作符、空合并運算符。

特殊運算符 - Fetch

PHP

if (isset($myArray[$key])) {$value = $myArray[$key];echo $value;
}

Zephir

if fetch value, myArray[key] {echo value;
}

控制結構
Zephir 提供了 if/switch/while/loop/for 幾種語句,前三種與 PHP 基本一致。Zephir 控制語句中括號是非必選的。
loop 可以用來創建無限循環,相當于 while true

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

for 和 PHP 一樣支持索引 value 和 key => value

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

還非常友好的提供了反方向遍歷

let items = [1, 2, 3, 4, 5];for value in reverse items {echo value, "\n";
}

與 python 等語言一樣,遍歷一系列整數值,可以這么寫:

for i in range(1, 10) {echo i, "\n";
}

異常處理

異常處理與 PHP 類似,在try 語句中拋出異常,在 catch 中捕獲。

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

與 PHP 不一致,Zephir try 語句可以沒有 catch,表示忽略所有異常。

即,這是合法的

try {throw new \Exception("This is an exception");
}

捕獲多個異常也非常方便

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

附件1
官方文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536872.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java常見排序算法有哪些_Java中常用的6種排序算法詳細分解

排序算法很多地方都會用到,近期又重新看了一遍算法,并自己簡單地實現了一遍,特此記錄下來,為以后復習留點材料。廢話不多說,下面逐一看看經典的排序算法:1. 選擇排序選擇排序的基本思想是遍歷數組的過程中&…

python range函數

這個函數很簡單,就不寫例子了,看看語法,拿來即用 python range() 函數可創建一個整數列表,一般用在 for 循環中。 函數語法 range(start, stop[, step]) 參數說明: start: 計數從 start 開始。默認是從 0 開始。例如ra…

java tomcat重啟linux_Linux下tomcat重啟

進入Tomcat下的bin目錄cd/user/local/tomcat/bin關閉tomcat./shutdown.sh查看tomcat是否關閉ps -ef|grep java顯示以下信息,則Tomcat還未關閉root 7010 1 0 Apr19 ? 00:30:13 /usr/local/java/bin/java -Djava.util.logging.config.file/usr/loca…

左偏樹 P3377【模板】左偏樹(可并堆)

題目傳送門 代碼&#xff1a; /* code by: zstu wxk time: 2019/03/01 */ #include<bits/stdc.h> using namespace std; #define Fopen freopen("testdata.in","r",stdin); freopen("_out.txt","w",stdout); #define LL long lo…

lock 線程 java_JAVA多線程-基礎Lock Condition 并發集合

跟上一篇文章比較,這次改進了之前的代碼,使用了Lock Condition 和并發集合.代碼量減了一些,并且更加容易讀了.這篇代碼是上一篇的改進版,邏輯在前篇有說明,以防大家看不到,我再重現貼一遍.后續會使用高階的線程工具再次改進,以求代碼更簡單.代碼的邏輯:1)SProducer不停的產生nu…

mycat mysql ha 方案_7、基于 HA 機制的 Mycat 高可用--mycat

在實際項目中&#xff0c;Mycat 服務也需要考慮高可用性&#xff0c;如果 Mycat 所在服務器出現宕機&#xff0c;或 Mycat 服務故障&#xff0c;需要有備機提供服務&#xff0c;需要考慮 Mycat 集群。1、 高可用方案使用 HAProxy Keepalived 配合兩臺 Mycat 搭起 Mycat 集群&a…

爬蟲scrapy模塊

首先下載scrapy模塊 這里有驚喜 https://www.cnblogs.com/bobo-zhang/p/10068997.html 創建一個scrapy文件 首先在終端找到一個文件夾 輸入 scrapy startproject jy (項目件名) 修改setting文件配置 # Crawl responsibly by identifying yourself (and your website) on the us…

python canvas畫移動物體_如何實現Canvas圖像的拖拽、點擊等操作

上一篇Canvas的博文寫完后&#xff0c;有位朋友希望能對Canvas繪制出來的圖像進行點擊、拖拽等操作&#xff0c;因為Canvas繪制出的圖像能很好的美化。好像是想做爐石什么的游戲&#xff0c;我也沒玩過。Canvas在我的理解中就好像在一張畫布上繪制圖像&#xff0c;它只能看到卻…

Git基礎知識教程整理(Git基本操作)

Git簡介 Git是目前世界上最先進的分布式版本控制系統&#xff08;沒有之一&#xff09;。Linux之父Linux用C語言寫了Git分布式版本控制系統。 分布式版本控制系統與集中式版本控制系統的區別 區別分布式集中式中央服務器有&#xff0c;版本庫集中存放在中央服務器&#xff0c;工…

python plot map_使用matplotlibbasemap在邊界打印

我在繪制多邊形時遇到了困難&#xff0c;例如&#xff0c;在使用matplotlib basemap生成的地圖邊界上繪制多邊形。在下面的示例中&#xff0c;地圖邊界由日期線指定。我試圖通過指定三角形頂點的坐標來繪制一個跨越日期線的三角形。當所有的坐標都在地圖內時&#xff0c;這種方…

SQL查詢語句 group by后, 字符串合并

合并列值 --******************************************************************************************* 表結構&#xff0c;數據如下&#xff1a; id value ----- ------ aa bb aaa bbb ccc 需要得到結果&#xff1a; id values ------ ----------- aa,bb aaa…

Git 基礎 —— 常用命令

Git 基礎學習系列 Git 基礎 —— 安裝 配置 別名 對象Git 基礎 —— 常用命令Git 基礎 —— 常見使用場景Git基礎 —— Github 的使用git init 創建 Git 本地倉庫 遠端無倉庫&#xff0c;本地無倉庫&#xff0c;本地新建一個倉庫 git init git_learning 遠端有倉庫&#xff0c;…

python安裝caffe_Linux下caffe的安裝

下載caffe并保存到一個目錄下(推薦放到 /home 目錄)安裝依賴項&#xff1a;sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compilersudo apt-get install --no-install-recommends libboost-all-devsudo apt-…

linux 訪問Windows 共享文件的方法

2019獨角獸企業重金招聘Python工程師標準>>> 1 安裝Samba服務 2 啟動 samba服務 /etc/init.d/smb restart 3 安裝插件 cifs解決只讀掛載&#xff1a;yum install cifs-utils.x86_64 4 在windows下共享一個可以用的文件夾 5 將 windows 共享文件夾掛載到linux上 命令…

基于Blink構建親聽項目以及全鏈路debug項目實時響應能力

案例與解決方案匯總頁&#xff1a;阿里云實時計算產品案例&解決方案匯總 本文全面總結了大數據項目組在親聽項目以及全鏈路debug項目上進行的實時流處理需求梳理&#xff0c;架構選型&#xff0c;以及達成效果 一、背景介紹 1.1親聽項目 親聽項目專注于幫助用戶收集、展示、…

python的重點_python知識點

"""author:lei"""import os#os.path.join() 將分離的部分合成一個整體filenameos.path.join(/home/ubuntu/python_coding,split_func)print filename#輸出為&#xff1a;/home/ubuntu/python_coding/split_func#os.path.splitext()將文件名和擴展…

在既有系統中打通Apache Ignite、MySQL和Node.js

為什么80%的碼農都做不了架構師&#xff1f;>>> 介紹 在本系列的第一篇文章中&#xff0c;安裝了Node.js、Ignite的Node.js瘦客戶端包&#xff0c;并且測試了一個示例應用。在本文中&#xff0c;可以看一下Ignite在處理其它數據源&#xff08;比如關系數據庫&#…

java hashmap 的api_JAVA基礎--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

一、集合Collection1. 集合介紹變量&#xff1a;表示的內存中的一個空間&#xff0c;只能保存確定類型的單個數據數組&#xff1a;表示的是內存中的多個連續的空間&#xff0c;這些空間中可以存儲多個同類型的數據。后期繼續學習面向對象技術&#xff0c;我們在程序中開始創建對…

Vue進階知識筆記

利用v-for循環出的多個li標簽&#xff0c;點擊不同的li變換顏色 方法一 <ul v-for"(item,index) in list" :key"index" class"details"><li ref"lisd" click"faillist(index)" :class"{active:ind index}&qu…

teamcity mysql 配置_CentOS 7 上 TeamCity 安裝

CentOS 7 上 TeamCity 安裝非入門教程, 初次接觸centos/docker的朋友需要謹慎一. 安裝 MySQL為了后續的需要, 這里安裝了 Docker, 當然如果你已經有了 MySQL 或者其它推薦的數據庫[MySQL, PostgreSQL, Oracle, MS SQL], 則可忽略1. 安裝 Docker補充:# 啟動dockersudo systemctl…