文档章节

zephir-(1)开篇介绍

喵了_个咪
 喵了_个咪
发布于 2016/02/26 15:26
字数 2375
阅读 671
收藏 16
点赞 2
评论 1

#zephir-开篇介绍#

##前言## 先在这里感谢各位zephir开源技术提供者

笔者在学习phalcon的过程中了解到,phalcon2.x版本通过了zephir重写,第一感觉是zephir这么牛逼?笔者赶紧尝试了一下,果不其然非常简单的就能写出一个C扩展的helloword,github上面有1000+个Star,紧接着我去搜索了一系列中文资料,但是比较失望,官方也没有提供中文文档,也没有中文社区,这么好东西这么好的技术,笔者觉得不能让他埋没,今天来开个坑,第一是对于官网的文档的一个译文工作,其次是结合自己的理解进行补充,希望大家喜欢!

注:笔者水平有限,说的不正确的地方希望大家多多指正,一同交流技术

附上:

喵了个咪的博客:w-blog.cn

zephir官网地址:http://zephir-lang.com/

github地址:https://github.com/phalcon/zephir

##1. zephir介绍##

那么今天的目的是什么,今天的目的不是告诉大家怎么用zephir编写PHP拓展,也不是zephir语法写那要写,中国有句老话千里之行始于足下我们先来简单的了解一下zephir他的特点和特性.

###1.1 简单易于开发###

相信大家和我有一样的经历,看到了yaf和phalcon在想为什么C语言的拓展框架可以这么的快,我自己能不能写一个出来呢,然后屁颠屁颠的跑去找资料找大神了解,大神说你去看一下**"PHP扩展开发及内核应用"**,结果大家都知道醉了,

主要原因是需要对C相对的熟悉并且对PHP内核API也要很熟悉,我觉得这已经不是门槛的问题了是太平洋的距离,就草草结束了研究.

当遇到zephir首先了解的就是复杂程度,结果花了10分钟就跟着流程做了一个小DEMO,就这点看来就开发效率这点看来无可厚非的的高效快速,大家感受一下:

namespace Kenny;

 class Kenny
 {
     public static function hello()
     {
         echo  "hello world";
     }
 }

编译之后引入到php.ini里面,使用方式如下:

use Kennry\Kennry;

echo Kennry::hello(), "/n";

zephir是一个解释器语言和PHP非常近似,通过zephir的机制编译成C语言,然后通过C编译出PHP拓展提供使用,把中间过程高度封装很大程度让PHP拓展开发简单了很多.

"PHP扩展开发及内核应用"地址:http://www.walu.cc/phpbook/

###1.2 zephir特性###

1.zephir是静态动态结合语言,在zephir内可以使用传统静态变量,也可以使用动态变量,灵活度高

2.内存安全,熟悉C程序的童鞋都知道C可以控制内存指针,其实用的不好是一件很危险的事情,zephir它不允许你使用指针,它提供了一个task-local垃圾收集器,以避免内存泄漏。

3.编译模式,zephir能狗编译主流系统Liunx/OSX/Windows能够识别的拓展程序

4.开发源代码的高级语言,以面向对象为基础,编写拓展都需要基于面向对象

###1.3 感受一下###

下面是官方提供的一个让大家感受一下的小例子作用是过滤变量返回字母字符

namespace MyLibrary;

class Filter
{
    public function alpha(string str)
    {
        char ch; string filtered = "";
        for ch in str {
           if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') {
              let filtered .= ch;
           }
        }
        return filtered;
    }
}

从PHP类可以使用如下:

<?php

$filter = new MyLibrary\Filter();
echo $filter->alpha("01he#l.lo?/1"); // 结果输出 hello

##2 为什么是Zephir##

今天的PHP应用程序必须平衡一系列问题包括稳定性、性能和功能。

每一个PHP应用程序是基于一组常见的组件或者说框架,这些公共组件是库/框架或它们的组合。一旦安装后很少改变,作为应用程序的基础,他们必须是有非常快的,

快速和强大的库会很复杂,由于高水平的抽象,一般的做法是约定基础库或框架很少改变,才有机会来改善性能和资源消耗

Zephir,您可以实现面向对象库/框架/应用程序,使您的应用程序速度提高,改善用户体验。

###2.1 如果你是一个PHP程序员…… ###

PHP是在使用的Web应用程序开发中最流行的语言之一。像PHP动态类型和解释语言,由于其灵活性,提供非常高的效率。

由于4,然后第5版,PHP是基于Zend引擎的实现。这是执行从字节码表示的PHP代码的虚拟机。Zend引擎是世界上每一个PHP的安装几乎目前,随着ZEPHIR,您可以创建在Zend引擎运行PHP扩展。

PHP托管ZEPHIR,所以他们显然有很多相似的地方,但是,他们有给ZEPHIR自己的个性的重要差异。例如,ZEPHIR更加严格,它可以让你减少编译步骤。

###2.2 如果你是一个C程序员…… ###

C是有史以来最强大的和流行的语言之一。 事实上,PHP是用C编写的, 这是PHP扩展的原因之一是可用的。 给你的自由 管理内存,使用低级别类型甚至内联汇编程序。

然而,用C开发大型应用程序可以把PHP或Zephir相比比预期的要长很多 一些错误是很难找到如果你不是一个有经验的开发人员。

Zephir设计是安全的,所以它没有实现指针或手动内存管理, 如果你是一个C程序员,你会觉得Zephir强大但更友好比C。

###2.3 编译VS解读###

编译通常会减慢下来的发展; 你需要多一点耐心,使你的代码编译运行它之前。此外,该解释趋于降低有利于生产率的性能

为了更高的效率,Zephir需要编译你的代码,但是他不会影响高生产效率,开发人员可以决定哪些应用程序的部分应当在ZEPHIR,哪些不是。

###2.4 静态类型和动态类型语言###

一般来说,在静态类型语言中,变量是绑定到一个特定类型的一生。 其类型不能改变,只能参考实例和兼容操作。 像C / c++语言实现的方案:

int a = 0;
a = "hello"; // not allowed

在动态类型,绑定到类型的值,而不是变量。 所以,一个变量可能引用 值的类型,然后重新分配后的值类型无关。 Javascript / PHP的例子 动态类型语言:

var a = 0;
a = "hello"; // allowed

尽管动态类型有着生产力的优势,但是动态语言并不能成为所有应用的选择,特别是对于非常大型代码库和高性能的应用程序

优化性能的动态语言像PHP是更具挑战性的比静态语言(如C)。 在静态语言中,优化器可以利用类型信息做出决策。 在动态语言中, 只有很有限的信息是可用的,这使得优化器的选择更加困难。

如果你需要非常高的性能, 静态语言可能是一个更安全的选择。

静态语言的另一个好处是编译器执行额外的检查。 编译器无法发现逻辑错误,这更重要, 但是编译器可以提前发现错误,动态语言只能在运行提示报错信息。

Zephir是静态和动态类型都允许使用的。

###2.5 代码保护###

在某些情况下,编译不显著提高性能,这可能是因为瓶颈所在 在应用程序的I / O(很有可能),而不是计算/内存限制。 然而,编译代码也可能带来某种程度的intelectual保护您的应用程序。 Zephir,产生本地二进制文件,你也有能力“隐藏”用户或客户的原始代码。

##3. 总结##

Zephir不是用来取代PHP或C,相反,我们认为这是一个补充,允许开发者进入代码编译和静态类型.Zephir正是试图加入从C和PHP的世界,美好的事物 寻找机会使他们的应用程序更快!,如果你喜欢PHP,如果你渴望执行效率,那就别犹豫赶快尝试一下zephir吧!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

zephir技术交流:246348908 欢迎大家的加入!

感谢zephir开发人员:

© 著作权归作者所有

共有 人打赏支持
喵了_个咪
粉丝 235
博文 133
码字总数 173973
作品 4
杨浦
技术主管
加载中

评论(1)

vb2005xu
vb2005xu
好东西,最近一直在学习写扩展
zephir-(2)安装和初体验

先在这里感谢各位zephir开源技术提供者 zephir主要是解决了PHP开发人员尝试编写和编译PHP拓展所能执行的代码的语言。这是一个支持动态/静态类型的语言,熟悉PHP开发人员可以很好的进行开发。...

喵了_个咪 ⋅ 2016/02/28 ⋅ 0

zephir-(5)类型

先在这里感谢各位zephir开源技术提供者 Zephir既可以使用动态类型也可以使用静态类型,这是zephir独特的一点,今天笔者就来和大家一同了解zephir中的基本的类型使用. 注:笔者水平有限,说的不正...

喵了_个咪 ⋅ 2016/03/07 ⋅ 0

zephir 安装 -- 类php语言风格的php扩展开发工具

原文链接:http://www.cleey.com/blog/single/id/809.html 首先简单介绍下zephir 这个工具 Zephir提供了一种类似php的高级语言语法的方式,来自动生成扩展的c语言代码,使编写php扩展变得非常...

Cleey ⋅ 2016/01/08 ⋅ 0

zephir-(3)你的第一个PHP拓展

先在这里感谢各位zephir开源技术提供者 在之前的介绍中大家不仅了解了zephir具体是一个什么样的语言,也get到了它的安装方式,成功安装到自己的系统上了.今天让我们来一同编写之前我们演示过的...

喵了_个咪 ⋅ 2016/03/02 ⋅ 0

zephir-(9)类和对象2

先在这里感谢各位zephir开源技术提供者 zephir全面使用对象编程,这就是为什么拓展的使用方式只能是方法和类,你也将看到,大部分的时间,运行时错误引发异常,而不是致命错误或警告。今天讲一...

喵了_个咪 ⋅ 2016/03/08 ⋅ 0

[Zephir官方文档翻译之三] 介绍 Zephir

介绍 Zephir Zephir是一种可以让PHP开发者尝试编写和编译可以被PHP执行代码的一种语言。它是动态/静态类型,它的一些特性对于PHP 开发者来说是非常的相似的。 Zephir的名字是取自Zend Engine...

风一样的世界 ⋅ 2014/09/26 ⋅ 0

[Zephir开发实践]用Zephir编写PHP扩展实践

场景描述 首先,还是强烈推荐一下Phalcon这个框架。 由于对这个框架很感兴趣,所以看了其官方文档,并在先前用PHP根据其思想写了两个Phalcon核心类,见链接: #年前福利#Phalcon框架部分核心...

暗夜在火星 ⋅ 2014/06/26 ⋅ 0

[Zephir官方文档翻译之五] 入门指导

入门指导 Zephir还有这本手册,是为了PHP开发者想开发C扩展并降低复杂度面打算的。 我们假设你有编程语言的基础。我们会在介绍的时候尽可能的向PHP,C,Javascript等语言的特点来陈述。 如果...

风一样的世界 ⋅ 2014/09/26 ⋅ 0

zephir-(7)数组

先在这里感谢各位zephir开源技术提供者 在java和c++中几乎所有的操作都是正对于类开展的,但是在php中你们常用的处理类型是什么,当然是数组,在Zephir中提供了一种使用PHP数组的方法,那么今天就...

喵了_个咪 ⋅ 2016/03/08 ⋅ 0

zephir-(8)类和对象1

先在这里感谢各位zephir开源技术提供者 zephir全面使用对象编程,这就是为什么拓展的使用方式只能是方法和类,你也将看到,大部分的时间,运行时错误引发异常,而不是致命错误或警告。今天讲一...

喵了_个咪 ⋅ 2016/03/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 25分钟前 ⋅ 0

React Native & Weex 区别

JS引擎 Weex使用V8, React native使用JSCore JS开发框架 ( Js Framework ) Weex基于vue.js(2W+ star)。小巧轻量的前端开发框架,组件化,数据绑定,2.0引入virtual dom。 ReactNative使用...

东东笔记 ⋅ 34分钟前 ⋅ 1

UIkit 分页组件动态加载简单实现

1. 问题描述 使用过UIkit分页组件的都清楚,UIkit的分页不能动态刷新数据,也就是不能在点击下一页的时候,动态从后台加载数据,并且刷新页数以及该页数上的数据,下面是一个简单实现,没有做...

影狼 ⋅ 35分钟前 ⋅ 0

Mobx入门之三:Provider && inject

上一节中<App/>组件传递状态temperatures给children -- <TemperatureInput />,如果组建是一个tree, 那么属性的传递则会非常繁琐。redux使用Provider给子组件提供store, connect将子组件和s...

pengqinmm ⋅ 36分钟前 ⋅ 0

魔兽世界 7.0版本 S23/S24/S25全职业普通+精锐套

  死亡骑士   (联盟)   (部落)   (精锐)   恶魔猎手   (联盟)   (部落)   (精锐)   德鲁伊   (联盟)   (部落)   (精锐)   猎人   (联盟) ...

wangchen1999 ⋅ 44分钟前 ⋅ 0

maven顶级pom和子pom的版本号批量修改

当一个版本发布,新起一个版本时,我们只需要手动修改一下项目中pom.xml的版本号就可以了。但是如果这个maven项目有很多的子模块项目,那么一个个手动的去改就显得费时费力又繁琐了。还好,m...

ArlenXu ⋅ 53分钟前 ⋅ 0

天气预报接口选择

分为两类收费和免费的 收费的 收费的就不用说了,各种云市场上都有 免费的 免费的最权威的就2个 中国天气网 中国万年历提供的天气API 百度 万年历提供的API有json和xml格式,xml提供的信息更...

SimonAt ⋅ 54分钟前 ⋅ 0

Elasticsearch究竟要设置多少分片数?

0、引言 在构建Elasticsearch集群的初期如果集群分片设置不合理,可能在项目的中后期就会出现性能问题。Elasticsearch是一个非常通用的平台,支持各种各样的用例,并且为数据组织和复制策略提...

tqyin ⋅ 54分钟前 ⋅ 0

php 如何获取指定session_id中的数据

代码如下: $sess_name = session_name(); $sess_id = $_POST[$sessname]; session_id($sess_id);//根据当前session_id=5f0bv0dke3p5tqdcuujtl3kkv7,获取指定session,如果session_id 存在,則......

qimh ⋅ 58分钟前 ⋅ 0

C++使用try,catch在VS2015中捕获异常

下面的代码: #include "stdafx.h"#include <iostream>int main(){try{char* pch;pch = (char*)00001234; //给予一个非法地址 *pch = 6; //对非法地址赋值,会造...

极客行 ⋅ 59分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部