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


Автор: mark2009 4.7.2012, 12:32
Доброго времени суток,

Итак... на борту PHP 5.4.3. Имеем следующий класс:

Код

class user extends mysql
{
    /**
     * ID пользователя. Переменная, с которой будет инициализироваться объект
     * 
     * @var integer
    */
    protected $user_id;

    /**
     * Группа пользователя
     *
     * @var integer
    */
    protected $group_id;

    /**
     * Другая информация о пользователе
     * 
     * @var array
    */
    protected $userdata;

    /**
     * Возвращает поля данных для пользователя
     * 
     * @return array
    */
/**
     * Проверяет реальное существование пользователя
     *
    */
    public function user_exists(integer $user_id)
    {
        
    }


Проблемная функция user_exists. Дело в том, что в качестве аргумента должно передаваться числовое значение. PHP позволяет указать тип аргумента непосредственно в функции. Указываем...

Если передаём в качестве реального аргумента строку, то получаем:
Catchable fatal error: Argument 1 passed to user::user_exists() must be an instance of integer, string given, called in /wwwsites/forum/index.php on line 12 and defined in /wwwsites/forum/classes/class_user.php on line 82

НО: если передаём число, то получаем:
Catchable fatal error: Argument 1 passed to user::user_exists() must be an instance of integer, integer given, called in /wwwsites/forum/index.php on line 12 and defined in /wwwsites/forum/classes/class_user.php on line 82

Где логика? Если я передал string - понятно. Но из второго сообщения я ровным счётом ничего понять не могу... integer должно передаться, integer и передалось что явствует из сообщения об ошибке... и всё равно выдаётся ошибка? Может быть я что-то не так делаю?

Автор: IBS 4.7.2012, 13:01
php почти не знаю, но я думаю дело в том, что $user_id уже была объявлена в этом классе, т.е. в функции возникает неоднозначность

Автор: mark2009 4.7.2012, 13:05
IBS, 
Если не знаете, зачем тогда пишете?
Это всего лишь аргумент функции. Никакой неоднозначности нет.

P.S. Код
Код

public function user_exists(integer $uid)
    {
        
    }

даёт тот же самый эффект.

Автор: Sentox 4.7.2012, 13:20
а что даёт проверка is_int($user_id) и если заменить в сигнатуре integer на int

Автор: MoLeX 4.7.2012, 13:32
вроде нерабочий функционал, хотя могу и ошибаться

Автор: baldina 4.7.2012, 14:08
Цитата(mark2009 @  4.7.2012,  12:32 Найти цитируемый пост)
 PHP позволяет указать тип аргумента непосредственно в функции.

если это массив или объект, а не скалярный тип. Вас не смутило слово instance?  smile 
Цитата

Type hints can not be used with scalar types such as int or string. Traits are not allowed either.

http://php.net/manual/en/language.oop5.typehinting.php

Добавлено через 2 минуты и 49 секунд
php язык весьма странный. похож на лоскутное одеяло, местами в дырках, но с новой подкладкой. хотя одеяло тёплое и симпатишное (особенно подкладка), но в дырки дует.

Автор: Sentox 4.7.2012, 18:55
Ответ здесь
http://phpmaster.com/type-hinting-in-php/

Цитата

The Scalar Wars

There has been a bit of controversy regarding the addition of scalar PHP type-hinting in PHP 5.4. Those who oppose the change argue that this support would go against the fundamental designs of PHP. PHP is considered to be a weak typed language. In essence, this means that PHP does not require you to declare data types. Variables still have data types associated with them but you can do radical things like adding a string to an integer without resulting in an error.

In May of 2010 support for scalar type hinting was added to the PHP trunk. But because of community response this feature will not make its way into the 5.4 release.


В 5.4 не будет добавлена возможность скалярных величин.

Хотя здесь http://habrahabr.ru/post/136800/ утверждает обратное.

Автор: SamDark 4.7.2012, 20:16
Скалярные величины не будут добавлены никогда. По крайней мере таково мнение Лердорфа.

Автор: baldina 5.7.2012, 13:01
видимо потому что это сводит на нет автоматические преобразования типа. конечно можно сохранить преобразования и добавить типизацию , но это приведет к усложнению синтаксиса. для интерпретируемого языка без встроенных средств предварительной компиляции это роскошь

Автор: Sentox 5.7.2012, 14:03
А мне если честно не хватает несколько таких вещей иногда. Больше привык с однозначными переменными работать не жели преобразования.

Автор: mark2009 5.7.2012, 14:23
Понятно. Всем спасибо за ответы. Хотя мне, если честно, не хватило указания типа скалярной величины... 

Ну ладно. Ещё раз всем спасибо.


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