Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызвать метод в классе перед необходимым методом 
V
    Опции темы
neoks
Дата 27.9.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Например, есть класс с несколькими методами и есть в нем один метод который вызывается постоянно перед тем как вызвать необходимый для какой та проверки, например проверить есть ли соединения с БД, если есть то продолжить вызов метода если нет то прервать )

Например:

Код

classs test{
    function a(){
         return 'a';
    }
    function b(){
         return 'b';
    }

    function __init_method(){
         global $test;
         if($test) return true;
         else echo 'lol';
    }
}

$b = new test;
$b->a(); // результат lol так как $test в __init_method равна false


Возможно ли такое ?, если нет то придется по старинке проверять в каждом методе необходимые параметры ))
PM MAIL   Вверх
bars80080
Дата 27.9.2012, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Код

classs test{
    function a(){
         $this->__init_method();
         return 'a';
    }
    function b(){
         return 'b';
    }
    function __init_method(){
         global $test;
         if($test) return true;
         else echo 'lol';
    }
}


а так нельзя?
PM MAIL WWW   Вверх
ksnk
Дата 27.9.2012, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

classs test{
    function _a(){
         return 'a';
    }
    function _b(){
         return 'b';
    }

    function __call($methos,$args){
        if(is_callable(array($this,'_'.$method)) {
           if ($this->__init_method()===true) {
              call_user_func_array(array($this,'_'.$method),$arg)
           }
        }
    }

    function __init_method(){
         global $test;
         if($test) return true;
         else echo 'lol';
    }
}
$b = new test;
$b->a(); // результат lol так как $test в __init_method равна false



или так

Это сообщение отредактировал(а) ksnk - 27.9.2012, 15:49


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 27.9.2012, 16:18 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



__construct()

Добавлено через 45 секунд
а для прерывания конечно же throw Exception


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 27.9.2012, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Код

function __call($methos,$args){
        if(is_callable(array($this,'_'.$method)) {
           if ($this->__init_method()===true) {
              call_user_func_array(array($this,'_'.$method),$arg)
           }
        }
    }


Работает только если перед методом стоит знак ( _ ) почему так ? переписывать все методы как-то не особо хочется ))


Цитата(Fortop @  27.9.2012,  16:18 Найти цитируемый пост)
__construct()

Не пойму а как он может определить, вызывается только один раз, как вариант писать какую-та переменную с статусом true/false и потом в каждом методе проверять ее )
PM MAIL   Вверх
Sanchezzz
Дата 27.9.2012, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



__construct() вызывается при new class();
__call
Вызывается всегда когда к методу нетe доступа извне грубо говоря
Код

class A {

protected function a(){
  print 'method run a<br>'
}

function __call(){
 PRINT 'call me<br>';
 }

}

A::A();


Это сообщение отредактировал(а) Sanchezzz - 27.9.2012, 17:20


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
baldina
Дата 27.9.2012, 17:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата
__construct()

Цитата(neoks @  27.9.2012,  17:06 Найти цитируемый пост)
Не пойму а как он может определить

речь идет о том, что конструирование объекта нужно возложить на конструктор. если объект создан, то он в находится в "правильном" состоянии, например, БД заведомо открыта.

PM MAIL   Вверх
Sanchezzz
Дата 27.9.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



TS Если вы так хотите сделать по уму зашейте соединение БД отдельно в static свойство другого класса и вызывайте через функцию, которая будет получать конект если его нету или возвращать соединение.
Код

class bd  {
 public static $bd = null;
 public static function init(){
      if(is_null(self::$bd)){
         self::$bd  =  mysql_connect  ...     // mysqli   // PDO(
      }
      return self::$bd;
 }





class a {

function getUser($id){
  $pdo = bd::init();
  $pdo->prepare('select * from user where id=:id');
  //...

}

}



Этот метод даст вам обращаться к функциям класса неявно что добавляет удобность на мой взгляд.
a::getUser(1);
Конечно придется там где используется Бд везде воткнуть bd::init(); в функцией я обычно решаю такой вопрос поиском и заменой

Это сообщение отредактировал(а) Sanchezzz - 27.9.2012, 17:56


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
neoks
Дата 27.9.2012, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Ну как я читал как я пробовал
__construct()  вызывается когда создается новый класс
__call вызывается когда в классе нет того метода который мне нужен, я пользуюсь им что ошибки не вылазили, но не вызывается когда метод есть в классе ))

Задача как я писал нужно в каждом методе проверить есть соединения с бд или еше че )) то есть сейчас я везде в методах пишу типа

Код

if(!$this->ajaxLoad) return;
if($this->sl->fn->check_ac('admin')) return;
if(!$this->sl->db->connect(false)) return;


И так в каждом почти методе почти в каждом классе, хотелось бы упростить эту задачу всего одной функцией
Как показал ksnk работает тока если во всех методах дописать знак (_) то есть _a() _b() _show() логику я понял )
Но как быть если я сделаю так ?

Код

$test->_a();


То тут __call() уже не сработает так как вызвал правильно и не будет не какой проверки )

PM MAIL   Вверх
baldina
Дата 27.9.2012, 17:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(neoks @  27.9.2012,  17:53 Найти цитируемый пост)
if(!$this->ajaxLoad) return;
if($this->sl->fn->check_ac('admin')) return;
if(!$this->sl->db->connect(false)) return;

почему бы не проверить это один раз где-нить в начале скрипта? в конструкторе? каждая функция - не подходящее место
PM MAIL   Вверх
neoks
Дата 27.9.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(baldina @  27.9.2012,  17:56 Найти цитируемый пост)

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

Вот именно это мне и нужно, нужно проверить как-то один раз, а как я хз, у меня класс это модуль загружаемый с адресной строки, я могу вбить там любой модуль и любой метод ) и все это мне нужно проверять чтоб умники там не хулиганили smile
PM MAIL   Вверх
ksnk
Дата 27.9.2012, 18:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(neoks @  27.9.2012,  17:06 Найти цитируемый пост)
Работает только если перед методом стоит знак ( _ ) почему так ? переписывать все методы как-то не особо хочется ))

Это нужно было, чтобы сработал сам метод call, иначе выполнится собственный метод. Можно его сделать private, но это тоже означает переписывание кода.

Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
у меня класс это модуль загружаемый с адресной строки, я могу вбить там любой модуль и любой метод ) и все это мне нужно проверять чтоб умники там не хулиганили

Ну тогда нужно вставить проверку и запуск прямо в этот самый вызов

Код

$class,$method,$arg ;// входные параметры

$x=new class();
        if(is_callable(array($x,$method)) {
           if(is_callable(array($x,'__init_method')) {
               call_user_func(array($this,'__init_method');
           }
           call_user_func_array(array($x,$method),$arg)
        }
    


Это сообщение отредактировал(а) ksnk - 27.9.2012, 18:48


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 27.9.2012, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



А решил по другому сделать, не знаю почему сразу не подумал, у меня при автозагрузки класса вызывается метод init(), добавил еше init_member() равносильно __construct(), ну проверять все же приходится но теперь вместо с десяток строк мона написать одну )

Но все же хотелось бы ка кто вообще без проверки в методах сделать чтоб какой та отдельный метод все проверял )
PM MAIL   Вверх
skyboy
Дата 27.9.2012, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(neoks @  27.9.2012,  16:06 Найти цитируемый пост)
Работает только если перед методом стоит знак ( _ ) почему так ? переписывать все методы как-то не особо хочется ))

переименовать и все.
можно сделать это динамически через какой-то classkit. но нестабильно-экспериментально-нафига?
архитектурно это можно решить, работая с исключениями. на верхнем уровне — перехват. на нижнем — подавление/дополнительная работа только в случае необходимости.
вот, дискуссия была: Какой смысл в исключениях (Exeption)? 
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
 у меня класс это модуль загружаемый с адресной строки

Ну и что?

Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
нужно проверить как-то один раз, а как я хз

Написали же.
В конструкторе.
Именно этим, кстати, неудобны статические методы. Ты постоянно в каждом методе должен думать о том, готово и валидно ли окружение у тебя (есть ли коннект, хватает ли места на диске и т.д.).
В обычном случае, для вызова любого метода любого объекта вам потребуется сначала инстанцировать сам объект.

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



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1218 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.