Расширить mysqli_result - PullRequest
       19

Расширить mysqli_result

3 голосов
/ 01 июня 2011

Я расширил класс PHP mysqli, который отлично работает.Но как я могу заставить его возвращать пользовательский объект результата (или логическое значение для вставки / обновления / удаления и т. Д.) При запросах?

namespace MyApp;
class MySQLi extends \mysqli {
    public function query($query, $resultmode = null) {
        // This needs to return a MySQLiResult or a boolean
    }
}
class MySQLiResult extends \mysqli_result {
}

При этом я могу вернуть объект MySQLiResult, но не могу понятькак вернуть логическое значение для запросов, не основанных на выборе:

public function query($query, $resultmode = null) {
    $this->real_query($query); 
    return new MySQLiResult($this);
}

Обновление:

Это то, что я в итоге использовал:

class MySQLi extends \mysqli {

    public function query($query, $resultmode = null) {
        $result = parent::query($query, $resultmode);
        return is_bool($result) ? $result : new MySQLiResult($result);
    }

}


class MySQLiResult {

    private $result;

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

    public function __call($name, $arguments) {
        return call_user_func_array(array($this->result, $name), $arguments);
    }

    public function __set($name, $value) {
        $this->result->$name = $value;
    }

    public function __get($name) {
        return $this->result->$name;
    }

}

Ответы [ 2 ]

4 голосов
/ 17 декабря 2011

Ответ Фила в порядке, но можно просто расширить MySQLi_Result, проверив mysqli::field_count. Оформить документацию для mysqli::field_count

Эта функция может быть полезна при использовании функции mysqli_store_result (), чтобы определить, должен ли запрос привести к непустому результирующему набору или нет, не зная природу запроса.

Это как раз то, что нам нужно.

public MySQL extends MySQLi
{
    public function query($query)
    {
        if ($this->real_query($query)) {
            if ($this->field_count > 0) {
                return new MySQL_Result($this);
            }
            return true;
        }

        throw new MySQL_Exception($this->error, $this->errno);
    }
}

Теперь вы можете расширить свой класс результатов из MySQLi_Result и реализовать некоторые полезные интерфейсы, такие как SeekableIterator, чтобы вы могли использовать foreach в своем наборе результатов:

class MySQL_Result extends MySQLi_Result implements Countable, SeekableIterator, ArrayAccess
{
    ...
}
2 голосов
/ 01 июня 2011

Вероятно, самое простое, что нужно сделать, это обработать ваш класс MySQLiResult как декоратор для mysqli_result. Например

class MySQLiResult
{
    private $result;

    public function __construct(\mysqli_result $result)
    {
        $this->result = $result;
    }
}

Затем вы можете вызывать прокси-методы для внутреннего результата и декорировать (добавлять функциональность), где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...