Расширить mysqli_result

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

 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; } } 

Related of "Расширить mysqli_result"

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

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

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

Ответ Фила в порядке, но можно просто расширить 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 { ... }