首頁 >後端開發 >php教程 >laravel - php變數解析

laravel - php變數解析

WBOY
WBOY原創
2016-08-18 09:15:54982瀏覽

比如現在我有變數 $arr, 他是一個陣列

<code>$arr = [
    'news' => [
        'data' => [
            0 => [
                'title' => '名字',
                'content' => '内容'
            ],
        ],
    ],
];
</code>

一些框架或模板引擎 都帶了解析的功能, 可以通過 arr.news.data[0].title 的方式, 獲取到 title 的值, 以及可以對值進行修改。

那麼我想知道他是什麼原理, 如何 高效、安全、簡單 的使用此種表達方式對數組中的值進行獲取以及設置呢?

我能想到的是利用文字處理的方式實現的, 不過安全性、效率上應該不算很高。請老師指點。

回覆內容:

比如現在我有變數 $arr, 他是一個陣列

<code>$arr = [
    'news' => [
        'data' => [
            0 => [
                'title' => '名字',
                'content' => '内容'
            ],
        ],
    ],
];
</code>

一些框架或模板引擎 都帶了解析的功能, 可以通過 arr.news.data[0].title 的方式, 獲取到 title 的值, 以及可以對值進行修改。

那麼我想知道他是什麼原理, 如何 高效、安全、簡單 的使用此種表達方式對數組中的值進行獲取以及設置呢?

我能想到的是利用文字處理的方式實現的, 不過安全性、效率上應該不算很高。請老師指點。

絕大多數模板引擎都是使用預先編譯的方式處理的,即輸入的模板數據,會將其中變數、循環、條件等符號,轉換成標準的PHP語句,之後再執行這些內容。

另外,這些框架或是模板引擎都是開源的,你有時間在這裡問人,自己去看看程式碼早就明白了。

我幫你找代碼好吧。

<code> public static function getValue($array, $key, $default = null)
    {
        if ($key instanceof \Closure) {
            return $key($array, $default);
        }

        if (is_array($key)) {
            $lastKey = array_pop($key);
            foreach ($key as $keyPart) {
                $array = static::getValue($array, $keyPart);
            }
            $key = $lastKey;
        }

        if (is_array($array) && (isset($array[$key]) || array_key_exists($key, $array)) ) {
            return $array[$key];
        }

        if (($pos = strrpos($key, '.')) !== false) {
            $array = static::getValue($array, substr($key, 0, $pos), $default);
            $key = substr($key, $pos + 1);
        }

        if (is_object($array)) {
            // this is expected to fail if the property does not exist, or __get() is not implemented
            // it is not reliably possible to check whether a property is accessable beforehand
            return $array->$key;
        } elseif (is_array($array)) {
            return (isset($array[$key]) || array_key_exists($key, $array)) ? $array[$key] : $default;
        } else {
            return $default;
        }
    }</code>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn