Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从构造函数返回值,并将值传递给另一个用户定义函数_Php - Fatal编程技术网

Php 如何从构造函数返回值,并将值传递给另一个用户定义函数

Php 如何从构造函数返回值,并将值传递给另一个用户定义函数,php,Php,我有一个构造函数 返回$load\u template\u id; //包含我要在以下代码中使用的值 下面我正在检查会话是否已设置,否则请执行else部分 if(!isset($_SESSION['cms_id'])) { $loadTemplateId = MxpCms_Admin::__construct(); $MxpBoxesSelected = $MxpCms->getSelectedLayout($loadTemplateId);

我有一个构造函数

返回$load\u template\u id; //包含我要在以下代码中使用的值

下面我正在检查会话是否已设置,否则请执行else部分

if(!isset($_SESSION['cms_id']))
    {
        $loadTemplateId = MxpCms_Admin::__construct();
        $MxpBoxesSelected = $MxpCms->getSelectedLayout($loadTemplateId);
        $MxpIdSelected = $MxpCms->getSelectedLayoutId($loadTemplateId);
    }
    else
    {
        $MxpBoxesSelected = $MxpCms->getSelectedLayout($_SESSION['cms_id']);
        $MxpIdSelected = $MxpCms->getSelectedLayoutId($_SESSION['cms_id']);
    }
但我犯了致命的错误

致命错误:无法静态调用非静态方法MxpCms_Admin::_构造() 我对如何返回值感到困惑

class MxpCms_Admin {

    protected $load_template_id;

    public function __construct()
    {       
        global $MxpDatabase;

        $Qcmsdrag = $MxpDatabase->query('select t.id from :table_templates t, :table_configuration c where t.code = c.configuration_value');
        $Qcmsdrag->bindTable(':table_templates', TABLE_TEMPLATES);
        $Qcmsdrag->bindTable(':table_configuration', TABLE_CONFIGURATION);
        $Qcmsdrag->bindValue(':boxes_group', 'left');
        $Qcmsdrag->execute();

        $this->load_template_id = $Qcmsdrag->value('id');
        //error_log(print_r($Qcmsdrag,TRUE));
    }

    public function getId(){
        return $this->load_template_id;
    }
}
那么

$Admin = new MxpCms_Admin();
$loadTemplateId = $Admin->getId();
$Admin = new MxpCms_Admin($MxpDatabase);
$loadTemplateId = $Admin->getId();

取决于PHP的版本

或(甚至更好)

那么

$Admin = new MxpCms_Admin();
$loadTemplateId = $Admin->getId();
$Admin = new MxpCms_Admin($MxpDatabase);
$loadTemplateId = $Admin->getId();


这是类和构造函数的更恰当的用法。我认为在
MxpCms\u Admin::getTemplateId
中使用两个
常量仍然不好,因为它依赖于全局环境而不是依赖项注入。

你不能从构造函数返回值,那么我应该怎么做才能获得值?我知道默认情况下会自动调用它。将所有这些都写在另一个方法下并调用该方法。可能的重复项使用构造函数将load_template_id设置为类属性;并为该属性提供一个getter方法虽然这从技术上回答了这个问题,但它仍然是可怕的类设计…:)@deceze-现在只需做一点重构,从DI开始消除
全局
看起来我们最终得到了一个相同的返工:)只有这么多明智的方法可以做到这一点。。。或者我们都同样疯狂…:)
$Admin = new MxpCms_Admin($MxpDatabase);
$loadTemplateId = $Admin->getId();
$loadTemplateId = (new MxpCms_Admin($MxpDatabase))->getId();
class MxpCms_Admin {

    protected $mxpDatabase;

    public function __construct($mxpDatabase) {
        $this->mxpDatabase = $mxpDatabase;
    }

    public function getTemplateId() {
        $Qcmsdrag = $this->mxpDatabase->query('select t.id from :table_templates t, :table_configuration c where t.code = c.configuration_value');
        $Qcmsdrag->bindTable(':table_templates', TABLE_TEMPLATES);
        $Qcmsdrag->bindTable(':table_configuration', TABLE_CONFIGURATION);
        $Qcmsdrag->bindValue(':boxes_group', 'left');
        $Qcmsdrag->execute();

        return $Qcmsdrag->value('id');
    }

}

$admin = new MxpCms_Admin($mxpDatabase);
$templateId = $admin->getTemplateId();