Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP5) вопрос, про передачу параметров функции, реально ли такое? / 8 сообщений из 8, страница 1 из 1
05.06.2013, 08:16
    #38286159
однобитный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
Здрасте! Сегодня вопрос у меня не стандартный...
Можно ли каким либо образом передавать разные параметры функции?

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

go123("page", "\"123\"");
go123("item", "$par = \"123\", $arr = array()");

function go123($class_name, $str = "")
{

$class = new $class_name(eval($str));

return $class;

}

допустимо ли такое? есть ли другое лучшее решение?
...
Рейтинг: 0 / 0
05.06.2013, 08:20
    #38286166
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
...
Рейтинг: 0 / 0
05.06.2013, 08:24
    #38286171
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
однобитный,

можно то можно, только зачем?
если на вход конструктора будет приходить ВСЕ ЧТО УГОДНО, тогда придется внутри него и разгребать входные параметры, определять что пришло и что с этим делать. в итоге контруктор будет огромным, с кучей условий, ветвлений и т.д.

опишите РЕАЛЬНУЮ задачу, где вам нужно такое поведение в классе. иначе сложно предположить что именно вы хотите получить.
...
Рейтинг: 0 / 0
05.06.2013, 08:42
    #38286181
однобитный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
у меня есть класс для создания коллекции, я им создаю классы, для постраничного вывода

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
class GenericObjectCollection extends BaseModel
{

private $table_name;
private $primary_key;
private $contentMetaOnly;
private $class_name;
private $items_per_page;
private $item_count = 0;
private $id_array;
private $obj_array;

public function __construct($table_name, $primary_key, $class_name, $contentMetaOnly = array())
{

	parent::__construct();
	$this->table_name = $table_name;
	$this->primary_key = $primary_key;
	$this->class_name = $class_name;
	$this->contentMetaOnly = $contentMetaOnly;

}

...

}



например, выводим товары на определенной странице ("передаем на вид": список товаров, номер текущей страницы, номера страниц)

Код: php
1.
2.
3.
$this->view->assign_by_ref("items", $items->GetItems($page_pos));
$this->view->assign("page_cur_pos", $page_pos);
$this->view->assign("page_count_pos", $items->GetPageCount());



тут $items->GetItems($page_pos), использует класс GenericObjectCollection, для создания коллекции товаров "item"

т.е.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
public function GetItems($id_category = -1, $page_num = 1, $sort = "title")
{

  $objArray = array();

	$dbc = new GenericObjectCollection(DB_TABLE_PREFIX . "item", "id_item", "item", array("id_item", "id_category", "title", "article", "price", "sklad", "flag_new", "flag_hit"));

	$sql = "...";
	
	$result = $this->db->getRows($sql);

	for($i=0; $i<sizeof($result);$i++)
	{

		$dbc->AddTuple($result[$i]["id_item"]);

	}

	$dbc->SetPageSize($this->items_per_page);

	$dbc->PopulateObjectArray($page_num);

	$objArray = $dbc->RetrievePopulatedObjects($page_num);

	$this->item_count = $dbc->GetItemCount();
	$this->page_count = $dbc->GetNumPages();

	return $objArray;

}



все бы хорошо, но если я захочу создать не класс "item", а "itemadvanced", которому в конструктор надо передать еще дополнительные параметры... поэтому хочу расширить класс коллекций

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class GenericObjectCollection extends BaseModel
{

private $table_name;
private $primary_key;
private $contentMetaOnly;
private $class_name;
private $items_per_page;
private $item_count = 0;
private $id_array;
private $obj_array;

public function __construct($table_name, $primary_key, $class_name, $contentMetaOnly = array()[color=red], $add_pars = ""[/color])
{

	parent::__construct();
	$this->table_name = $table_name;
	$this->primary_key = $primary_key;
	$this->class_name = $class_name;
	$this->contentMetaOnly = $contentMetaOnly;
        [color=red]$this->add_pars = $add_pars;[/color]

}

...

}



т.е. при создании класса, должны в конструктор класса передаваться эти "произвольные параметры", т.е.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public function PopulateObjectArray($page_num = 0)
{
...
			$result_rows = $this->db->getRows($sql);

			for ($i=0; $i<=sizeof($result_rows)-1; $i++)
			{

                                $this_row = $result_rows[$i];
				$this_db_row_id = $this_row[$this->primary_key];
				$this_index = $this->_GetIndexFromTupleID($this_db_row_id);

				if ($this_index >= 0)
				{

                                 // вот так было раньше, т.е. тут я хочу передать эти дополнительные произвольные параметры     
                                 // $this->obj_array[$this_index] = new $this->class_name($this_row);
                                 [color=red]$this->obj_array[$this_index] = new $this->class_name($this_row, eval($this->add_pars));[/color]
										
				};

...
	
}



вообщем как бы так
...
Рейтинг: 0 / 0
05.06.2013, 08:58
    #38286193
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
однобитный,

правильнее тогда
создать отдельные классы для "item" и "itemadvanced"
причем "itemadvanced" потомок от "item".
и в их конструкторах принимать все доп параметры, а в методах реализовать все отличительные особенности в поведении и в наличии данных.

мешать все в одном - плохое решение. класс раздуется, много лишних связей, чревато ошибками и сложно поддерживать. расширять далее еще сложнее.
...
Рейтинг: 0 / 0
05.06.2013, 09:10
    #38286207
однобитный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
r uоднобитный,

правильнее тогда
создать отдельные классы для "item" и "itemadvanced"
причем "itemadvanced" потомок от "item".
и в их конструкторах принимать все доп параметры, а в методах реализовать все отличительные особенности в поведении и в наличии данных.

мешать все в одном - плохое решение. класс раздуется, много лишних связей, чревато ошибками и сложно поддерживать. расширять далее еще сложнее.
да у меня так и есть

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Item extends PersistableItem
{

public function __construct($initdict)
{

	parent::__construct($initdict);

}

...

}



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class ItemAdvanced extends Item
{

public function __construct($initdict, $id_user)
{

	parent::__construct($initdict);
      
        $this->id_user = $id_user;

}

...

}



просто вот в чем суть... Как передать второй параметр в конструктор класса из функции PopulateObjectArray(), т.е. вот тут:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public function PopulateObjectArray($page_num = 0)
{
...
                                 // вот так было раньше, т.е. тут я хочу передать эти дополнительные произвольные параметры     
                                 // $this->obj_array[$this_index] = new $this->class_name($this_row);

            $class = new ReflectionClass('ReflectionFunction');
            // вообщем надо что-то вроде этого, но чтобы newInstanceArgs передавала один обязательный параметр массив $this_row, а второй - массив произвольных параметров... вот я и не знаю как быть тут...
            $this->obj_array[$this_index] = $class->newInstanceArgs($this_row, $this->contentAdditional);
										
...
	
}
...
Рейтинг: 0 / 0
05.06.2013, 09:35
    #38286228
однобитный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
странно, походу получилось

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
          if(count($this->contentAdditional) > 0)
          {

            $class = new ReflectionClass($this->class_name);
            $this->obj_array[$this_index] = $class->newInstanceArgs(array($this_row, $this->contentAdditional));

          }
          else
          {
          
            $this->obj_array[$this_index] = new $this->class_name($this_row);
          
          }
...
Рейтинг: 0 / 0
05.06.2013, 09:52
    #38286245
однобитный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP5) вопрос, про передачу параметров функции, реально ли такое?
спасибо!!!
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP5) вопрос, про передачу параметров функции, реально ли такое? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]