Вызов метода класса и C экстеншена

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Вызов метода класса и C экстеншена

Столкнулся с проблемой при вызове метода класса, структура примерно такая

PHP:
class A
{
  function A()
  {
    $this->var_test['f']='hello';
  } 
  function aaa($p)
  {
     if(isset($this->var_test[$p]))
        return $this->var_test[$p];
     return FALSE;
  }
}

class B
{
  public $instA;
  function B()
 {
   $this->instA = new A;
  }
}

вызов 

$b = new B;
Подскажите, как правильно вызвать из С экстеншена полный ПХП аналог $b->instA->aaa('f');
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
есть пхп-файл в котором вышепреведенный код.
есть экстеншен, который вызывает аналог $b->instA->aaa('f'); из С, так вот как это все правильно организвать вплане вызова функции call_user_function
 

tony2001

TeaM PHPClub
вот именно поэтому я и просил подробнее, я не повторить то же самое.

>есть экстеншен, который вызывает аналог $b->instA->aaa('f'); из С
ну вызывает и вызывает, зачем его трогать?

>так вот как это все правильно организвать вплане вызова функции call_user_function

наверное, для начала стоит просто сесть и разобраться как это вообще происходит.
сначала у объекта $b надо получить атрибут instA, а потом вызвать у этого атрибута метод aaa().
вызвать метод можно, например, zend_call_method() или zend_call_function().
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
если подробно то вот примерно как пытаюсь:
Код:
zval			**tmp;
	HashTable* ht = &EG(symbol_table);

	if (zend_hash_find(ht,"b", 2, (void**)&tmp) == SUCCESS)
	{
		if(Z_TYPE_PP(tmp) == IS_OBJECT)
		{
			HashTable* prop = Z_OBJPROP_PP(tmp); 
			
			if (zend_hash_find(prop,"instA", 6, (void**)&tmp) == SUCCESS)
			{
				zend_class_entry* ce = Z_OBJCE_PP(tmp);

				if(Z_TYPE_PP(tmp) == IS_OBJECT)
				{
					zval functionName; 
					zval functionResult;
					zval functionParam;

					zval* functionParams[1] = {&functionParam};

					ZVAL_STRING(&functionName, "aaa", 0);
					ZVAL_STRING(&functionParam, "f", 0);

					functionName.refcount = 1;
					functionParam.refcount = 1;

					zend_try {
						if(call_user_function(NULL,(zval**)tmp,&functionName,&functionResult,1,functionParams TSRMLS_CC) == SUCCESS)
							hash = functionResult.value.lval;
						zval_dtor(&functionResult);
					} zend_catch {
						throw_error("exception",0 TSRMLS_CC);
					} zend_end_try(); 
				}
			}
		}
	}
возможно со скопочками проблемы, выдрал кусок кода
 

tony2001

TeaM PHPClub
>HashTable* ht = &EG(symbol_table);
>if (zend_hash_find(ht,"b", 2, (void**)&tmp) == SUCCESS)

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

-~{}~ 22.02.08 12:09:

и ты опять забыл рассказать в чем проблема.
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Ой, сорри, переменная b создана уже, она создется внутри пхп скрипта, то что она существует, в момент выполнения кода экстеншена, это 100%,

а вот проблема в том, что вылетает исключение внутри call_user_function, и побороть это немогу.

Сорри что не увидел кнопочку 'code' ,для форматирования
 

tony2001

TeaM PHPClub
>Ой, сорри, переменная b создана уже, она создется внутри пхп скрипта,
>то что она существует, в момент выполнения кода экстеншена, это 100%

это всё равно не более, чем кривой костыль.

>а вот проблема в том, что вылетает исключение внутри call_user_function, и побороть это немогу.

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

Ирокез

бессмертный пони
Команда форума
Партнер клуба
с исключением, я побороться могу ), меня больше интересует вопрос, как правильно вызвать, метод из экстеншена, потому как в том виде, в ктором я сейчас вызываю, вылетает исключение, что привело меня к мысле, что я неправильно вызываю метод. Вопрос то и состоит и в том, как правильно, а не почему у меня исключение. Причем как правильно вызвать метод, я ни нашел ни в постовляемых с php кодами, ни к литературе, ни в гуле.

PS: возможно я вышел из лесу, но я часто не общаюсь на форумах, поэтому, может каких-то, правил и порядков установленных не знаю, посему заранее приношу свои извинения, за косоязычность :)
 
Сверху