php phar包require报错,被遗忘的 PHP5.3 新特性——Phar

看样子phar应该是山寨jar的吧,不过方便的确是方便许多。使用phar打包PHP代码的话,就可以直接在网上下载phar包,然后像这样直接运行他!

$ php foo.phar

我在本地自己做了个测试。建立了一个foo目录,目录里面有Foo.class.php和index.php两个文件:

// Foo.class.php

class Foo

{

public function __construct()

{

echo 'A Foo is created', PHP_EOL;

echo 'and the current dir is ', __DIR__;

}

}

// index.php

require __DIR__.'/Foo.class.php';

$foo = new Foo();

然后再写一个打包脚本来生成foo.phar文件:

// archive.php

// 要打包是需要在php.ini设置phar.readonly = off的,默认是on

$phar = new Phar('foo.phar', 0, 'foo.phar');

$phar->buildFromDirectory(__DIR__.'/foo');

执行

$ php archive.php

后当前目录下会多了一个foo.phar文件,这个时候执行php foo.phar,会发现跟执行php foo/index.php差不多的效果。PHP会自动将index.php作为phar包的bootstrap文件。

但是和直接执行foo/index.php有所区别的是,直接执行__DIR__显示的是/path/to/foo而执行phar包显示的是phar:///path/to/foo.phar,这说明执行phar包的时候PHP把.phar文件也当成一个目录,所以只要phar里面提到的文件路径都是用__DIR__来获取的话,phar随便放什么路径都是可以正确执行而不会出现路径问题的。

另外我发现如果index.php的require路径不用__DIR__常量而使用require './Foo.class.php',这样打包之后执行是会报错的,如果要做支持打包的程序,这点必须要注意。

对于打包大家应该都比较关心的问题是打包之后的性能问题。我在网上看到一个测试:http://marc.info/?l=php-internals&m=121394601217048&w=2,得出的结论是:打不打包对性能几乎没有任何的影响,无论你用不用APC什么的缓存技术。

下面再说说phar对于PHP程序设计的影响。我认为一个很大的影响是配置文件将更显现出他的重要地位。像PHP这种解释性的脚本语言,虽然我自己要设计程序的话配置文件我还是会习惯尽量和程序独立出来,但是我并不反对在某些逻辑代码里面直接写一些参数,只要能做到以后修改参数只用修改一处就行。我之所以这么认为是因为这本来就是解释性脚本语言相对于修改完一处代码就要重新编译的静态语言的一个大优点。不过phar这个东西相当于是个linker,刚才说的那个好处在使用phar之后就立马没有了,所以一个或者几个放在phar文件外面的配置文件就显得特别重要,特别是当你在代码里面使用Dependency Injection的时候,很有必要在phar外面放一个service container的描述文件来保持代码的灵活性。

df83231bee01dd4e52438731a8a0385e.png

写作累,服务器还越来越贵

求分担,祝愿好人一生平安

天使打赏人

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值