Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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_Class_Return - Fatal编程技术网

PHP类:定义默认返回对象

PHP类:定义默认返回对象,php,class,return,Php,Class,Return,我有一个带有构造函数和一些方法的PHP类。每个方法都需要有相同的返回stdClass对象。stdClass对象的每个function中只有少数属性与默认属性不同(如属性值或状态)。你会怎么做?我的意思是,我可以在每个函数中定义一个具有所有属性的stdClass对象,但是正如我所说的,我只需要在每个函数中为返回更改几个属性 示例不起作用的代码: <? class Person{ public $sName; public $oReturn = new

我有一个带有构造函数和一些方法的PHP类。每个方法都需要有相同的返回stdClass对象。stdClass对象的每个function中只有少数属性与默认属性不同(如属性
状态
)。你会怎么做?我的意思是,我可以在每个函数中定义一个具有所有属性的stdClass对象,但是正如我所说的,我只需要在每个函数中为返回更改几个属性

示例不起作用的代码:

<?
    class Person{
        public $sName;
        public $oReturn = new stdClass();
        $oReturn->status = 200;
        $oReturn->value = "Personname";

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

        public function something($oData){
            //Declaration
            $this->oReturn->value = $oData->newName;
            //Main

            //Return
            return $this->oReturn;
        }
    }
?>

您不能声明这样的属性:-

public $oReturn = new stdClass();
class Person{
    public $sName;
    public $oReturn;

    function __construct($sName) {
        $this->sName = $sName;
        $this->oReturn = new stdClass;
        $this->oReturn->status = 200;
        $this->oReturn->value = "Personname";
    }

    public function something($oData){
        //Declaration
        $this->oReturn->value = $oData->newName;
        //Main

        //Return
        return $this->oReturn;
    }
}
这在PHP中是非法的。这样做:-

public $oReturn = new stdClass();
class Person{
    public $sName;
    public $oReturn;

    function __construct($sName) {
        $this->sName = $sName;
        $this->oReturn = new stdClass;
        $this->oReturn->status = 200;
        $this->oReturn->value = "Personname";
    }

    public function something($oData){
        //Declaration
        $this->oReturn->value = $oData->newName;
        //Main

        //Return
        return $this->oReturn;
    }
}
现在,您可以在
$this->oReturn
中设置您想要的任何属性,我认为这就是您想要实现的


您只需返回一个为您格式化数据的共享方法即可

<?php
class Foo
{
    protected
        $defaults = array(
            'a' => 1,
            'b' => 2,
        );

    protected function reply(array $params = null) {
        $properties = $this->defaults;

        if ($params) {
            $properties = array_merge($properties, $params);
        }

        return (object) $properties;
    }

    public function a($a) {
        return $this->reply(array('a' => $a));
    }

    public function b($b) {
        return $this->reply(array('b' => $b));
    }
}

$foo = new Foo;
var_dump($foo->a('a'));
var_dump($foo->b('b'));

/*
    object(stdClass)#2 (2) {
      ["a"]=>
      string(1) "a"
      ["b"]=>
      int(2)
    }

    object(stdClass)#2 (2) {
      ["a"]=>
      int(1)
      ["b"]=>
      string(1) "b"
    }
*/

我想你可能在寻找方法链接。您可以创建一个类,其方法返回
$this
,然后您可以更改方法调用

考虑如下所示的类:

<?php
class User
{
    protected $id;
    protected $name;
    protected $email;

    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }

    public function setEmail($email)
    {
        $this->email = $email;
        return $this;
    }
}
您可以在类实例化后将非标量值分配给类属性(也称为
新建后的
)。请参见将
$oReturn
值赋值移动到构造函数中

class Person{
    public $sName;
    public $oReturn;
    protected $default_status = 200;
    protected $default_value = "Personname";

    function __construct($sName) {
        $this->sName = $sName;
        $this->oReturn = new stdClass();
        $this->oReturn->status = $this->default_status;
        $this->oReturn->value = $this->default_value;
    }

    public function something($oData){
        //Declaration
        $this->oReturn->value = $oData->newName;
        //Main

        //Return
        return $this->oReturn;
    }
}
现在,您可以扩展这个类,进行一些小的更改

class PersonNotFound extends Person {
    protected $default_status = 404;
    protected $default_value = 'NotFound';
}
让我们看看他们的结果:

$oData = new stdClass();
$oData->newName = 'Neo';

$person_a = new Person("Triniti");
var_dump( $person_a->something($oData) );
// status = 200

$person_b => new PersonNotFound("Cyon");
var_dump( $person_b->something($oData) );
// status = 404
编辑: 构造函数注入版本:

class Person{
    public $sName;
    public $oReturn;

    function __construct($sName, $status = 200, $value = "Personname") {
        $this->sName = $sName;
        $this->oReturn = new stdClass();
        $this->oReturn->status = $status;
        $this->oReturn->value = $value;
    }

    public function something($oData){
        $this->oReturn->value = $oData->newName;
        return $this->oReturn;
    }
}

$person_a = new Person("Neo"); // 200, Personname as default
$person_b = new Person("Triniti", 404, "NotFound");

类可以使用
extends
关键字进行扩展。为什么不创建一个包含所有属性和所有类的父类
extends
?。我不明白你的问题。。。看看我的最新问题。我想要这样的东西,但这不起作用。如您所见,我有一个默认的返回值。在函数
something
中,我更改了默认值。这就是我想要的。我喜欢vascowhite的答案中的方法。在我的示例中,extenses类是不必要的吗?