【问题标题】:Access PHP object from inside a function从函数内部访问 PHP 对象
【发布时间】:2019-12-25 21:43:46
【问题描述】:

我创建了一个 PHP 类,我想从另一个文件中的函数访问它的方法。以下是我的代码:

include_once PLUGIN_DIR_PATH."/classes/Brands.php";

function create_tables(){

$brand_obj = new Brands;    
$brand_obj->create_brand_table();           
}

function delete_tables() {

$brand_obj = new Brands;    
$brand_obj->delete_brand_table();
}

是否可以只创建一次对象,然后在每个函数中重用它?现在,我在每个函数中创建对象,这不是一个好习惯。

【问题讨论】:

    标签: php class oop object


    【解决方案1】:

    您可以使用 global 关键字在函数内部使用在函数外部创建的变量:

    global $object
    

    代码示例:

    include_once PLUGIN_DIR_PATH."/classes/Brands.php";
    
    $brand_obj = new Brands;
    
    function create_tables(){
    
        global $brand_obj;
        $brand_obj->create_brand_table();
    }
    
    function delete_tables() {
    
       global $brand_obj;
       $brand_obj->delete_brand_table();
    }
    

    【讨论】:

    • 应尽可能避免使用全局变量。详情请见this post
    【解决方案2】:

    我将假设您的实际功能比您发布的功能更多,否则您实际上并不需要功能,只需这样做:

    $brand_obj = new Brands;    
    $brand_obj->create_brand_table();            
    $brand_obj->delete_brand_table();
    

    否则,您可以创建一个类并通过其构造函数将 Brands 依赖项注入其属性之一:

    class TablesManager
    {
      private $brands;
    
      public function __construct(Brands $brands)
      {
        $this->brands = $brands;
      }
    
      public function create_tables(): void
      {
        $this->brands->create_brand_table();
      }
    
      public function delete_tables(): void
      {
        $this->brands->delete_brand_table();
      }
    }
    

    用法:

    $brands = new Brands();
    $tables_manager = new TablesManager($brands);
    $tables_manager->create_tables();
    $tables_manager->delete_tables();
    

    注意:调用类SomethingManager 有时被认为是不好的做法/表明该类做了太多事情。考虑(至少)根据您的需要给它一个更准确的名称。

    演示:https://3v4l.org/iTmY6

    非 OOP 替代方案

    function create_tables(Brands $brand_obj): void { 
      $brand_obj->create_brand_table();           
    }
    
    function delete_tables(Brands $brand_obj): void {
      $brand_obj->delete_brand_table();
    }
    
    $brand_obj = new Brands();    
    create_tables($brand_obj);
    delete_tables($brand_obj);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2021-08-18
      • 2015-05-04
      相关资源
      最近更新 更多