【问题标题】:parent method retuns empty when used in a child class in php在php的子类中使用父方法时返回空
【发布时间】:2014-10-02 07:21:03
【问题描述】:

我有一个父类 (DB),它有一个名为 con() 的公共方法。
此方法应返回 private $con 内部的任何内容 - 它在它自己的类内部和外部都执行此操作。

class DB
{
    private $con = array();

    public function add($alias, $db, $un, $pw, $desc)
    {
        try {
            $options = array(/*PDO OPTIONS*/)
            $this->con[$alias] = array(
              'alias' => $alias, 
              'db' => $db, 
              'dbh' => new PDO('mysql:host=localhost;dbname='.$db.';charset=utf8', $un, $pw, $options), 'desc'=>$desc);
        } catch(PDOException $e) {
            /*  return error message  */
        }
    }

    public function con()
    {
        return $this->con;
    }
}

我正在添加这样的连接:

$db = new DB();
$db->add('alias1','databasename','username','password','an optional short description');
$db->add('alias2','databasename2','username2','password2','');

现在,private $con 应该填充两个连接 - 就是这样。
con() 方法现在应该返回这些连接 - 它也这样做:

我把这个测试函数放在KD-class里面:

public function aliases()
{
    foreach($this->con() as $con){    //  this should returns an array with the aliases.
        $aliases[] = $con['alias'];
    }
    return $aliases;
}

以下代码返回:array(2) { [0]=> string(4) "alias1" [1]=> string(4) "alias2" }

<?=var_dump($db->aliases())?>

现在,我还在扩展DB 类的子类中创建了useAliases() 作为测试方法:

class SQL extends DB
{
    public function useAliases()
    {
        var_dump($this->aliases());
    }
}

以下代码返回:NULL NULL

$sql = new SQL();
var_dump($sql->useAliases());

为什么会这样?我预计useAliases() 将返回与aliases() 相同的结果。

【问题讨论】:

    标签: php class parent-child


    【解决方案1】:

    您需要使用父类中的方法add() 来建立您的连接。现在$con 属性的默认值为array(),因为您是这样定义的:

    private $con = array();
    

    所以你得到了预期的结果。

    如果你想让它工作,你需要这样运行它:

    $sql = new Sql();
    $sql->add('alias','db','un','pw','desc');
    $sql->showTables();
    

    编辑

    你不能这样做:

    $db = new DB();
    $db->add('alias1','databasename','username','password','an optional short description');
    $db->add('alias2','databasename2','username2','password2','');
    $sql = new Sql();
    $sql->showTables();
    

    因为在这种情况下 $db 和 $sql 是独立的对象。您需要按照我上面的说明进行操作

    【讨论】:

    • 我确实使用add() 来建立连接。并且建立了连接。所以$con 填充了一个连接。否则该网站根本无法工作。但是当我试图通过使用子类中的con() 来检索$con 的内容时,它返回空......
    • @ThomasK 所以编辑你的问题并展示你如何创建和使用它
    • 我明白了。不知何故,我现在让它工作。当然,完全按照您指出的去做。我很确定我以前也这样做过几次,但显然不是......那么,通过只启动子类,就不需要设置父类了吗?总是这样吗?
    • @ThomasK 是的,子类总是有父类属性和方法,但你需要记住父构造函数不会自动启动
    • 然后。当有多个类扩展同一个父级时,我会怎么做?像。我想有机会为不同的任务创建不同的类。他们都需要访问DB 类,这样他们就可以使用con() 方法——它持有PDO 连接......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多