如何在PHP中从不同的类方法正确构造和调用类方法?

时间:2017-11-18 12:40:27

标签: javascript php ajax wordpress

我正在编写一个WordPress插件,目前正在管理端工作。我正在为这个项目使用类。我遇到的麻烦可能源于我的经验不足。

我有两个类,一个用于管理页面,另一个用于处理自定义数据库表创建,删除,查询等。

我认为为了执行多个数据库操作,在调用 tools_page 方法时创建表对象( $ db )是有意义的。这反映在下面的代码中。但是,调用 $ db-> create_update_tables()会抱怨找不到 $ db

如果我将 $ db 的创建移动到 db_tables 方法,则代码会运行。

我认为由于涉及的方法是公共的,因此$ db对象应该可用于管理页面内的其他方法。我的研究印象中,首选的方法是声明一个全局 $ wpdb ,以便在插件运行时与所有数据库调用一起使用。如果我不正确,那么正确的做法是什么?

管理员类:

class Home_Search_Admin {

    public function __construct( $plugin_name, $version, $db_version ) {

        $this->plugin_name = $plugin_name;
        $this->version = $version;
        $this->db_version = $db_version;

    }

    public function db_tables() {

        echo "Inside db_tables";
        $db->create_update_tables();
        wp_die();
    }

    public function tools_page() {

        include( plugin_dir_path( __FILE__ ) . 'partials/home-search-admin-display.php' );
        $db = new Home_Search_Tables();
        $this->db_tables();
    }
}

表的类:

class Home_Search_Tables {

    private $wpdb;

    public function __construct() {

        global $wpdb;
        $this->wpdb = $wpdb;
        print_r("Constructed!");

    }

    public function create_update_tables() {

        print_r( 'I am in the method!' );

    }
}

1 个答案:

答案 0 :(得分:0)

如果需要表类的唯一方法是db_tables(),那么就可以像你说的那样做。将$db的创建移至db_tables方法。

但是如果您需要所有方法都可以访问创建,则需要在$wpbd类下声明变量,例如Home_Search_Tables,这样您就可以从方法中传递它。

class Home_Search_Admin {

private $db; // Declare $db

在您的方法上,使用$this->db

public function db_tables() {

    echo "Inside db_tables";
    $this->db->create_update_tables(); // $this->db

同样在这里

public function tools_page() {

    include( plugin_dir_path( __FILE__ ) . 'partials/home-search-admin-display.php' );
    $this->db = new Home_Search_Tables(); // $this->db
    // Or you can move this creation to construct method if necessary