PHP define

不自在 发布于 2013/07/29 16:17
阅读 1K+
收藏 1
PHP

PHP里面是否有像C&C++头文件防止重复包含的功能?

c&C++ 头文件

#ifdef iostream

...

#endif

PHP

if(???){

define("MYSQL",1);

 ...

}

加载中
0
leo108
leo108
呵呵,include_once性能稍差,楼主可用defined()函数
岁月无痕
岁月无痕
回复 @不自在 : define("xxxx") || definle("xxx",'value')
leo108
leo108
回复 @php.by.live : 我只是提供楼主需要的函数而已,至于是否有意义……你问楼主吧
纠结名字_我艹你妹
纠结名字_我艹你妹
回复 @leo108 : 多个判断 有意义吗?
leo108
leo108
回复 @不自在 : 不都说了defined函数嘛……http://www.php.net/manual/zh/function.defined.php 非得要我帮你把文档地址都给你吗
不自在
不自在
关键在于怎么判断 "是否已定义"
0
Tuesday
Tuesday

include_once

php比其它语言都要人性化就体验在这儿.

0
南湖船老大
南湖船老大
function _requireOnce($file) {
    static $_files = array();
    if (!isset($_files[$file])) {
        if (is_file($file)) {
            require $file;
            $_files[$file] = true;
        } else {
            $_files[$file] = false;
        }
    }
}
南湖船老大
南湖船老大
回复 @leo108 : 底层框架的设计都是固定的,质量是可以保证的。如果上层的新手滥用,那谁也没办法。
leo108
leo108
回复 @pjx2013 : 新手把文件名命名为a.php 1.php的多了去,包含同名文件有什么奇怪的
pjx2013
pjx2013
回复 @leo108 : 感觉谈不上误导,新手也不会去include一个同名文件吧。
南湖船老大
南湖船老大
回复 @leo108 : 这个函数只负责管理加载啊,职责分开啊
leo108
leo108
回复 @好大的凶兆 : 如果真的是这样,为何不把另外的代码一起贴出来,不然这样容易误导
下一页
0
不自在
不自在
 改这样就可以.模仿C的头文件
#initize.php
if(!defined('INITIZE')){
	define('INITIZE',true);
	session_start();
	if($_SESSION['uname'])||!isset($_SESSION['crc'])||$_SESSION['crc']!=crc32($_SESSION['uname']))
	{
		$_SESSION = array();//
		echo "<strong style='text-align:center'>您未登录或已注销,请重新登录!</strong>";
		exit ("<meta http-equiv=\"Refresh\" content=\"1;url=/ARCHIVE/index.php\">");
	}
	
	//初始化,自动过滤传递过来的参数.
	$strr = array("'",'"','<','>',';','union');
	$strq = array(''','"','<','>',';','&'); //半角字符转换为全角,删除特殊字符
	
	// 遍历全部传递参数,过滤非法字符
	$_COOKIE = str_replace($strr,$strq,$_COOKIE);
	$_POST = str_replace($strr,$strq,$_POST);
	$_GET = str_replace($strr,$strq,$_GET);
}
0
f
f223156

引用来自“leo108”的答案

呵呵,include_once性能稍差,楼主可用defined()函数

那条是老黄历

早期include_once比include性能低是因为带once执行一次会fopen一次

但是php5.2.0时已经修正了这个问题

Optimized require_once() and include_once() by eliminating fopen(3) on second usage. (Dmitry)

放心大胆用好了

f
f223156
回复 @leo108 : 滥用include_once代替include当然不可取了, 但是楼主这个, 理论上include_once(语法调用+zend_hash_exists included_files)的开销是远远小于defined(函数调用+zend_hash_exists included_files)+include的
leo108
leo108
无论如何,once总会多一次判断,当然一般的网站对于这种细微的性能差别都是可以忽略
0
f
f223156
还有比如拼接字符窜, 没string buffer的语言里通俗用法是join array

但是现在php里 $str .= $segment是优化过的, 性能远远超过join array

所以优化性能这玩意儿还是得注重与时俱进
0
南湖船老大
南湖船老大

引用来自“f223156”的答案

引用来自“leo108”的答案

呵呵,include_once性能稍差,楼主可用defined()函数

那条是老黄历

早期include_once比include性能低是因为带once执行一次会fopen一次

但是php5.2.0时已经修正了这个问题

Optimized require_once() and include_once() by eliminating fopen(3) on second usage. (Dmitry)

放心大胆用好了

0
f
f223156

引用来自“好大的凶兆”的答案

引用来自“f223156”的答案

引用来自“leo108”的答案

呵呵,include_once性能稍差,楼主可用defined()函数

那条是老黄历

早期include_once比include性能低是因为带once执行一次会fopen一次

但是php5.2.0时已经修正了这个问题

Optimized require_once() and include_once() by eliminating fopen(3) on second usage. (Dmitry)

放心大胆用好了

第一, 这是apc的bug, 不是php的include_once问题, 更何况laruence篇末写了"(后记 2012-09-15 02:07:20: 这个APC的bug我已经修复: #63070)"


第二, laruence认为不该用include_once的原因是滥用, 即"排除这些技术因素, 我也一直认为, 我们应该使用include, 而不是include_once, 因为我们完全能做到自己规划, 一个文件只被加载一次. 还可以借助自动加载, 来做到这一点. 你使用include_once, 只能证明, 你对自己的代码没信心.",  简而言之,该用include就别用include_once, 而比起自己设置一个常量或者维护一个path数组,而楼主这里用include_once很明显不属于滥用


第三, 你们强调的性能问题


include_once仅仅是一次语法开销(Zend/zend_language_parser.y),  最终就是一次zend_hash_exists included_files


如果是defined('CONST') or include (..),  那需要的是一次函数开销(php里define和defined都是函数,不是语法), defined这个函数实现的也是zend_hash_find zend_constants, 相对include_once怎么可能性能反而高呢?


至于你的那个自己维护一个included文件数组的性能比起原生的zend_hash_exists included_files, 纯粹就是手工再实现一遍zend-vm_execute里ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER已经实现的功能,  也就5.2前无论如何都会fopen一次才有意义
0
南湖船老大
南湖船老大

引用来自“f223156”的答案

引用来自“好大的凶兆”的答案

引用来自“f223156”的答案

引用来自“leo108”的答案

呵呵,include_once性能稍差,楼主可用defined()函数

那条是老黄历

早期include_once比include性能低是因为带once执行一次会fopen一次

但是php5.2.0时已经修正了这个问题

Optimized require_once() and include_once() by eliminating fopen(3) on second usage. (Dmitry)

放心大胆用好了

第一, 这是apc的bug, 不是php的include_once问题, 更何况laruence篇末写了"(后记 2012-09-15 02:07:20: 这个APC的bug我已经修复: #63070)"


第二, laruence认为不该用include_once的原因是滥用, 即"排除这些技术因素, 我也一直认为, 我们应该使用include, 而不是include_once, 因为我们完全能做到自己规划, 一个文件只被加载一次. 还可以借助自动加载, 来做到这一点. 你使用include_once, 只能证明, 你对自己的代码没信心.",  简而言之,该用include就别用include_once, 而比起自己设置一个常量或者维护一个path数组,而楼主这里用include_once很明显不属于滥用


第三, 你们强调的性能问题


include_once仅仅是一次语法开销(Zend/zend_language_parser.y),  最终就是一次zend_hash_exists included_files


如果是defined('CONST') or include (..),  那需要的是一次函数开销(php里define和defined都是函数,不是语法), defined这个函数实现的也是zend_hash_find zend_constants, 相对include_once怎么可能性能反而高呢?


至于你的那个自己维护一个included文件数组的性能比起原生的zend_hash_exists included_files, 纯粹就是手工再实现一遍zend-vm_execute里ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER已经实现的功能,  也就5.2前无论如何都会fopen一次才有意义

我觉得自己维护一个include数组+自动加载会比include_once更好,我也一直这么来。

include_once的性能问题不是你说的open问题吧,而是搜索include path导致的性能问题(?不确定,应该是用了相对路径才有这个问题)。

很多老项目,开源项目,作者水平有限,只能include_once来避免多次加载。如果是新项目,不建议这么用。当然如果是我接触老项目的话,我不想给自己找麻烦,还是会用xxx_once。

返回顶部
顶部