[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Конструкторы классов
Alehandr
Давно мучаюсь от того, что в классе не может быть более 1 конструктора.

PHP
class ErrorExample {
  public function __construct($arg1){
    ...
  }
  public function __construct($arg2, $arg3){
    ...
  }
  ...
}


Есть ли у кого наработки или идеи по обходу этой проблемы?



Спустя 8 минут, 40 секунд (2.06.2009 - 15:06) sergeiss написал(а):
Делай конструктор с параметрами по умолчанию, и будет тебе счастье smile.gif Тогда твой первый конструктор легко и просто помещается во втором.

На вопрос "как это сделать" я отправлю в хэли из моей подписи. Раздел Справочник языка-Classes-Constructors.
Правда, там часть текста идет на английском smile.gif

Спустя 6 минут, 50 секунд (2.06.2009 - 15:13) Alehandr написал(а):
sergeiss
Не, параметр по умолчанию не всегда подходит.
Если использовать параметр по умолчанию идет последовательная пропись, и это не всегда удобно.

Спустя 4 минуты, 18 секунд (2.06.2009 - 15:17) sergeiss написал(а):
Цитата (Alehandr @ 2.06.2009 - 16:13)
Если использовать параметр по умолчанию идет последовательная пропись, и это не всегда удобно.

Если честно, то я нифига не понял - какая такая "последовательная пропись"??? blink.gif Как говорится "понял, что ты меня послал, но не понял, куда именно" biggrin.gif

И вообще. БД тебе не нравится, параметры по умолчанию для конструкторов не нравятся... А может, надо просто пересмотреть твоё отношение к этому всему?

Спустя 8 минут, 53 секунды (2.06.2009 - 15:26) Alehandr написал(а):
sergeiss
Я не говорил, что БД мне не нравятся. smile.gif

Говоря о последовательной прописи, я имел то, что если к примеру конструктор принимает 4 параметра, где они все с параметром по умолчанию, то чтобы указать только 3, придется все-равно прописывать и 1 и 2.

Спустя 2 минуты, 24 секунды (2.06.2009 - 15:29) sergeiss написал(а):
Ну тогда сделай один параметр, который будет ассоциативным массивом. И проблем не будет.

Цитата (Alehandr @ 2.06.2009 - 16:26)
Я не говорил, что БД мне не нравятся. smile.gif

Ты - не говорил smile.gif Но по твоим некоторым словам и действиям создается такое ощущение.

Спустя 8 минут, 9 секунд (2.06.2009 - 15:37) Alehandr написал(а):
sergeiss
С массивом есть проблема постоянного запоминания ключей.
Я просто работаю в Zend Studio, а там по функциям (хоть стандартным, хоть своим) хелп выдается автоматический и помнить какая функция и что принимает необязательно, но если это массив, то возникает проблемка...

Идейка появилась...
А что если использовать доп.функцию создания (псевдоконструктор) в виде статической функции?

PHP
class Test {
  public static 
Create($arg1){
    
$new = new Test();
    ..
    return &
$new;
  }
  public static 
Create($arg2$arg3){ .. }
}

Спустя 6 минут, 29 секунд (2.06.2009 - 15:43) sergeiss написал(а):
""Я фигею, дорогая редакция...

То есть, ты не можешь запомнить порядок и смысл аргументов, и ты даже не можешь посмотреть эти аргументы?

Или же такой код
PHP
public function __construct($arg2$arg3)

ты запомнить можешь,
а такой
PHP
public function __construct($arg1)

где передаются параметры $arg1['arg2'] и $arg2['arg3']??? Или не знаешь, что так можно?

Спустя 8 минут, 14 секунд (2.06.2009 - 15:52) Alehandr написал(а):
sergeiss
Мы друг друга не понимаем.

Примеры из моего CMF:

PHP
<?
/**
 * @author Кваст Александр Владимирович
 */
class OutInput extends AOut
{
    protected 
$settings = array (
       ...
    );
    public function 
__construct($settings null$text null$type null$name null$value null$notnull null)
    {
        if (
$settings != null)
        {
            
parent::__construct($settings);
        } else
        {
            
$this->settings['text'] = $text;
            ...
        }
    }
    public function 
__toString()
    {
        ...
    }
}


И использование в разных случаях:

PHP
$form = new OutForm(null"Добавление страницы:""articles""addArticle");
        
$form->add(new OutInput(null"Страница:""text""page""""Введите имя страници!"));
        ...
        foreach (
Core::$config['languages'] as $pref => $language){
            
$names .= new OutInput(null"Заголовок [{$language}]:""text_{$pref}""name_{$pref}");
            ...
        }
        
$form->add($names $texts)->add(new OutInput(nullnull"submit"null"создать"));


Посмотри на вызовы new OutInput...

Спустя 18 минут, 34 секунды (2.06.2009 - 16:10) sergeiss написал(а):
Цитата (Alehandr @ 2.06.2009 - 16:52)
Мы друг друга не понимаем.

А я как раз тебя понял еще раньше biggrin.gif biggrin.gif biggrin.gif
Вот смотри.
Пишем так:
PHP
public function __construct$data )
    {
        
$settings=isset($data['settings'] ? $data['settings'] : null;
        
$text=isset($data['text'] ? $data['text'] : null;
        
$name=isset($data['name'] ? $data['name'] : null;
         .... 
// получаем все данные

        // далее весь твой код без изменений!!!
        
if ($data['settings'] != null)
        {
            
parent::__construct$data['settings']);
        } else
        {
            
$this->settings['text'] = $data['text'];
            ...
        }
     }


Использование.
Вариант 1.
PHP
// Сначала формируется массив
$data['settings']=null;
$data['text']=.....
// и затем вызывается 
$form->Add( new OutInput$data ) );

Вариант 2.
PHP
// либо указываем массив прямо внутри
$form->Add( new OutInput( array( 'text' =>"Страница:"'type'=>"text"
'name' => "page"'notnull' => "Введите имя страницы!" )

Спустя 6 минут, 39 секунд (2.06.2009 - 16:17) Alehandr написал(а):
sergeiss
Блин, такой конструктор я использовал раньше и он и сейчас работает! smile.gif
PHP
new OutInput(array());


Просто у меня классов выводов 9 штук и это только начало, и для каждого помнить ключи для массива аргумента конструктор или каждый раз смотреть не айс, поэтому сделал дополнение, через зануление первого агрумента, но бывает, что прописывать иногда приходится несколько null'ов подрят, а хотелось бы поудобнее.

Спустя 11 минут, 41 секунда (2.06.2009 - 16:29) Sylex написал(а):
в большинстве случаев использую массивы

кто знает, сколько еще параметров придется добавить, и в какое место, и как это отразиться на тех вызовах, которые уже где-то используются

может чем-то помогут эти функций - func_num_args(), func_get_arg() и func_get_args()

Спустя 2 минуты, 15 секунд (2.06.2009 - 16:31) Sylex написал(а):
Alehandr
больше вряд ли че придумаешь:)

Можно извратиться:
описать все аргументы функций - свойствами объекта. И вызов функции - без аргументов. Тогда ты легко можешь набивать только нужные тебе свойства для определенного метода в своем Zend. Ну и перед установкой значения любого - все свойства обнуляются, чтобы корректно было smile.gif

Спустя 5 минут, 41 секунда (2.06.2009 - 16:36) Alehandr написал(а):
Я все пытаюсь привести к лучшему виду при такой инициализации:
user posted image

Sylex
Эти функции я в другом случае использую.


И вообще что думаете о такой инициализации:
PHP
class Test {
  public static 
Create($arg1){
    
$new = new Test();
    ..
    return &
$new;
  }
  public static 
Create($arg2$arg3){ .. }
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.