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
Форумы портала PHP.SU :: Версия для печати :: CLASS метод в методе
Форумы портала PHP.SU » PHP » Программирование на PHP » CLASS метод в методе

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

1. ALEN - 28 Июня, 2010 - 12:35:57 - перейти к сообщению
По логике необходимо сделать метод в методе, но что-то немного туго выходит это, может от перенапряжения я что-то неправильно думаю, но суть такая:
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 методы? Если их не писать как вложенные то все отлично, но если ситуация требует вложенности?
2. kochan10 - 28 Июня, 2010 - 13:27:16 - перейти к сообщению
функции задаются отдельно. потому что если ты верхнюю по вложенности функцию вызовешь второй раз, то будет ошибка, потому что она попробует создать уже созданную функцию. лучше задавать их отдельно, без вложенностей, и просто вызывать одну функцию из другой
(Добавление)
и ещё. ты вызываешь третий метод, используй в нём переменную $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."

(Добавление)
и третий метод уже не может обращаться к классу напрямую, так как он вложен не в класс, а в функцию.
3. ALEN - 28 Июня, 2010 - 14:31:02 - перейти к сообщению
kochan10
Я понимаю, что если вызывать метод из корня, то все ок и все правильно, но я не нашел, что создание метода в методе - это неправильно...

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

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


P.S, В качестве подтверждения моих слов перетяните функции из метода в класс и все будет работать...
4. kochan10 - 28 Июня, 2010 - 14:54:25 - перейти к сообщению
переменная var2, хоть и объявлена в четвёртом методе публичной, но она почему-то не передаётся из первого метода
(Добавление)
кстати, попробуйте вызвать первый метод ещё раз. сразу после его первого вызова, скажем. и вы поймёте, почему так делать нежелательно.
5. ALEN - 28 Июня, 2010 - 14:58:10 - перейти к сообщению
kochan10
В том то и дело...
Нигде не могу найти объяснения...
6. kochan10 - 28 Июня, 2010 - 15:00:19 - перейти к сообщению
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 здесь не катит...
7. ALEN - 28 Июня, 2010 - 15:06:45 - перейти к сообщению
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. ?>
8. kochan10 - 28 Июня, 2010 - 15:08:32 - перейти к сообщению
да! видишь, у тебя первый метод сделан так, что он. когда его вызывают, декларирует второй метод. и когда ты его вызываешь второй раз, он снова пытается декларировать второй метод. но он уже задекларирован! второй раз нельзя!
9. ALEN - 28 Июня, 2010 - 15:13:10 - перейти к сообщению
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. ?>


Почему так не работает?
10. kochan10 - 28 Июня, 2010 - 15:16:26 - перейти к сообщению
потому что у тебя $var2 не передаётся в четвёртый метод. в самом начале первого метода пропиши global $var2;
и всё норм будет.а в четвёртом методе это лишнее. и не вкладывай методы друг в друга. лучше просто вызывай один из другого. так стабильнее. можно вкладывать, но это может повлечь серьёзные ошибки в дальнейшем
11. ALEN - 28 Июня, 2010 - 15:17:43 - перейти к сообщению
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. ?>


Тот же прикол...
12. kochan10 - 28 Июня, 2010 - 15:20:16 - перейти к сообщению
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. ?>

смотри третью строчку. вот это должно быть, чтобы работало.
13. ALEN - 28 Июня, 2010 - 15:22:37 - перейти к сообщению
kochan10
Действительно, глобально в функции и во вложенной сделал и все ок, а как насчет класса с передачей данных?
14. kochan10 - 28 Июня, 2010 - 15:25:18 - перейти к сообщению
Вот твой первый код (с моими поправками):
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. ?>

Так всё прекрасно работает.
(Добавление)
Хоть работает у тебя?=)))
15. JustUserR - 28 Июня, 2010 - 15:40:08 - перейти к сообщению
ALEN пишет:
В данном примере методы 3 и 4 не дают желаемого результата, а 3 метод вызывает фатальную ошибку. Как заставить работать 3 и 4 методы? Если их не писать как вложенные то все отлично, но если ситуация требует вложенности?
Использование создания функции внутри другой функции или внутри любого функционального блока само по себе имеет мало пользы - поскольку в общем случае не является замыканием с сохранением контекстной области переменных Если вам необходимо создание именно динамических функций то воспользуйтесь create_function - или же библиотекой runkit для управления существующими методами

 

Powered by ExBB FM 1.0 RC1