【问题标题】:Accessing variables declared inside the constructor访问构造函数中声明的变量
【发布时间】:2015-03-30 07:40:43
【问题描述】:

我有一个索引文件,在点击表单提交时,它调用Users.php 类中的一个方法,该方法还从用户类中的方法扩展了类SqlFunctions.php。我在 SqlFunction 类中调用该函数。我无法访问构造函数中定义的变量。

index.php

<?php
    require_once '../includes/constants.php';
    require_once DOCROOT.'classes/class.users.php';

    $objUser = new Users();

    if(isset($_POST) && !empty($_POST)){
        $objUser->userLogin();
    }
?>

类Users.php

<?php
require_once DOCROOT.'classes/class.sqlFunctions.php';

class Users extends sqlFunctions {
    function __construct() {
    }

    function userLogin() {
        echo '<pre>'; print_r($this->find()); die;
    }
}
?>

类 SqlFunction.php

<?php
require_once DOCROOT.'includes/config.php';

class sqlFunctions {

    function __construct() {
        $this->name = 'MYNAME';

    }

    function find() {
        echo '<pre>'; print_r($this->name);
    }

}
?>

在上面的代码中它应该打印MYNAME,因为我已经在构造函数中定义了它。

希望我的问题足够清楚。

【问题讨论】:

  • $name 定义为sqlFunctions 类中的成员。例如:private $name;

标签: php oop constructor


【解决方案1】:

你应该在sqlFunctions中定义class属性如

class sqlFunctions {
    public $name;

    // etc
}

因为你的Users类定义了一个新的构造函数,你需要调用父构造函数来设置名称为MYNAME

class Users {
    function __construct() {
        parent::__construct();
    }
}

【讨论】:

  • 可能取决于 PHP 的版本,但您实际上不需要在父类和/或子类中定义 $name,至少在我的 PHP 5.5 上.9 没有它也可以工作。
【解决方案2】:

调用子构造函数并不会隐式调用父构造函数,您必须自己执行此操作。这就是用户类的 $name 属性没有被初始化为 MYNAME 的原因。 要实现您想要的,请在 Users 类中调用父级的构造函数:

<?php
require_once DOCROOT.'classes/class.sqlFunctions.php';

class Users extends sqlFunctions {
    function __construct() {
        parent::__construct();
    }

function userLogin() {
    echo '<pre>'; print_r($this->find()); die;
    }
}
?>

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多