Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как запустить класс по имени?
 
 автор: а-я   (10.05.2010 в 21:09)   письмо автору
 
 

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


<?php

class test
    
{
    function 
__construct($a$b$c$d)
        {
        }
    }

$test = new test($a$b$c$d);

// надо запустить так же, но через фунцию... при этом кол-во аргументов неизвестно

function load($class)
    {
    
$args func_get_args();
    
array_shift($args);
    return new 
$class(????);
    }

$test load($class$a$b$c$d);

?>


рылся в call_user_method_array() - но тут запуск метода в классе.. а мне бы создать экземпляр класса..

  Ответить  
 
 автор: neadekvat   (10.05.2010 в 21:21)   письмо автору
 
   для: а-я   (10.05.2010 в 21:09)
 

Возможно, я не совсем понял: вам надо в функцию передать имя класса и аргументы для конструктора этого класса.
При этом вы не знаете, сколько будет у конкретного конструктора аргументов, или хотите сделать функцию,с помощью которой можно будет вызывать классы, в конструкторах которых разное кол-во аргументов?

  Ответить  
 
 автор: а-я   (11.05.2010 в 09:14)   письмо автору
 
   для: neadekvat   (10.05.2010 в 21:21)
 

Да, именно так.. может и вообще не быть аргументов.

  Ответить  
 
 автор: Николай2357   (10.05.2010 в 22:59)   письмо автору
 
   для: а-я   (10.05.2010 в 21:09)
 

Вот тут интересные есть вещи по этому поводу.

  Ответить  
 
 автор: а-я   (11.05.2010 в 09:22)   письмо автору
 
   для: Николай2357   (10.05.2010 в 22:59)
 

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

  Ответить  
 
 автор: Саня   (11.05.2010 в 09:57)   письмо автору
 
   для: а-я   (10.05.2010 в 21:09)
 

Вариант с reflection:
<?
class test {
  function 
__construct($a$b$c$d) {
  }
}

function 
load($class) {
  
$args func_get_args(); 
  
array_shift($args); 
  
$refl = new ReflectionClass($class);
  return 
$refl->newInstanceArgs($args);
}

$test load('test'1234);


Другой вариант:
<?
class test {
  function 
__construct($a$b$c$d) {
  }
  public static function 
getInstance($a$b$c$d) {
    return new 
self($a$b$c$d);
  }
}

function 
load($class) {
  
$args func_get_args(); 
  
array_shift($args); 
  return 
call_user_func_array(array($class'getInstance'), $args);
}

  Ответить  
 
 автор: а-я   (11.05.2010 в 10:38)   письмо автору
 
   для: Саня   (11.05.2010 в 09:57)
 

благодарю..

2ой вариант отпадает.. желательно не изменять класс.

первый вариант буду тестировать... =)

  Ответить  
 
 автор: а-я   (11.05.2010 в 16:07)   письмо автору
 
   для: Саня   (11.05.2010 в 09:57)
 

все равно просит готовый экземпляр

<? 
class test 
  function 
__construct($a$b$c$d) { 
  } 


function 
load($class) { 
  
$args func_get_args();  
  
array_shift($args);  
  
$refl = new ReflectionClass(NEW $class); 
  return 
$refl->newInstanceArgs($args); 


$test load('test'1234);



так вроде работает)

  Ответить  
 
 автор: Саня   (11.05.2010 в 16:25)   письмо автору
 
   для: а-я   (11.05.2010 в 16:07)
 

Не понял кто чего просит...
<?php

class test 
  function 
__construct($a$b$c$d) {
  }
}  

function 
load($class) {  
  
$args func_get_args();   
  
array_shift($args);   
  
$refl = new ReflectionClass($class);  
  return 
$refl->newInstanceArgs($args);  
}  

$test load('test'1234);
$test2 load('test'1234);
var_dump($test);  // object(test)#2
var_dump($test2); // object(test)#3
var_dump($test === $test2); // false
Всё работает верно $test и $test2 разные объекты одного и того же класса.

$refl = new ReflectionClass(NEW $class)
гененрирует много warning'ов

  Ответить  
 
 автор: а-я   (11.05.2010 в 16:38)   письмо автору
 
   для: Саня   (11.05.2010 в 16:25)
 

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

  Ответить  
 
 автор: Саня   (11.05.2010 в 16:42)   письмо автору
 
   для: а-я   (11.05.2010 в 16:38)
 

А с какого в этом объекте что-то будет, если описание его класса выглядит так?
<?
class test {  
  function 
__construct($a$b$c$d) { 
  } 
}

  Ответить  
 
 автор: а-я   (11.05.2010 в 16:55)   письмо автору
 
   для: Саня   (11.05.2010 в 16:42)
 

я просто получаю

Fatal error: Call to undefined method ReflectionClass::start()


хотя метод "start()" в классе есть...
где-то сам лажанулся...

попытаюсь найти.. еще раз спасибо..

  Ответить  
 
 автор: а-я   (11.05.2010 в 17:01)   письмо автору
 
   для: а-я   (11.05.2010 в 16:55)
 

не видит он мои методы.. т.е. не работает


$refl = new ReflectionClass($name); 
$refl->newInstanceArgs($args);
$refl->start();// <- не работает...


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

может не так запускать теперь?

  Ответить  
 
 автор: Саня   (11.05.2010 в 17:03)   письмо автору
 
   для: а-я   (11.05.2010 в 17:01)
 

Не к тому объекту применяете метод.
<?
$refl 
= new ReflectionClass($name);  
$instance $refl->newInstanceArgs($args); 
$instance->start();

newInstanceArgs() возвращает объект класса $name, заданный в конструкторе рефлектора.

  Ответить  
 
 автор: а-я   (11.05.2010 в 17:26)   письмо автору
 
   для: Саня   (11.05.2010 в 17:03)
 

О, Благодарю... =) работает как часы.

  Ответить  
 
 автор: Саня   (11.05.2010 в 17:01)   письмо автору
 
   для: а-я   (11.05.2010 в 16:55)
 

.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования