学院君 has written 703 articles

资深PHP工程师,Laravel学院院长

Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证

本教程基于 Laravel 5.4 开始之前首先准备好开发环境,我们假设你已经安装好 Laravel,至于 Vue 的引入,请参考官方文档。 做好上述准备工作后就可以开始我们的开发了,本教程中我们将演示文章发布页面的表单验证。 首先在 routes/web.php 中新增两条路由规则: Route::get(‘post/create’, ‘PostController@create’);…

[ PHP 内核与扩展开发系列] 流式访问:流的概览

通常直接文件描述符相比调用流包装层消耗更少的 CPU 和内存; 不过, 这样会将实现某个特定协议的所有工作都堆积到作为扩展开发者的身上,通过挂钩到流包装层,你的扩展代码可以透明的使用各种内建的流包装,比如HTTP、FTP,以及它们对应的 SSL 版本,另外还有 gzip 和 bzip2 压缩包装。通过 include 特定的 PEAR 或 PECL 模块,你的代码还可以访问其他协议, 比…

[ PHP 内核与扩展开发系列] INI 配置文件:声明和访问 php.ini 设置

在前面的章节中,我们已经学会了 MINIT、MSHUTDOWN,以及 RINIT 和 RSHUTDOWN 等函数的使用,这里我们将介绍并学习 php.ini 设置的使用。 INI 条目被定义在一个完整的独立块,位于 MINIT 方法所在的同一个源文件,并且用下面的一对宏来定义,并在这对宏之间放入一个或者多个条目:PHP_INI_BEGIN() 和 PHP_INI_END()。 这些宏方法…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:超全局变量的定义和使用

超全局变量的定义 在 PHP 中有一种“特殊”的全局变量,通常我们把它们称作超全局变量,所谓的超全局变量指的是在全部作用域中始终可用的内置变量,常见的比如 $_GET、$_POST、$_FILE等。 它们会在编译之前就声明,所以在普通的脚本中,可能无法定义其它的超级全局变量。在扩展中,使用超级全局变量最好的示例是 session 扩展,它使用 $_SESSION 在 session_st…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:全局变量的定义和使用

这一章节,我们将学习如何在 PHP 扩展中使用全局变量。 在扩展中定义全局变量 首先,我们需要在扩展的头文件中(默认是 php_*.h)中定义所有的全局变量。举个例子,比如我们要定义一个 unsigned long 类型的全局变量,可以这么做: ZEND_BEGIN_MODULE_GLOBALS(sample4) unsigned long counter; ZEND_END_MODUL…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:常量的底层实现

在脚本中使用扩展的一个方便之处是,人们可以改变自己定义的常量,你可以通过 define() 函数来定义一个常量。在内核中,我们将会使用 REGISTER_*_CONSTANT() 的家族函数来注册常量。 对于自定义的大多数常量来说,你可能希望在程序初始化的时候便定义这些常量: PHP_MINIT_FUNCTION(sample4) { REGISTER_STRING_CONSTANT(“…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:MINFO 与 phpinfo() 函数

如果你并不打算做出一个只有你自己使用的扩展,那么你可能需要告诉用户一些关于你的扩展的信息。比如:其环境和特定版本的可用功能、版本信息、作者信息,以便在发生问题的时候可以寻求帮助,甚至可以加上一个 LOGO 等等。 如果你仔细看过 phpinfo() 或者 php -i 的输出,相信你已经注意到,所有这些信息会组合成一个格式良好的、易于解析输出的数据块。你的扩展可以轻松地通过模块信息函数 …

基于 Laravel 实现的实时社交书签系统 —— Voten(类似Reddit)

 关于 Voten Voten 是一个现代的实时社交书签系统,基于 Laravel 5.4 + Vue.js 开发,类似于 Reddit,但是更加美观,它实时、简单并且支持自定义。 网址:https://voten.co/ GitHub:https://github.com/voten-co/voten 代码风格 Voten 遵循 PSR-2 代码标准和 PSR-4 自动加载标准,并且…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:一次请求的生命周期

在前面的章节里,你已经学会了如何使用 MINIT 函数在 PHP 加载模块的共享库时来执行初始化任务。在第一章,你还了解到扩展里其他三个函数:和 MINIT 函数对应的 MSHUTDOWN 函数,以及在每个页面请求开始和结束时候调用的方法 —— RINIT 函数和 RSHUTDOWN 函数。 除了上面说到的四个函数,还有两个函数只用于处理单个线程的启动和关闭,它们只作用于线程环境。 回顾…

[ PHP 内核与扩展开发系列] 类与面向对象:访问对象实例的属性和方法

上一章节里,我们看了一下如何在 PHP 扩展里定义类与接口,这一章节我们将学习一下如何在 PHP 扩展中操作类的实例 —— 对象。PHP语言中的面向对象其实是分为三个部分来实现的:class、object、refrence。class 就是我们所说的类,可以直观的理解为前面章节中所描述的 zend_class_entry。object 就是类的实际对象。每一个 zval 并不直接包含具体…