簡體   English   中英

在函數 php 中不使用類的原因是什么

[英]What is the reasoning for not using a class within a function php

我正在查看這個問題PHP - 在函數中定義類(它如何有如此多的贊成票超出了我的范圍)

簡而言之,它沒有回答我的問題。

具體來說,下面是 wordpress 插件創建代碼

短代碼是你可以在任何插件中使用的東西,例如

//Create callback for shortcode
function DisplayNumberFive(){
  echo "5";
}

//create shortcode as [DNF]
add_shortcode('DNF','DisplayNumberFive');

現在我想在任何地方顯示數字5我可以簡單地做

do_shortcode("[DNF]");

輸出為5

現在考慮到這個功能,例如有一個類是否有意義

//Create callback for shortcode
 function CreateFooClass(){
  class Foo{
    function Bar(){
      return "FooBar";
    }
  }
 }

 //Create shortcode as [include_Foo]
 add_shortcode('include_foo','CreateFooClass');

 //Use case
 do_shortcode("[include_foo]");

 $foo = new Foo();

 echo $foo->Bar();

 //Ouput
 "FooBar"

我的問題是我是否做錯了,或者這是否會引入我看不到的錯誤。 Bar()甚至可以訪問,因為它在一個函數內?

目標是消除 wordpress 插件中重復文件的需要,因此如果您創建一個類,例如用於記錄一個插件上的事件,但您還想記錄另一個插件的事件,則一個插件中的文件彼此無法訪問所以必須在另一個插件中創建一個重復的文件,以便消除創建短代碼將允許在所有插件中的任何地方都可以訪問該類,這就是我找到這個解決方案的原因我只是擔心考慮到我可能不正確沒有找到任何谷歌結果詳細說明任何人這樣做,這讓我懷疑是否沒有其他人這樣做,這一定是有原因的。

那么為什么沒有人這樣做呢?

WordPress短代碼從未設計過在PHP上下文中被調用。 它們旨在用於內容中 能夠在PHP中調用簡碼比通常要做的更多的是實現細節。

所以,是的,從技術上講,您可以使用它從PHP調用短代碼,以將其用作一種類加載機制。

或者,您可以使用真實的類自動加載,而$foo = new Foo(); 無需任何額外代碼即可工作。

因此,沒有人會這樣做(或類似的事情),因為自動加載是一件事情,並且工作正常。

我了解到面向對象編程已經成為最高級的工具,但是WP使用了完全不同的范例: 結構化編程 因此,請盡量避免混淆。

現在針對您的情況:

如果使用autoloader ,則具有類的文件將在首次使用時自動包含在內。

另外,您可以直接從PHP4使用類定義。 在PHP5中,引入了關鍵字publicprivateprotected (以調整類中方法的可見性)。

看起來, do_shortcode是為了返回HTML而創建的,因此下一個解決方案不能與其一起使用。 (但是嘗試一下,我不確定。)

function CreateFooClass(){
  if(!class_exists('Foo')) {
    class Foo{
      public function Bar(){
        return "FooBar";
      }
    }
  }
  return new Foo()
 }

$foo = CreateFooClass();
$foo->Bar();

在函數內部聲明一個類可能是一個錯誤。

如果類聲明出現在函數內部,則在調用該函數時定義該類。 在調用函數之前,該類將不可用,並且兩次調用該函數將導致致命錯誤(“無法聲明類…,因為名稱已在使用中”)。

由於在腳本執行過程中可能多次調用Wordpress短代碼,因此在處理程序中為短代碼聲明一個類可能會導致錯誤。 如果要聲明一個類,請在文件的頂層進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM