Mysql mysqli_result __construct

alex77

Новичок
Здравствуйте.
Вот здесь: http://www.php.net/manual/ru/class.mysqli-result.php#88062
показан пример расширения mysqli_result
PHP:
<?php

class Database_MySQLi extends MySQLi
{
    public function query($query)
    {
        $this->real_query($query);
        return new Database_MySQLi_Result($this);
    }
}

class Database_MySQLi_Result extends MySQLi_Result
{
    public function fetch()
    {
        return $this->fetch_assoc();
    }

    public function fetchAll()
    {
        $rows = array();
        while($row = $this->fetch())
        {
            $rows[] = $row;
        }
        return $rows;
    }
}

?>
Почему в конструктор Database_MySQLi_Result в качестве параметра передается объект Database_MySQLi ?

в официальной документации нигде не нашел я описание mysqli_result::__construct , это какая-то недокументированная возможность, или плохо ищу? Всё только в комментариях.
 

Фанат

oncle terrible
Команда форума
В принципе, комментам доверять нельзя. Там такой ад творится, что хоть топор вешай.
Людей, которые конкретно копали мускуляй я тоже не встречал.
Так что надежнее всего будет потыкать все самому. Ну, или самое надежное - в исходниках

Я бы, кстати, не стал расширять оригинальный класс, а написал бы свой. Prefer delegation over inheritance, как мне сказал тут на днях zerkms

Но тема сама по себе интересная. Если расширишь, то я бы поглядел на результат.
 

alex77

Новичок
mysqli.c
PHP:
/* {{{ mixed mysqli_result_construct()
constructor for result object.
Parameters:
  object [, mode] -> mysqli_store/use_result
*/
PHP_FUNCTION(mysqli_result_construct)
{
	MY_MYSQL			*mysql;
	MYSQL_RES			*result = NULL;
	zval				*mysql_link;
	MYSQLI_RESOURCE		*mysqli_resource;
	long				resmode = MYSQLI_STORE_RESULT;

	switch (ZEND_NUM_ARGS()) {
		case 1:
			if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
				return;
			}
			break;
		case 2:
			if (zend_parse_parameters(2 TSRMLS_CC, "Ol", &mysql_link, mysqli_link_class_entry, &resmode)==FAILURE) {
				return;
			}
			break;
		default:
			WRONG_PARAM_COUNT;
	}

	MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);

	switch (resmode) {
		case MYSQLI_STORE_RESULT:
			result = mysql_store_result(mysql->mysql);
			break;
		case MYSQLI_USE_RESULT:
			result = mysql_use_result(mysql->mysql);
			break;
		default:
			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for resultmode");
	}

	if (!result) {
		RETURN_FALSE;
	}

	mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
	mysqli_resource->ptr = (void *)result;
	mysqli_resource->status = MYSQLI_STATUS_VALID;

	((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;

}
/* }}} */
mysqli_class_mysqli_result_interface.phpt

Constructor:

Warning: mysqli_result::__construct() expects parameter 2 to be long, %unicode_string_optional% given in %s on line %d

Warning: mysqli_result::__construct() expects parameter 1 to be mysqli, %unicode_string_optional% given in %s on line %d
 
Сверху