Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > тип аргумента функции


Автор: Goganchic 16.11.2008, 10:10
Всем привет!
Долгое время я не программировал на PHP и вот недавно начал вспоминать. Столкнулся с такой ламерской ошибкой. Пишу простой пример:
Код

<html>
<body>
<?
class DB
{
    private $conn;
    
    function DB(string $name)
    {
        $this->conn = mysql_connect("localhost", "root", "", true);
        mysql_select_db($name, $this->conn);
    }
    
    function execQuery(string $query)
    {
        return mysql_query($query, $this->conn);
    }
}

$db = new DB("test1");
$res = $db->execQuery("select * from table1");

?>
<table>
<?
while ($row = mysql_fetch_row($res))
{
    print "<tr>";
    foreach (array_keys($row) as $key)
    {
        print "<td>" . $row[$key] . "</td>";
    }
    print "</tr>";
}
?>
</table>
</body>
</html>


И при запуске получаю ошибку:
Код

Catchable fatal error: Argument 1 passed to DB::DB() must be an instance of string, string given, called in 
Z:\home\test1.ru\www\index.php on line 20 and defined in Z:\home\test1.ru\www\index.php on line 8


И что-то я никак не пойму, из-за чего ошибка-то. Если убрать тип аргумента (string в конструкторе и функции execQuery) то вроде все работает, но это ведь как-то неправильно, ибо я не хочу чтобы мне передавали в эту функцию аргумент типа, отличного от строки. PHP Version 5.2.4. Подскажите пожалуйста что я делаю не так.

Автор: skyboy 16.11.2008, 10:27
для начала сделай конструкток - конструктором. у тебя же PHP 5, а ты пользуешься формой записи конструктора для 4. возможно, это как-то связано.

Автор: Goganchic 16.11.2008, 10:34
skyboy, уже сделал - не помогло

Автор: solenko 16.11.2008, 11:11
Проверка типов аргументов работает только для классов, а не для элементарных типов даных

Автор: ksnk 16.11.2008, 11:41
Цитата

Долгое время я не программировал на PHP и вот недавно начал вспоминать.

а ниче и не поменялось smile
Цитата

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

Расшифровка - это вам, батенька не С. Не выпендривайтесь  smile 
Типы лучше проверять по старинке, вручную. А так как сделано это в php5-м, imho, нужно было только для самоудовлетворения авторов языка...



Автор: Serkys 16.11.2008, 12:04
Цитата(ksnk @  16.11.2008,  12:41 Найти цитируемый пост)
А так как сделано это в php5-м, imho, нужно было только для самоудовлетворения авторов языка

Довольно удобно в определённых ситуациях. Если лично вы не нашли разумного применения этой возможности - не значит, что разумного применения нет

Автор: solenko 16.11.2008, 12:12
Цитата(ksnk @  16.11.2008,  10:41 Найти цитируемый пост)
 А так как сделано это в php5-м, imho, нужно было только для самоудовлетворения авторов языка..

Да ладно. Все очень даже логично. Проверка выполняется для типов, преодразование между котороми выполнить автоматически невозможно

Автор: ksnk 16.11.2008, 12:53
solenko, imho, нелогична неполнота. Почему не сделана проверка на элементарные типы? Разве это сложнее, чем вставить проверку корректного наследования объектов?

Добавлено через 4 минуты и 23 секунды
Цитата

Проверка выполняется для типов, преобразование между котороми выполнить автоматически невозможно

Не понимаю смысла фразы... Можно поподробнее?
"Объектный тип праметра" подразумевает, что в качестве параметра может быть передан объект, унаследованный от обозначенного. Вроде никакого дополнительного смысла я не знаю... 


Автор: skyboy 16.11.2008, 17:28
Goganchic, тема помечена решенной - ты нашел решение? или по ошибке пометил решенной?

Автор: solenko 16.11.2008, 21:13
Цитата(ksnk @  16.11.2008,  11:53 Найти цитируемый пост)
solenko, imho, нелогична неполнота. Почему не сделана проверка на элементарные типы? Разве это сложнее, чем вставить проверку корректного наследования объектов?

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

Цитата(ksnk @  16.11.2008,  11:53 Найти цитируемый пост)
Не понимаю смысла фразы... Можно поподробнее?"Объектный тип праметра" подразумевает, что в качестве параметра может быть передан объект, унаследованный от обозначенного. Вроде никакого дополнительного смысла я не знаю... 

Я хотел сказать, что стандартные типы могут быть преобразованы из одного в другой автоматически. Вроде как РНР дложен автоматически разруливать проблеммы с неправильным типом аргумента путем преобразования типа (ну эт я конечно забыл о array, function, object). С пользовательскими объектами же непонятно как поступить, по каким правилам пробразовывать.

Автор: ksnk 16.11.2008, 21:50
А кто говорит об автоматической проверке типов? Нет желания проверять тип - не указывай. Есть желание - напиши int или string, никакой автоматики smile Не хуже и не страшнее, чем проверка на объекты.
Никакого противоречия, кроме нежелания авторов, я ненахожу. Наличие такой фичи никому не помешало бы. 

Автор: Goganchic 18.11.2008, 11:59
Цитата(skyboy @  16.11.2008,  17:28 Найти цитируемый пост)
Goganchic, тема помечена решенной - ты нашел решение? или по ошибке пометил решенной? 

понял что эта фишка не работает со стандартными примитивными типами, поэтому ответ на вопрос

Цитата(Goganchic @  16.11.2008,  10:10 Найти цитируемый пост)
Подскажите пожалуйста что я делаю не так.

 я получил

Автор: sTa1kEr 19.11.2008, 01:23
Цитата

А так как сделано это в php5-м, imho, нужно было только для самоудовлетворения авторов языка...

Вы это скажите авторам, которые http://pecl.php.net/package/SPL_Types пишут.
Цитата

Почему не сделана проверка на элементарные типы?

Потому что в PHP есть такое понятие, как "автоматическое приведение типов". И если бы они это сделали для элементарных типов, то было бы крайне тяжело потом объяснить "почему '5' - это не integer"
Цитата

А кто говорит об автоматической проверке типов? Нет желания проверять тип - не указывай. Есть желание - напиши int или string, никакой автоматики  Не хуже и не страшнее, чем проверка на объекты.

Не получится, т.к. противоречит философии PHP. Пришлось бы делать строгую типизацию для всех типов данных.

Добавлено через 1 минуту и 32 секунды
И, кстати, если уж так хочется указывать в параметрах элементарные типы, то используйте spl types.

Автор: ksnk 19.11.2008, 09:39
sTa1kEr, Контроль входящих параметров функции и контроль типов переменных, все-таки разные вещи. smile Контроль входящих параметров, с использованием SPL types, насколько я понял из исходников-тестов (документацию на это дело я найти за разумное время не смог :-( ) сделать сложнее, чем просто используя is_int ... 





Автор: sTa1kEr 19.11.2008, 12:22
Цитата(ksnk @  19.11.2008,  10:39 Найти цитируемый пост)
sTa1kEr, Контроль входящих параметров функции и контроль типов переменных, все-таки разные вещи.

Причем здесь контроль параметров? Этот механизм никак не контролирует сами параметры, только их типы. Я хотел лишь сказать, что ноги тут растут из строгой типизации (а точнее ее отсутствия). Если бы была строгая типизация, тогда, конечно же, была бы и полноценная возможность типизации параметров, а так приходится довольствоваться тем что есть (хотя и этого уже не мало).
Цитата(ksnk @  19.11.2008,  10:39 Найти цитируемый пост)
Контроль входящих параметров, с использованием SPL types, насколько я понял из исходников-тестов (документацию на это дело я найти за разумное время не смог :-( ) сделать сложнее, чем просто используя is_int ... 

В общем да, т.к. это расширение - "костыль строгой типизации в PHP", имхо, еще не имеет логического завершения. Но зато оно прекрасно иллюстрирует проблемы с типизацией в PHP и наглядно объясняет причину отсутствия типизации элементарных параметров.

Документации на него действительно почти нету, только небольшие куски из конференций и примеры. Но там и нечего по сути документировать.

Автор: ksnk 19.11.2008, 17:01
Цитата

Но там и нечего по сути документировать.

Угу... Мне вот тоже кажется самоочевидным, что для того, чтобы объявить переменную типа int в php вполне разумно написать
Код

$ee= new SPLInt(0,false); 

Любому человеку в достаточно трезвом уме такое само приходит в голову...  smile 

Впрочем,  понятно, что кардинальных изменений в 5-м никто делать никогда не соберется, пусть даже они и казались бы мне разумными smile
Кстати, нет ли каких сведений о контроле типов в намечающемся 6-м php?



Автор: sTa1kEr 19.11.2008, 17:27
Цитата(ksnk @  19.11.2008,  18:01 Найти цитируемый пост)
Угу... Мне вот тоже кажется самоочевидным, что для того, чтобы объявить переменную типа int в php вполне разумно написать

Не факт, что через экстеншен вообще возможно добавить какую-либо новую языковую конструкцию. Скорее всего для этого нужно патчить сам PHP.

Цитата(ksnk @  19.11.2008,  18:01 Найти цитируемый пост)
Кстати, нет ли каких сведений о контроле типов в намечающемся 6-м php?

Кроме этого экстеншена? Вряд-ли. Я думаю, самое большое, на что можно надеяться, это что этот экстеншен в будущем перерастет в патч c соответствующими языковыми конструкциями.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)