count (sizeof) sring всегда int 1

Активист

Активист
Команда форума
Собственно, не знал бы c++, не обратил бы внимания, НО это явный БАГ (навеяло вопросом в тесте) и даже не фича, аргумент один, ниже.

PHP:
Result:
12321
1
5.2.14
<pre>

<?php
echo "Result:\n";
$str = "123";
echo $str[0];
echo $str[1];
echo $str[2];
echo $str[1];
echo $str[0];
echo "<br>";
echo sizeof($str);
echo "<br>";
echo PHP_VERSION;
highlight_file(__FILE__);
?>
 

Активист

Активист
Команда форума
Я считаю - набиолее логичным выдать хотя бы 3 (количество байт), а вот по функции strlen отдать размер именно строки, учитывая текущую локаль!

Splurov
Умею я читать мануал, о другом речь.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Блин, ты перед своими «умными» утверждениями хоть иногда мануал читаешь?
Return Values
Returns the number of elements in var, which is typically an array, since anything else will have one element.
 

Активист

Активист
Команда форума
Т.е., со строкой мы как с массивом работать можем, а вот размерность его всегда будет 1 - дебилизм... Вот где-нибудь такой код увидишь при дебаге и будешь не спать сутки!

PHP:
<?php 
$var = "123"; // предположем, что где-то по коду выше стоит подобная строчка, 
// или вообще по коду она случайно из массива превратилась в строку

if (isset($var[0]) && isset($var[1]) && isset($var[2]) && $var[0] && $var[1] && $var[2] && sizeof($var) === 1) {
	echo "Trolling!!";
} 
?>
Как думаешь, что будет?

craz
Я еще раз говорю, мануал я знаю.
 

Splurov

Новичок
Почему дебилизм? Представь, что определение функции count:
Код:
function count(Countable $a) {}
А при её использовании исходи из того, что нужно быть уверенным, что аргументом передаётся массив или объект класса реализующего интерфейс Countable.
И какая связь функции count и обращению к элементам строк по индексу? По твоему получается, что in_array должна возвращать true на in_array('a', 'abc').
 

Активист

Активист
Команда форума
Splurov
> true на in_array('a', 'abc').
Да. Чем плох?

> обращению к элементам строк по индексу
Если обращаешься по индексу - либо уж выдай warning либо приведи все к одному единственному типу. Функции sizeof исторически сводятся к определению размера переменной в памяти, да, можно было внедрить типизацию - если массив - выдавать его размерность. если строка и т.п., выдавать ее размер в памяти, как бы это принято везде и давно. Тут же мы получаем какой-то странный симбиоз, между возможностью обращаться по индексам к строке (т.е. - чисто типичный сишный подход) и тут же по sizeof выдаем int 1 - чисто типичный багофичный подход PHP, вам не кажется?
 

Активист

Активист
Команда форума
Вообще sizeof('qwerty') ну ни как не может быть равно 1, false тогда отдай, ибо не массив, почему int 1?
 

craz

Нестандартное звание
я знаю что знаешь) просто надо знать и понимать можешь работать как с массивом, а вот чтобы далину ее узнать над функцией особенной пользоваться)
 

craz

Нестандартное звание
Вообще sizeof('qwerty') ну ни как не может быть равно 1, false тогда отдай, ибо не массив, почему int 1?
ну потому что по сути это


array('qwerty')

Я так понимаю там внутри строки приводятся к массивам чтоль?

Я короче согласен поведение стремное, другое дело, что это не баг, ибо баги исправляют, а этот вряд ли будут
 

Splurov

Новичок
Вообще sizeof('qwerty') ну ни как не может быть равно 1, false тогда отдай, ибо не массив, почему int 1?
Потому что один элемент при (array)$str :)
Не знаю откуда корни растут, sizeof вообще alias, и в php нету понятия объёма памяти, которое занимает переменная. Используй count чтобы название функции глаза не мозолило.
По-моему, в идеале, функция должна выдавать ошибку, если передан не массив или не объект с Countable.
 

iceman

говнокодер
по логике посудить,

переменная - это 1 элемент какого либо типа, массив - это несколько "переменных" (элементов), массив переменных так сказать!

ну вот поведение count для 1 переменной, вполне ожидаемо - 1 элемент и неипет
 

Активист

Активист
Команда форума
> массив переменных так сказать
Не правда :)

Скорее, "массив переменных" есть составной тип данных, но он в PHP не представлен.
 
Сверху