zephir-(3)你的第一个PHP拓展
#zephir-你的第一个PHP拓展#
##前言## 先在这里感谢各位zephir开源技术提供者
在之前的介绍中大家不仅了解了zephir具体是一个什么样的语言,也get到了它的安装方式,成功安装到自己的系统上了.今天让我们来一同编写之前我们演示过的一些拓展让我们来一同动起手来尝试一下.
注:笔者水平有限,说的不正确的地方希望大家多多指正,一同交流技术
附上:
喵了个咪的博客:w-blog.cn
zephir官网地址:http://zephir-lang.com/
github地址:https://github.com/phalcon/zephir
##1. 第一个拓展##
Zephir和这本书(官方文档和此译文讲解)的目的是为PHP开发人员想要用较低的复杂性创建c扩展。
假设你有一个或多个其他编程语言的经验,我们将指出zephit和PHP中,C、Javascript和其他语言有很多相似的特性,以及新的或不同的许多特性。
如果你已经成功安装Zephir,你必须能够在您的控制台执行以下命令:
$ zephir help
如果一切都好,你应该在你的屏幕上看到以下帮助信息.
###1.1 扩展框架###
我们要做的第一件事就是生成一个扩展框架,这将提供给我们扩展的基本 我们需要开始工作的结构。 在我们的例子中,我们将创建一个扩展名为“utils”:
$ zephir init utils
执行之后,一个目录称为“utils”创建在当前工作目录:
$ cd utils
$ ls
ext/ utils/ config.json
目录“ext/”包含将要由编译器用于产生扩展的代码。创建的另一个目录是“utils”,在utils目录下面还有一个utils目录,我们将我们编写的Zephir代码放在在这个目录中。
目录列表也将向我们展示一个文件称为“config.json”,该文件包含配置设置 我们可以用它来改变Zephir扩展的行为以及一些扩展信息。
###1.2 我们的第一节课###
Zephir生成面向对象的扩展。开始开发,我们需要给我们的一个类添加到扩展功能。
正如在许多语言/工具,我们要做的第一件事就是写一个“Hello World”对zephir进行检查,因此,我们的第一个类将被称为“UtilsGreeting”,它包含的方法打印“hello world!”.。
这个类的代码必须被放置在“utils/utils/greeting.zep”:
namespace Utils;
class Greeting
{
public static function say()
{
echo "hello world!";
}
}
现在,我们需要告诉Zephir编译和生成的扩展,必须在根目录:
$ zephir build
当然我们在编译中可能遇到很多问题比如:
PHP Warning: shell_exec().....
这是应为php.ini没有打开这些函数导致无法使用这些函数,我们找到disable_functions = 然后去掉后面的exec和shell_exec,passthr,systemzephir的编译依赖于这些函数
还有可能可能会看到如下提示:
error: re2c is not installed
这是应为没有安装re2c拓展,执行如下语句安装:
wget http://downloads.sourceforge.net/project/re2c/0.15.3/re2c-0.15.3.tar.gz
tar zxf re2c-0.15.3.tar.gz && cd re2c-0.15.3
./configure
make && make install
如果一切顺利,您将看到以下消息 的输出:
...
Extension installed!
Add extension=utils.so to your php.ini
Don't forget to restart your web server
最后,必须添加到php扩展。 php.ini中加入extension=utils.so。
现在,添加到您的php扩展。 ini,检查是否正常加载扩展通过执行以下:
$ php -m
[PHP Modules]
Core
date
libxml
pcre
Reflection
session
SPL
standard
tokenizer
utils
xdebug
xml
扩展“utils”必须的一部分输出表明扩展是正确加载。 现在,让我们看看我们 “hello world”直接执行的PHP。 为此,您可以创建一个简单的PHP文件调用静态方法 刚刚创建的:
<?php
echo UtilsGreeting::say(), "n";
恭喜你! ,你第一次上运行PHP扩展。
##2 一个有用的类##
“hello world”类很好检查如果我们的环境是对的,现在,让我们创建一些更有用的类。
第一个有用的类,我们要添加此扩展将为用户提供过滤设备。 这个类被称为“UtilsFilter”,其代码都必须放置在“utils/Utils/filter.zep”:
namespace Utils;
class Filter
{
}
类包含过滤方法,帮助用户过滤不必要字符串。 第一个方法叫做“alpha”,其目的是过滤只有那些ascii字符基本的字母。 开始,我们只是将遍历每个字节字符串打印到标准输出:
namespace Utils;
class Filter
{
public function alpha(string str)
{
char ch;
for ch in str {
echo ch, "n";
}
}
}
当调用这个方法:
<?php
$f = new UtilsFilter();
$f->alpha("hello");
你会看到:
h
e
l
l
o
检查每个字符的字符串都是简单的,我们现在就可以创建另一个字符串过滤字符:
class Filter
{
public function alpha(string str) -> string
{
char ch; string filtered = "";
for ch in str {
if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') {
let filtered .= ch;
}
}
return filtered;
}
}
完整的方法也可以像之前测试:
<?php
$f = new UtilsFilter();
echo $f->alpha("!he#02l3'121lo.");
##3. 总结##
这是一个非常简单的教程,你可以看到,很容易使用Zephir开始构建扩展,后面我们更深入的学习会和所有语言一样从最基础变量语法开始,一步一步深入,最后多谢大家的支持!
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
zephir技术交流:246348908 欢迎大家的加入!
感谢zephir开发人员:
- SQL可以正常用,但cmd启动不了mysql,报错[ERROR] unknown variable ;basedir=....问题
- Percona-toolkit的安装和配置(r8笔记第86天)
- 分布式服务框架 Zookeeper
- python--类方法、对象方法、静态方法
- Go语言内存分配器的实现
- Go 语言 数据库操作之链接数据库实现
- 对于tnsping的连接超时的功能补充(r9笔记第3天)
- struts2拦截器源码分析
- Go语言学习(一):hello world
- JAVA基础知识点:内存、比较和Final
- python django 学习(一)数据库 目的根据已有BBS建立新的网站步骤
- SpringMVC中@RequestMapping的基本用法
- Java面试系列13
- 【Go 语言 时间相关操作 demo】
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 连通域的原理与Python实现
- 涨见识!Java String转int还有这种写法
- RTSP拉流协议视频平台EasyNVR能够接入多少路视频直播流?
- 安装allure后执行命令后报错 INTERNALERROR> AttributeError: module 'pytest' has no attribute 'allure'
- 太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜
- SwiftUI:与 MapKit 协调器通信
- SwiftUI:集成 MapKit
- Seurat教程 || 分析Cell Hashing数据
- 图数据库之TinkerPop Provider
- SwiftUI:用枚举切换视图状
- 【POI】maven引用POI的依赖,XSSFWorkbook依旧无法使用的问题。
- SwiftUI: 将数据写入文档目录
- 如何从YouTube搬运视频?| Mixlab代码入门
- 「MoreThanJava」Day 7:接口详解
- Python 基础(十一):面向对象