Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: CLASS метод в методе

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
ALEN
Отправлено: 28 Июня, 2010 - 12:35:57
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




По логике необходимо сделать метод в методе, но что-то немного туго выходит это, может от перенапряжения я что-то неправильно думаю, но суть такая:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class class1{
  3. public $var1;
  4. function method1($string){
  5. function method2($string2){
  6. return preg_replace("/2010/isU","2011",$string2);
  7. }
  8. function method3(){
  9. return  preg_replace("/2010/isU","2012",$this->var1);
  10. }
  11. function method4(){
  12. global $var2;
  13. return  preg_replace("/2010/isU","2013",$var2);
  14. }
  15.  
  16. $this->var1=$string;
  17. $var2=$string;
  18. echo method2($string)."<br/>".method3()."<br/>".method4();
  19.  
  20. }
  21. }
  22.  
  23. $ob=new class1;
  24. $ob->method1("PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  25. campaign to increase the overall code coverage of PHP through PHPT tests. During
  26. TestFest, PHP User Groups and individuals around the world organize local events
  27. where new tests are written and new contributors are introduced to PHP's testing
  28. suite.");
  29. ?>
  30.  


В данном примере методы 3 и 4 не дают желаемого результата, а 3 метод вызывает фатальную ошибку. Как заставить работать 3 и 4 методы? Если их не писать как вложенные то все отлично, но если ситуация требует вложенности?


Отредактировано модератором: JustUserR, 28 Июня, 2010 - 15:28:13
Обрамил PHP-код в соответствующий BB-тег
 
 Top
kochan10
Отправлено: 28 Июня, 2010 - 13:27:16
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




функции задаются отдельно. потому что если ты верхнюю по вложенности функцию вызовешь второй раз, то будет ошибка, потому что она попробует создать уже созданную функцию. лучше задавать их отдельно, без вложенностей, и просто вызывать одну функцию из другой
(Добавление)
и ещё. ты вызываешь третий метод, используй в нём переменную $var1, которую ты не задал. нужно тогда прописать что-то вроде
PHP:
скопировать код в буфер обмена
  1. $ob->var1="PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  2. campaign to increase the overall code coverage of PHP through PHPT tests. During
  3. TestFest, PHP User Groups and individuals around the world organize local events
  4. where new tests are written and new contributors are introduced to PHP's testing
  5. suite."

(Добавление)
и третий метод уже не может обращаться к классу напрямую, так как он вложен не в класс, а в функцию.
 
 Top
ALEN
Отправлено: 28 Июня, 2010 - 14:31:02
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




kochan10
Я понимаю, что если вызывать метод из корня, то все ок и все правильно, но я не нашел, что создание метода в методе - это неправильно...

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

PHP:
скопировать код в буфер обмена
  1. public $var1;
  2. ....
  3. $this->var1=$string;


P.S, В качестве подтверждения моих слов перетяните функции из метода в класс и все будет работать...
 
 Top
kochan10
Отправлено: 28 Июня, 2010 - 14:54:25
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




переменная var2, хоть и объявлена в четвёртом методе публичной, но она почему-то не передаётся из первого метода
(Добавление)
кстати, попробуйте вызвать первый метод ещё раз. сразу после его первого вызова, скажем. и вы поймёте, почему так делать нежелательно.
 
 Top
ALEN
Отправлено: 28 Июня, 2010 - 14:58:10
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




kochan10
В том то и дело...
Нигде не могу найти объяснения...
 
 Top
kochan10
Отправлено: 28 Июня, 2010 - 15:00:19
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. Fatal error: Cannot redeclare method2() (previously declared in C:\xampp\htdocs\test.php:8) in C:\xampp\htdocs\test.php on line 8

Эта функция уже создана, второй раз нельзя. Поэтому лучше создавать функции там, где будет практически невозможно вернуться к этим строкам, для повторного "создания" функции.
(Добавление)
ааааа, публичная - это означает, что её значение не сбросится, после выполнения функции, а останется. чтобы с ней можно было и потом работать. поэтому public $var2 здесь не катит...
 
 Top
ALEN
Отправлено: 28 Июня, 2010 - 15:06:45
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




kochan10
Где она создана?

Проблема вообще в этом месте не в классах, а в функциях и их вложенности:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function method1($string){
  3. function method2($string2){
  4. return preg_replace("/2010/isU","2011",$string2);
  5. }
  6. function method4(){
  7. global $var2;
  8. return preg_replace("/2010/isU","2013",$var2);
  9. }
  10. $var2=$string;
  11. echo method2($string)."<br/>".method4();
  12. }
  13.  
  14. method1("PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  15. campaign to increase the overall code coverage of PHP through PHPT tests. During
  16. TestFest, PHP User Groups and individuals around the world organize local events
  17. where new tests are written and new contributors are introduced to PHP's testing
  18. suite.");
  19. ?>
 
 Top
kochan10
Отправлено: 28 Июня, 2010 - 15:08:32
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




да! видишь, у тебя первый метод сделан так, что он. когда его вызывают, декларирует второй метод. и когда ты его вызываешь второй раз, он снова пытается декларировать второй метод. но он уже задекларирован! второй раз нельзя!
 
 Top
ALEN
Отправлено: 28 Июня, 2010 - 15:13:10
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




kochan10
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function method1($string){
  3. function method4(){
  4. global $var2;
  5. return preg_replace("/2010/isU","2013",$var2);
  6. }
  7. $var2=$string;
  8. echo method4();
  9. }
  10. method1("PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  11. campaign to increase the overall code coverage of PHP through PHPT tests. During
  12. TestFest, PHP User Groups and individuals around the world organize local events
  13. where new tests are written and new contributors are introduced to PHP's testing
  14. suite.");
  15. ?>


Почему так не работает?
 
 Top
kochan10
Отправлено: 28 Июня, 2010 - 15:16:26
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




потому что у тебя $var2 не передаётся в четвёртый метод. в самом начале первого метода пропиши global $var2;
и всё норм будет.а в четвёртом методе это лишнее. и не вкладывай методы друг в друга. лучше просто вызывай один из другого. так стабильнее. можно вкладывать, но это может повлечь серьёзные ошибки в дальнейшем
 
 Top
ALEN
Отправлено: 28 Июня, 2010 - 15:17:43
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




kochan10
Заметь проблема не в объявлении метода, а в передаче ему информации из вне...
т.е. вариант:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function method1(){
  3. function method4(){
  4. $var2="PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  5. campaign to increase the overall code coverage of PHP through PHPT tests.";
  6. return preg_replace("/2010/isU","2013",$var2);
  7. }
  8. echo method4();
  9. }
  10. method1();
  11. ?>


Работает то отлично!


kochan10
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function method1($string){
  3. global $var2;
  4. function method4(){
  5. return preg_replace("/2010/isU","2013",$var2);
  6. }
  7. $var2=$string;
  8. echo method4();
  9. }
  10. method1("PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  11. campaign to increase the overall code coverage of PHP through PHPT tests. During
  12. TestFest, PHP User Groups and individuals around the world organize local events
  13. where new tests are written and new contributors are introduced to PHP's testing
  14. suite.");
  15. ?>


Тот же прикол...

(Отредактировано автором: 28 Июня, 2010 - 15:20:31)

 
 Top
kochan10
Отправлено: 28 Июня, 2010 - 15:20:16
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function method1($string){
  3. global $var2;
  4. function method4(){
  5. return preg_replace("/2010/isU","2013",$var2);
  6. }
  7. $var2=$string;
  8. echo method4();
  9. }
  10. method1("PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  11. campaign to increase the overall code coverage of PHP through PHPT tests. During
  12. TestFest, PHP User Groups and individuals around the world organize local events
  13. where new tests are written and new contributors are introduced to PHP's testing
  14. suite.");
  15. ?>

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

(Отредактировано автором: 28 Июня, 2010 - 15:22:50)

 
 Top
ALEN
Отправлено: 28 Июня, 2010 - 15:22:37
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




kochan10
Действительно, глобально в функции и во вложенной сделал и все ок, а как насчет класса с передачей данных?
 
 Top
kochan10
Отправлено: 28 Июня, 2010 - 15:25:18
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Вот твой первый код (с моими поправками):
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class class1{
  3. public $var1;
  4. function method1($string){
  5. global $var2;
  6. $this->var1=$string;
  7. $var2=$string;
  8. echo $this->method2($string)."<br/>".$this->method3()."<br/>".$this->method4();
  9. }
  10. function method2($string2){
  11. return preg_replace("/2010/isU","2011",$string2);
  12. }
  13. function method3(){
  14. return preg_replace("/2010/isU","2012",$this->var1);
  15. }
  16. function method4(){
  17. global $var2;
  18. return preg_replace("/2010/isU","2013",$var2);
  19. }
  20. }
  21.  
  22. $ob=new class1;
  23. $ob->method1("PHP is proud to announce TestFest 2010. TestFest is PHP's annual
  24. campaign to increase the overall code coverage of PHP through PHPT tests. During
  25. TestFest, PHP User Groups and individuals around the world organize local events
  26. where new tests are written and new contributors are introduced to PHP's testing
  27. suite.");
  28. ?>

Так всё прекрасно работает.
(Добавление)
Хоть работает у тебя?=)))

(Отредактировано автором: 28 Июня, 2010 - 15:37:34)

 
 Top
JustUserR
Отправлено: 28 Июня, 2010 - 15:40:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




ALEN пишет:
В данном примере методы 3 и 4 не дают желаемого результата, а 3 метод вызывает фатальную ошибку. Как заставить работать 3 и 4 методы? Если их не писать как вложенные то все отлично, но если ситуация требует вложенности?
Использование создания функции внутри другой функции или внутри любого функционального блока само по себе имеет мало пользы - поскольку в общем случае не является замыканием с сохранением контекстной области переменных Если вам необходимо создание именно динамических функций то воспользуйтесь create_function - или же библиотекой runkit для управления существующими методами


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB