返回对象(PHP最佳实践)

3
当编写PHP面向对象的代码时,使用“返回对象”来传递成功、失败、错误信息等是否是一种好的/可接受的/明智的做法?
以下是我现在的示例: “返回对象”:
class JsqlReturn{
    public $response;
    public $success;
    public $debug_message;
    public $mysqli_result_obj;
    function __construct($bool=false,$debug_message=NULL,$res=NULL,$mysqli_result_obj=NULL){
        $this->success = $bool;
        $this->response = $res;
        $this->debug_message = $debug_message;
        $this->mysqli_result_obj = $mysqli_result_obj;
    }
}

包含示例方法的主类:

class Jsql{

    function connect($host,$username,$password,$database){ #protected?
        $this->db = new \mysqli($host,$username,$password,$database);
        if($this->db->connect_errno){
            return new JsqlReturn(false,"Connection failed: (".$this->db->connect_errno.") ".$this->db->connect_error);
        }
        else{
            return new JsqlReturn(true,NULL,"Connection success.");
        }
    }

}

实施:

$db = new Jsql;
$return = $db->connect(...);
if($return->success){ echo $return->response; }
else{ echo $return->debug_message; }

我知道在这里使用一个连接示例是琐碎的,但我的问题与编码实践有关。

我的主要目标是确保我在处理方法返回数据时保持一致的方式。

注:请多多包涵,这是我在这里的第一个问题。 :) 我一直在自学,从几年前尝试HTML开始,转向过程式PHP,最终进入面向对象编程。


2
这可能更适合[Programmers.se]。请参阅“最佳实践”问题是否不适合? - Scott Weldon
1
@ScottWeldon,收到;我还在学习这里的不同部分。谢谢。 - joegrom5
2
@joegrom5 这个问题在程序员社区已经有很多重复的问答了:我建议你去那里搜索一些好的信息。 - user439793
1
@ScottWeldon 当涉及到引用其他网站时,指出交叉发布被反对通常是有帮助的。 - gnat
@gnat 说得好,谢谢。我已经做了记录,以便将来不会忘记要做这件事。 - Scott Weldon
1个回答

0

对我来说,这似乎是一个完全合理的方法。

就“如何一致地处理方法返回数据”而言,您可以使响应类实现 Response 接口,然后您将知道所有类型的响应类都将遵守相同的规则,因此您可以在整个应用程序中安全地使用它:

interface MyResponseInterface
{
    public function getResponse();
    public function getDebugMessage();
    public function getSuccess();
    public function getMysqliConnection();
}

class JsqlResponse implements MyResponseInterface
{
    // ...
}

那么你知道,每当你的对象返回一个JsqlResponseTimeResponseMemberResponse等时,它们都将实现你的响应接口,因此你的公共getter方法将可用,例如:

/** @var MyResponseInterface $return */
$return = $db->connect(...);
if($return->getSuccess()) {
    echo $return->getResponse();
} else {
    echo $return->getDebugMessage();
}

注意:在我列举的不同响应类型示例中,我想象(假设)时间和成员可能不需要 MySQL 连接,因此您可以从 MyResponseInterface 中省略它,并创建一个新的接口用于数据库连接,例如 MyDatabaseInterface。通用响应类将提供响应、调试信息和成功方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接