|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
即使你理解不了PHP,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。 小小看法(参考风雪之隅及网上相干材料):
援用和复制的区分:
人人都晓得援用其实就是:$a = 1;$b = $a;改动$a或$b不会影响对方。而援用是按地址传值:$a = 1;$b = &$a;改动任何一个另外一个值城市改动。
然而在末尾加个why呢,为何会是如许呢?
人人需求了解php外面的两个机制就是copy on write 和 change on write:
copy on write :写时复制;使用于变量复制。例如下面例子,$a = 1;$a变量寄存在符号内外面,而值"1"寄存在zval中。意思也就是说php外面寄存
的变量,每一个变量名都寄存在符号内外面,每一个符号对应一个zval;zval可以看作一个容器,外面寄存着变量值,变量类型,等等。
$a = 1;$b = $a;能够会有人以为内存里有两个"1",实践上并非如许的,$a与$b都指向寄存1的zval容器。可以抽象比方为,$a与$b各自有条线指向
zval,zval中有个参数是refcount来计数的,就是统计有几何线指向本人的。当有个变量停止复制时分refcount就会加1。即:$a = 1;$b = $a;此时存
放1的zval布局外面的refcount值为2。php外面有个函数可以检查,就是debug_zval_dump($v);当debug_zval_dump($a);时分计数为3,由于$a是以
传值得模式传给debug_zval_dump的所以打印出来的值是3。
接着申明一个成绩,就是unset,它的感化是使变量的refcount数减一。也就是当refcount值为0的时分才会将变量值占的内存释放失落。当unset($b)的时分
1并没有在内存中释放失落,而是指向它的援用数减。
傍边说到的内存释能够其实不会释放给体系(OS),php会为本人启示个指定巨细的内存,当有变量发生时分会去本人的内存区外面请求,当释放的时分会释放到自
己的内存区域外面。关于进步效力有很大匡助了。然而当超越这个指定值得时分会去向体系请求内存了,那时分再释放的时分就会释放给体系了
关于援用,zval外面有另外一个参数is_ref来标志(标志是不是为真实的援用),此值默许为0,例如:$a = 1;$b = &$a;此时debug_zval_dump($a);了局为1,
refcount = 2,is_ref = 3,
版本5.2.17源码中的zval结合体,可以去官网下载
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount;
zend_uchar type; /* active type */
zend_uchar is_ref;
};
测试几个法式的履行速度
测试情况:
OS:win7
php vesion 5.2.9
apache2.0
1.判别变量值是不是为空用'!'加变量名字与empty加变量名做履行工夫对照(轮回1万万次)
if外面利用!$a履行工夫为:2.40036678314s
if外面利用empty($a)履行工夫为:2.52875089645s
测试代码:
$start = microtime(true);
$a = '';
for($i=0; $i < 10000000; $i++){
if(!$a){//可改成empty($a)
echo " ";
}
}
$end = microtime(true);
echo "履行工夫为:",($end-$start),"s";
?>
2.利用if-esle与利用三元运算符做履行工夫对照(轮回1万万次)
利用if-else 履行工夫为:2.37516283989s
利用三元运算符 履行工夫为:2.14390015602s
三元运算符运转时分,每次变量城市复制一次
if-else不会,影响甚微,只是拿出来和人人分享下
测试代码:
$start = microtime(true);
$a = range(1, 1000);
for($i=0; $i < 10000000; $i++){
if(isset($a)){
echo " ";
}else{
echo "";
}
}
$end = microtime(true);
echo "履行工夫为:",($end-$start),"s";
?>
$start = microtime(true);
$a = range(1, 1000);
for($i=0; $i < 10000000; $i++){
isset($a) ? " " : "";
}
$end = microtime(true);
echo "履行工夫为:",($end-$start),"s";
?>
PHP和HTML混合编程应该不成问题,在这期间,你完全可以让PHP给你算算 一加一等于几,然后在浏览器输出,不要觉得幼稚,这的确是跟阿波罗登月一样,你打的是一小段代码,但是对于你的编程之路,可是迈出了一大步啊!兴奋吧?但是不得不再给你泼点冷水,您还是菜鸟一个。 |
|