PHP 命名空间 - 父类变量未正确传递给子类

Posted

技术标签:

【中文标题】PHP 命名空间 - 父类变量未正确传递给子类【英文标题】:PHP Namespace - Parent Class variables not passing correctly to Child Class 【发布时间】:2019-05-29 02:27:42 【问题描述】:

我正在尝试将命名空间实现到我正在为 WordPress 开发的插件中,但遇到了一个看起来很奇怪的问题。父变量在子类__construct 方法中可用,但在子类中的任何其他方法中不可用。

我有一个父类 - class.db.php

它处理创建和删除表(激活和停用插件)并存储一些变量,如表名等。

然后我有一个子类 - class.db.users.php

从上面的父类扩展并处理 User 表的所有 CRUD 方法。

父类 - class.db.php

<?php
namespace PUWP\DB\Functions;

class PU_dbFunctions

    public $wpdb;
    public $collate;
    public $userTable;

    function __construct()
        global $wpdb;
        $this->wpdb = $wpdb;
        $this->collate = $this->wpdb->get_charset_collate();
        $this->userTable = $this->wpdb->prefix.'pu_users';
    

?>

儿童班 - class.db.users.php

<?php

namespace PUWP\DB\Functions\Users;

DBFunctions(); // Temporary Function to include DB file above.

use PUWP\DB\Functions\PU_dbFunctions as PUWPDB;

class PU_dbUsers extends PUWPDB 

    function __construct()
        parent::__construct();
        var_dump( $this->wpdb );
        // returns as expected
    
    public function returnUserByEmail( $email )
        var_dump( $this->wpdb );
        var_dump( $this->userTable );
        // both return null
        return $this->wpdb->get_results( $this->wpdb->prepare( "SELECT * FROM `$this->userTable` WHERE `email`= %s", $email ), OBJECT );
    

?>

我已尝试将子 __construct 方法一起删除,但似乎不起作用。

我做错了什么?在我开始添加命名空间之前,一切正常。任何帮助将不胜感激。

编辑

来自:

我还有另外 2 个类 - 一个用于 Ajax 调用(加载下一个用户类)和一个用于用户交互/格式化从数据库返回的结果(登录、身份验证检查等)

class.user.php

DBUserFunctions();

use PUWP\DB\Functions\Users\PU_dbUsers as DBUsers;
use DateTime;
class PU_User extends DBUsers 
    // Class Methods
    public function login( $email , $password )

        $user = $this->returnUserByEmail( $email );
        //rest of login code if user is returned
    
    public function get_UserByEmail( $email )

        $user = $this->returnUserByEmail( $id ); 
        if( is_array( $user ) && ! empty( $user ) )
            $user = $this->formatUser( $user[0] );
            return $user;
        

        return false;
    

?>

class.ajax.php

<?php
// User Database is included before this file is included in the plugin.
namespace PUWP\Ajax;
use PUWP\Users\PU_User as PUWPUSERS;

class Ajax_Handler

    private $pu_settings;
    public $PUusers;

    function __construct()

        $this->PUusers = new PUWPUSERS;
    

?>

【问题讨论】:

无法复制这个~3v4l.org/00MM8。你在哪里创建\PUWP\DB\Functions\PU_dbFunctions\PU_dbUsers 的实例?你在哪里调用returnUserByEmail() 方法? 我已经添加了它是如何包含在问题中的。我的课程已经延伸到很远了吗?也许我应该将数据库包含到 DBusers 中并从 DBUsers 扩展用户。 我设法通过在 class.users.php 方法 __construct 中添加:parent::__construct(); 来使其正常工作 【参考方案1】:

我设法通过添加: parent::__construct();进入 class.users.php 方法 __construct

【讨论】:

以上是关于PHP 命名空间 - 父类变量未正确传递给子类的主要内容,如果未能解决你的问题,请参考以下文章

子类方法的PHP命名空间范围?

PHP 命名空间可以包含变量吗?

010.里式转换命名空间字段属性索引器

私有类函数与未命名命名空间中的函数

从 PHP 中的超类获取子类命名空间

映射到命名空间模块时将 prop 作为模块名称传递