0

我有一个带有构造函数和一些方法的 PHP 类。每个方法都需要具有相同的返回 stdClass 对象。stdClass 对象的每个函数中只有少数属性应该与默认属性不同(如属性valuestatus)。你会怎么做?我的意思是,我可以在每个函数中定义一个具有所有属性的 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;
        }
    }
?>
4

4 回答 4

1

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

public $oReturn = new stdClass();

这在 PHP 中是非法的。像这样做:-

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,我认为这是你想要实现的。

看到它工作

于 2013-10-04T12:51:45.457 回答
0

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

<?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"
    }
*/
于 2013-10-04T12:51:57.303 回答
0

我想你可能在方法链之后。您可以创建一个其方法返回的类$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;
    }
}

然后,您可以按如下方式使用它:

<?php
$user = new User();
$user->setName('Martin')->setEmail('martin@example.com');

在此之后,您的User类的属性将反映您在链式方法调用中分配给它们的值。

于 2013-10-04T12:55:12.450 回答
0

您可以在类实例化之后(AKA after )将量值分配给类属性。看到赋值被移动到构造函数中。new$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");
于 2013-10-04T12:57:11.957 回答