Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
mysql_affected_rows() не работает с SELECT — только с запросами, модифицирующими таблицу». И я верил, потому как это логично. Но потом обнаружил, что на практике это не так. Как я понял, mysql_affected_rows() вызывает собственную функцию MySQL, а та, как сказано в мануале MySQL, «For SELECT statements, mysql_affected_rows() works like mysql_num_rows()».если по-вашему, это действительно ошибка
mysql_affected_rows() вернёт после SELECT, как написано в английском мануале, «the number of affected rows by the last INSERT, UPDATE, REPLACE or DELETE query», а она возвращает число строк в выборке SELECT. Выходит, что говнокод, который мне приходится модифицировать,— прав, а мы с мануалом — нет.SELECT отсутствует. Во-вторых: а это вообще так? По-моему, нет. Вон, про UPDATE сказано: «When using UPDATE, MySQL will not update columns where the new value is the same as the old value. This creates the possibility that mysql_affected_rows() may not actually equal the number of rows matched, only the number of rows that were literally affected by the query».This creates the possibility that mysql_affected_rows() may not actually equal the number of rows matched, only the number of rows that were literally affected by the queryВ таком контексте для SELECT почти всегда должен возвращаться 0.
mysql_affected_rows() в мануале нет. Да, в нём не описано, что она должна возвращать, если до неё не было ни одной из указанных SQL-операций; это недоработка.UPDATE, потом SELECT, а потом вызывается функция mysql_affected_rows(). Согласно мануалу, функция в таком случае обязана вернуть число строк, модифицированных запросом UPDATE. А она возвращает число строк в выборке SELECT!Ещё раз, если вы считаете это багом, отпишите о нём, как поднимется bugs.php.net (это уже будет скоро).
var_dump(strcmp(1, '1'));
var_dump(1 === '1');
var_dump('1' === '1');
простые типы передаются по значению объекты по ссылке
<?php
function tonull1($variable)
{
$variable = null;
}
function tonull2(&$variable)
{
$variable = null;
}
$a = new stdClass(); //$a - содержит указатель на объект
var_dump($a); //object(stdClass)[1]
tonull1($a); //передали копию на указатель на объект, с указателем ничего не случилось
var_dump($a); //object(stdClass)[1]
tonull1(&$a); //передали ссылку на указатель на объект, указатель обнулился.
var_dump($a); //null
$a = new stdClass(); //$a - содержит указатель на объект
var_dump($a); //object(stdClass)[1]
tonull2($a); //функция примет ссылку на указатель на объект, указатель обнулился.
var_dump($a); //null
function tonull1($variable)
{
$variable->q=1;
}
По поводу unset — разве unset и присвоение null это не одно и то же?
<?php
$a = 1;
$b = &$a;
$c = &$a;
unset($b);
var_dump($a);
$c = null;
var_dump($a);
?>$a = new stdClass();
$b =& $a;
unset($a); //убирается ссылка
var_dump($b); //object(stdClass)[1]
$c = new stdClass();
$d =& $c;
$c = null; //изменилось значение
var_dump($d); //null
$a = new stdClass();
xdebug_debug_zval('a'); //(refcount=1, is_ref=0), object(stdClass)[1]
//refcount - количество ссылок на контейнер со значением
//is_ref - является ли данная переменная частью набора ссылок на контейнер со значением
$b = &$a;
$с = &$b;
xdebug_debug_zval('a'); //(refcount=3, is_ref=1), object(stdClass)[1]
xdebug_debug_zval('b'); //(refcount=3, is_ref=1), object(stdClass)[1]
xdebug_debug_zval('с'); //(refcount=3, is_ref=1), object(stdClass)[1]
// тут всё понятно, набор состоит из 3 ссылок. a, b, c - как раз и составляет набор этих ссылок
$d = $a;
xdebug_debug_zval('d'); //(refcount=1, is_ref=0), object(stdClass)[1]
// всего одна ссылка на контейнер (хотя объект скопирован не был). d - не принадлежит набору ссылок. Т.е. d - не ссылка и в $d = $a происходит именно копирование. Но копируется указатель на объект, а не сам объект.
<?php
class ClassA {}
class ClassB {}
$a = new ClassA;
$b = $a;
$c = &$a;
$a = new ClassB;
var_dump($a,$b,$c);
/*
object(ClassB)#2 (0) { // $a
}
object(ClassA)#1 (0) { // $b
}
object(ClassB)#2 (0) { // $c
}
*/
Дальше у автора оригинальной статьи идет вот это: copy-on-write
…
Я не очень понял о чем это.
Отличие Javascript от PHP o_0