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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка ошибок пользовательских классов 
:(
    Опции темы
WolfAlone
Дата 13.11.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



Здравствуйте! Есть некоторый пользовательский класс:
Код

class class1
{
    public function __construct($a, $b, $c="World!")
    {
        echo "$a/$b/$c";
    }
    public  function some_function()
    {
        echo "Some function!";
    }
}           


В этом классе, как видно - в конструкторе содержится 3 аргумента (параметра), последний из которых имеет значение по умолчанию.

Если сделать так:
Код

$c = new class1("Hello");

То есть, передать не 2 (или 3) параметра в конструктор, то будет ошибка (предупреждение):
Warning: Missing argument 2 for class1::__construct()

Вопрос:
Как до вызова метода (функции) или конструктора класса, узнать, какое количество параметров он принимает, значения которых не определены по умолчанию, что бы избежать подобных ошибок (предупреждений)? То есть, если при создании экземпляра класса, если в конструктор передаются не все обязательные параметры - наприме, прервать выполнение скрипта с помощь, например
Код
exit();
 или выполнить какую-либо функцию.

P.S. Можно обязать конечного пользователя наследовать собственные классы (типа class1) от уже заранее заготовленного, базового класса. Но в таком случае, возникает вопрос, как сделать обработчик ошибок в нём?


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
The_Aleksey
Дата 13.11.2010, 18:35 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


<?php
*


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

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



Можно просто убрать вывод варнингов (это конечно проблему не решает, но на экран ничего не вылезет)
Код

class class1
{
   public function __construct($a, $b, $c="World!")
   {                
        echo "$a/$b/$c";
   }
   public  function some_function()
   {
        echo "Some function!";
   }
}
$c = @new class1("1");    

На выходе получилось: 1//World!
PM MAIL   Вверх
Shogun
Дата 13.11.2010, 19:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Через Reflection можно.


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
skyboy
Дата 13.11.2010, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вариантов немало, но очевидный и правильный - указать для всех "необязательных" параметров значения по умолчанию. если параметр "обязательный" и аргумент не передан - паника в скрипте уместна. Ведь все равно не понятно, откуда взять недостающие и, раз нет значения по умолчанию, не очевидные критические данные? с другой стороны, если вызывающий код не "знает", сколько аргументов требуется, то к черту такой вызывающий код! так недалеко до того, что вызывающий код начнет передавать не те аргументы или не в том порядке.

Добавлено через 5 минут и 4 секунды
для справки: менее очевидные и менее корректные - это передавать один аргумент-массив:
Код

// ...
public function __construct($args = array('arg1'=> 'defaultValue1', 'arg2'=> 'defaultValue2')) {
 // ...
}
// ....
$a = new B(array('arg1'=> 'value1', 'arg2'=> 'value2'));

или же объявить функцию вообще без параметров и использовать func_get_args:
Код

// ....
public function __construct() {
 $args = func_get_args();
 ....
}
// ....
$a = new B($arg1, 'value2');

но, в виду написанного ранее, я считаю этот путь порочным. и привожу это решение только "для информации"
PM MAIL   Вверх
Sentox
Дата 14.11.2010, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


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

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



Ломаем да!!! Ну и в принципе парим мозги.

Это сообщение отредактировал(а) Sentox - 14.11.2010, 02:18
PM MAIL   Вверх
Just123
Дата 14.11.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



http://ru2.php.net/manual/en/reflectionfun...fparameters.php

Цитата


Working on a new MVC Application Framework i use this method to check how many arguments are required before calling the sub method!

Example 

Код

<?php
        $this->method_args_count = $this->CReflection
            ->getMethod($Route->getMethod())
            ->getNumberOfParameters();
        //Maybe be 5 but if uri is /controller/method/single_param/ we only of 1
        $this->params = $Route->getParams(); //0 in some cases

        if($this->method_args_count > count($this->params))
        {
            $this->difference = ($this->method_args_count - count($this->params));
            for($i=0;$i<=$this->difference;$i++)
            {
                $this->params[] = false;
            }
        }
        
        //Call the method with correct amount of params
        // but as false for params that have not been passed!
        call_user_func_array(array(new $this->obj,$Route->getMethod()),$this->params);
?>



PM MAIL   Вверх
Just123
Дата 16.11.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я реализовал это следующим образом:

Код

            if (is_callable(array($this->class, $this->method))) {
                
                $reflection = new ReflectionMethod($this->class, $this->method);
                $this->number_required_args = $reflection->getNumberOfRequiredParameters();
                
                if ($this->number_required_args > $this->uri->total_segments()) {
                    show_error('В функцию передано недостаточно аргументов.');
                }
                call_user_func_array(array($this->class, $this->method), $this->uri->segments);
             


Правда, не знаю, как лучше сделать, недостающим аргументам присваивать значение FALSE или показывать ошибку.  

Это сообщение отредактировал(а) Just123 - 16.11.2010, 01:05
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.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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