【问题标题】:PHP Classes: Define default return objectPHP 类:定义默认返回对象
【发布时间】:2013-10-11 11:15:04
【问题描述】:

我有一个带有构造函数和一些方法的 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;
        }
    }
?>

【问题讨论】:

  • 类可以使用extends关键字进行扩展。
  • 为什么不创建一个包含所有属性和所有类extends 的父类?我不明白你的问题...看看这个php.net/manual/en/keyword.extends.php
  • 看看我更新的问题。我想要这样的东西,但这不起作用。如您所见,我有一个默认返回值。在函数something 中,我更改了默认值。这就是我想要的。

标签: php class return


【解决方案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-&gt;oReturn 中设置您想要的任何属性,我认为这就是您想要实现的目标。

See it working

【讨论】:

    【解决方案2】:

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

    <?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"
        }
    */
    

    【讨论】:

      【解决方案3】:

      我想你可能会追求方法链。您可以创建一个方法返回$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 类的属性将反映您在链式方法调用中分配给它们的值。

      【讨论】:

        【解决方案4】:

        您可以将非标量 值分配给类属性 类实例化(也称为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");
        

        【讨论】:

        • 我喜欢vascowhite的答案中的方法。我的示例中的扩展类是不必要的吗?
        猜你喜欢
        • 2011-04-05
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        相关资源
        最近更新 更多