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

Форум PHP

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

 

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

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

тема: Method name must be a string
 
 автор: Лена   (17.01.2011 в 14:44)   письмо автору
 
 

форма описывается в виде массива:

$aForm = array(
//атрибуты формы
            ),
        'inputs' => array(
    //здесь идут элементы формы
    ),

     'checkers' => array (
                'Title'=>array(
                  'func' => 'check_length',
                  'notice' => 'заполните имя!',
                  ),

                 'areaG'=>array(
                 'func' => 'check_length_textarea',
                 'notice' => 'Вы не написали сообщение!',
                 ),

            )

);


Как видно, в этом массиве в 'checkers' указываются функции, которые проверяют входящие значения.
'func' - название функции
'notice' - сообщение об ошибке.

Определяю свойство:
$this->aCheckers = isset($aForm['checkers'])? $aForm['checkers']: array();


Делаю вызов метода, который занимается обработкой ошибок:


    //обработчик ошибок формы
    public function CheckForm($_REQUEST){
     foreach($_REQUEST as $aKey=>$aValue){
                $this->error .= $this->$aCheckers[$aKey]['func']($aKey,$this->$aCheckers[$aKey]['notice']);
                  return $this->error;
       }
    }


Мне выдает ошибку:
Fatal error: Method name must be a string in Z:\home\simmetry1\www\core\classes\Form.php on line 89
Как мне вместо $this->$aCheckers[$aKey]['func'] подставить имя функции?

  Ответить  
 
 автор: neadekvat   (17.01.2011 в 14:49)   письмо автору
 
   для: Лена   (17.01.2011 в 14:44)
 

Не совсем догоняю, но мб так:
$func_name = $this->$aCheckers[$aKey]['func'];
$this->error .= $func_name($aKey,$this->$aCheckers[$aKey]['notice']);

  Ответить  
 
 автор: Лена   (18.01.2011 в 13:11)   письмо автору
 
   для: neadekvat   (17.01.2011 в 14:49)
 

сделала вот так:

    public function CheckForm(){
        if(isset($_REQUEST)){
             foreach($_REQUEST as $aKey=>$aValue){
                 $func = $this->aCheckers[$aKey]['func'];
                $this->error .= $this->$func($aKey,$this->aCheckers[$aKey]['notice']);
                  return $this->error;
             }
        }
    }


Все равно пишет: Method name must be a string и ссылается на строку, где метод вызывается.

  Ответить  
 
 автор: neadekvat   (18.01.2011 в 13:53)   письмо автору
 
   для: Лена   (18.01.2011 в 13:11)
 

upd. не сразу понял, в чем суть.

Вот смотрите, это же то, что вам нужно? У меня работает правильно.
<?php
class test
{
    public function 
__construct()
    {
        
$func 'some';
        
$this->$func('asd');
    }

    public function 
some($arg)
    {
        echo 
$arg;
    }
}

new 
test// asd

  Ответить  
 
 автор: Лена   (18.01.2011 в 14:49)   письмо автору
 
   для: neadekvat   (18.01.2011 в 13:53)
 

Да, вы правильно поняли.
Переделала ваш пример под свои нужды. Получилось вот что.

<?php
class test{

private 
$error='';
private 
$aCheckers = array(
                
'Title'=>array(
                      
'func' => 'some',
                      
'notice' => 'Здесь сообщение об ошибке!',
                      ),

                 
'areaG'=>array(
                 
'func' => 'some1',
                 
'notice' => 'Ошибка в текстареа!',
                 ),
);


    public function 
Check($arr){
        foreach(
$arr as $aKey=>$aValue){
                 
$func $this->aCheckers[$aKey]['func'];
                 
$this->error .= $this->$func();
                  return 
$this->error;
             }

        
//$func = 'some';
        //$this->$func('asd');
    
}

    public function 
some(){

       return 
'1111111111111111';

    }

        public function 
some1(){

        return 
'222222222222222222';

    }

}

$test = new test;
$arr = array('Title'=>'asdfg','areaG'=>'zxczxczxczxc');
print 
$test->Check($arr);



Если запустить скрипт, видно, что срабатывает почему-то только один метод - some(), почему так, не знаете? Там же через цикл должны все методы прогоняться...

  Ответить  
 
 автор: Trianon   (18.01.2011 в 15:04)   письмо автору
 
   для: Лена   (18.01.2011 в 14:49)
 

куда все?
там return внутри тела цикла.

  Ответить  
 
 автор: Лена   (18.01.2011 в 15:13)   письмо автору
 
   для: Trianon   (18.01.2011 в 15:04)
 

Спасибо, не заметила, не внимательная. То, что надо, получилось.

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

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