Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> тип аргумента функции, Что я делаю не так? 
V
    Опции темы
Goganchic
Дата 16.11.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Всем привет!
Долгое время я не программировал на 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. Подскажите пожалуйста что я делаю не так.

Это сообщение отредактировал(а) Goganchic - 16.11.2008, 10:10
PM Jabber   Вверх
skyboy
Дата 16.11.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



для начала сделай конструкток - конструктором. у тебя же PHP 5, а ты пользуешься формой записи конструктора для 4. возможно, это как-то связано.
PM MAIL   Вверх
Goganchic
Дата 16.11.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



skyboy, уже сделал - не помогло
PM Jabber   Вверх
solenko
Дата 16.11.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



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


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 16.11.2008, 11:41 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата

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

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

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

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





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Serkys
Дата 16.11.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: 4
Всего: 22



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

Довольно удобно в определённых ситуациях. Если лично вы не нашли разумного применения этой возможности - не значит, что разумного применения нет
PM MAIL   Вверх
solenko
Дата 16.11.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



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

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



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 16.11.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

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

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

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




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 16.11.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Goganchic, тема помечена решенной - ты нашел решение? или по ошибке пометил решенной?
PM MAIL   Вверх
solenko
Дата 16.11.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



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

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

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

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


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 16.11.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Goganchic
Дата 18.11.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



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

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

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

 я получил
PM Jabber   Вверх
sTa1kEr
Дата 19.11.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата

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

Вы это скажите авторам, которые SPL_Types пишут.
Цитата

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

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

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

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

Добавлено через 1 минуту и 32 секунды
И, кстати, если уж так хочется указывать в параметрах элементарные типы, то используйте spl types.
PM MAIL   Вверх
ksnk
Дата 19.11.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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







--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sTa1kEr
Дата 19.11.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



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

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

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

Документации на него действительно почти нету, только небольшие куски из конференций и примеры. Но там и нечего по сути документировать.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.