鲁夫的爱

php5.4 实现类似node.js 的module 设计

分类: 小小极客    标签: ,     评论: 无人评论 快抢沙发

我很喜欢node.js 的module, 只通过exports 导出变量的设计能把局部变量封装得很好.

	/*
	 * This is a module
	 */

	var a = 1;
	//Can't be accessed outside the module.

	var b = 2;
	exports.some = b;
	//Exported to be exposed.

但是php 里通过include() 和require() 包含的各个文件都是共用scope 的.

< ?php
	/*
	 * 1.php
	 */
	$a=1;
?>
< ?php
	/*
	 * 2.php
	 */
	include('1.php');
	echo $a; //1
?>

有木有办法把1.php 里的一些变量隐藏呢? 通常的做法是利用Class 的权限管理, private 修饰的成员不对外可见, public 修饰的成员可由其他组件调用.

但是我不喜欢在小项目里引入这样的做法. php5.4 引入了函数式编程的思想, 函数也可以作为一种数据类型了.

< ?php
	$a=function(){
		echo 1;
	};
	get_class($a); //'Closure'
?>

下面我们用php5.4 来模仿一下nodejs .

设定一个工具函数loadModule($path), 用以载入模块, 返回模块中的exports 变量.

< ?php
	/*
	 * utils.php
	 * loadModule function
	 * @param $path (string), the path of a module.
	 * @return the $exports variable inside a module.
	 */
	function loadModule($path){
		if(file_exists($path)){
			include($path);
			if(isset($exports)){
				return $exports;
			}
		}
	}
?>

这样我们就可以使用类似nodejs 的设计了.

< ?php
	/*
	 * someModule.php
	 * Will export two methods: someMethod and anotherMethod.
	 */
	$someMethod = function($param){
		var_dump($param);
	};
	$anotherMethod = function(){};
	$exports = [
		'someMethod' => $someMethod,
		'anotherMethod' => $anotherMethod,
	];
?>
< ?php
	/*
	 * invoke.php
	 */
	$someModule = loadModule('./someModule.php');
	//Similar to 'var someModule = require("someModule")' in nodejs.
	$someModule['someMethod'](['these','are','parameters']);
?>

我用这种方法把http://www.nodebeginner.org/ 上的例子重写了一遍. 内容比较简单, 没有什么功能.
下载: nodejs-alike-modules-for-php.zip

btw, php 新加入的数组字面量[] 真是太好用了, 希望php 再接再厉多移植一点javascript 特性.

本站文章除注明转载外,均为本站原创编译
转载请注明以下信息
文章转载自:鲁夫的爱 [ http://opengg.me/ ]
本文标题:php5.4 实现类似node.js 的module 设计
本文地址:http://opengg.me/791/nodejs-alike-modules-for-php/


05-10
2012

无觅相关文章插件,快速提升流量

loading...