2014-11-08 12 views
1

對於惰性加載和類似函數,功能性Clojure語言與Python之間有一個有趣的比較here。它讓我思考 - PHP中沒有可比較的功能嗎?例如,當你做一個WordPress查詢:可能WordPress的懶加載查詢?還是PHP的限制?

$loop = new WP_Query(...) 

您立即擁有職位$loop->posts的全陣列和(除非我錯了),該陣列上WP_Query構造函數完全創建。在Java或帶迭代器的Python中,通常會有一個數據庫 - 遊標 - 迭代器,您可以根據需要調用get-next函數來獲取下一個項目。

是否由於缺乏PHP中這種迭代器概念或其他原因,Wordpress不這樣做?

+0

好的php只是服務器端,你會如何從客戶端調用下一個項目?你可以使用AJAX好吧,但你也有無狀態的問題,所以會話變量,餅乾,數據庫條目等不要忘記wp_query也是可定製的分頁,類型等方面,所以它取決於你如何運行它。 – David 2014-11-09 01:41:54

+0

@David PHP不是「僅服務器端」,它可以作爲Python或Bash本地的腳本語言運行。你有一點,我想知道它的以網絡爲中心的無狀態設計是否是這個原因。 – NoBugs 2014-11-09 04:14:49

+1

本地定義?當我只說服務器端時,我的意思是不可能在沒有Ajax的客戶端瀏覽器中執行php腳本。 – David 2014-11-09 10:24:04

回答

1

簡短的回答是,您可以遍歷PHP中的數據庫遊標。 WP_Query()類是一個方便的庫,可以將它包裝起來,使您可以輕鬆使用該API中提供的過濾器/參數。最終,WordPress在當前版本和舊版安裝上使用mysql_*擴展(不建議使用),但是當使用較新版本的PHP時,它使用mysqli作爲基礎數據庫連接器。

關於WP_Query,其__construct()調用query()然後調用get_posts()。在line 3554上,它使用global $wpdb對象調用get_results()。這最終調用query()方法(內部爲_do_query()),最後遍歷line 1615上的結果。

您可以自由使用WP_Query()$wpdb,甚至mysql_*/mysqli來處理你的WordPress的數據庫代碼,從更高的抽象水平的上市更低。類似於SQL注入的保護是由更高級別的類提供的,但是您有更多的控制權轉移到更低級的類。

使用更高效的產量報表的可能性進行了討論here,顯然阻力的部分是,WP需要甚至系統工作到處 - 它使用jQuery 1.x的系列相同的原因適用於非常舊的IE版本。

+0

謝謝,這是在Wordpress中對數據庫的一個很好的概述,但我想知道爲什麼設計選擇是在Wordpress中這樣做的。實際上它看起來像PHP5於2004年7月與[Iterators](http://php.net/manual/en/class.iterator.php)發佈,並且在此之前Wordpress處於開發中,這可能是其中一個原因是結構化的? – NoBugs 2014-11-10 05:53:48

+0

WordPress從嚴格的博客平臺開始,已經成熟爲一個完整的CMS。諸如「WP_Query」這樣的類應該讓它更容易處理,而不必知道SQL,並且WordPress的所有更改都考慮到了向後兼容性。因爲你沒有被迫使用這些類,所以它們並不真正限制你,所以爲什麼改變沒有被破壞的東西。 – doublesharp 2014-11-10 06:26:49