程式狂想筆記

一個攻城師奮鬥史

0%

手邊PHP一些note...

最近發現PHP function宣告寫在下面
竟然上面可以呼叫…
我以為是JavaScript的hoisting一樣的東西?
剛好看的我知道你懂 hoisting,可是你了解到多深? | TechBridge 技術共筆部落格
只有略懂略懂…
但為什麼可以呼叫呢?
目前還沒找到原因
所以先整理出來

在這邊我先說我的猜測不一定是正確原因
原本想說PHP的function name會不會跟常數是用同一個地方
結果是了一下,發現常數竟然有分大小寫,但感覺不會跟變數衝到….
好神奇,可能JS寫太久,覺得怪怪的 哈哈

Functions need not be defined before they are referenced, except when a function is conditionally defined as shown in the two examples below.

這邊就說明了function放後面,可以呼叫。還可以透過Conditional functions這東西,這也滿奇怪的

中間有想到是不是常數跟function一樣可以放後面
答案是不行的

  • PHP: 超全局变量 - Manual

  • 彻底搞懂PHP的变量作用域和全局变量 - 简书

    1
    2
    3
    4
    5
    6
    7
    function test() { 
    global $a;
    unset($a);
    }
    $a = 1;
    test();
    echo $a;

    结果

    明明是unset了呀,为什么还会打印出来呢?
    众所周知,我们的function里面的永远是个私有变量,unset的确是起作用了,它unset了一个global 的值呀,而global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量;$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致!

作者:michaelgbw
链接:https://www.jianshu.com/p/09217582cc08
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

老實說…,我還是沒有搞清楚
但這樣看下去,可能還有static要看

define() vs const 常數定義
最主要的原因是底層的不同
define() 是 run-time constants 而 const 是 compile-time constants.
define() 是 global scope 或者在某個 namespace,所以不能用來定義 class-scope 的常數。
define()可以用在 if() 但 const不能用在 if()

看到這邊還真的不知道這兩個不太一樣orz

function,class重複宣告會有問題

這篇有簡易測試Hoisting,不過我認為跟js的hoisting不一樣
還有測試code

1
2
3
$poor_function = function(){
};
var_dump(function_exists('poor_function'));

這樣是沒有意義的
可以參考下面裡面

其他要紀錄的

結論,我還是不懂PHP QQ