【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.mzph.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…