За последние 24 часа нас посетили 34828 программистов и 1818 роботов. Сейчас ищут 1634 программиста ...

Вызов функции внутри функции- ошибка (простой пример)

Тема в разделе "PHP для новичков", создана пользователем php_user, 7 июн 2014.

  1. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    как сделать чтобы это заработало
    Код (PHP):
    1. $a = 1;
    2. class Ttt {        
    3.     function first($a) {
    4.         $a = $a + 1;
    5.         return $a;
    6.     }
    7.     function second($a) {
    8.         $a = this::first($a)//ругается на эу строки
    9.                                     //если написать $a = first($a); тоже  ругается
    10.                                    //Fatal error: Call to undefined function first() in 
    11.         return $a;
    12.     }
    13. }
    14. $a = Ttt::second($a);
    15. echo $a;
    ошибка Fatal error: Class 'this' not found in Z
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    $this->first()
     
  3. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    тогда вот что Parse error: syntax error, unexpected T_OBJECT_OPERATOR in...

    Добавлено спустя 1 минуту 11 секунд:
    Код (PHP):
    1. $a = 1;
    2. class Ttt {        
    3.     function first($a) {
    4.         $a = $a + 1;
    5.         return $a;
    6.     }
    7.     function second($a) {
    8.         [b]$a = this->first($a);[/b]
    9.         return $a;
    10.     }
    11. }  
    12. $a = Ttt::second($a);
    13. echo $a; 
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
  5. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    Fatal error: Using $this when not in object context in Z... on line 16

    Добавлено спустя 1 минуту 45 секунд:
    Код (PHP):
    1. $a = 1;
    2. class Ttt {        
    3.     function first($a) {
    4.         $a = $a + 1;
    5.         return $a;
    6.     }
    7.     function second($a) {
    8.         [b]$a = $this->first($a);[/b]
    9.         return $a;
    10.     }
    11. }  
    12. $a = Ttt::second($a);
    13. echo $a; 
    Добавлено спустя 3 минуты 32 секунды:
    если сделать экземпляр класса внутри функции, то получается, но хотелось бы не делать такого

    Код (PHP):
    1. function second($a)    {
    2.         $b= New Ttt;
    3.         $a = $b::first($a);
    4.         return $a;
    5.  }
    6.  
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    ????
    $obj = new Ttt();
    $a = $obj->second($a);
    или
    public static function second($a)

    $a = Ttt::second($a);

    Может книжку почитаешь?

    Добавлено спустя 2 минуты 35 секунд:
    Напиши что хочешь, я не понимаю, пока я вижу просто хрень какую то.
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    По идее должен ругаться и на
    Код (PHP):
    1. $a = Ttt::second($a); 
    , т.к. функция second($a) не объявлена статической.
    Нужно объявлять так
    Код (PHP):
    1. public static function second($a){...}
    2. //и
    3. public static function first($a) {...} 
    Тогда first($a) снаружи класса вызывается
    Код (PHP):
    1. $a = Ttt::second($a); 
    , а внутри
    Код (PHP):
    1. <span class="syntaxdefault">$a </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">first</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$a</span><span class="syntaxkeyword">); </span><span class="syntaxdefault"></span>
    Читаем о двойных двоеточиях php.net/manual/ru/language.oop5.paamayim-nekudotayim.php
     
  8. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    Да, теперь работает без ошибок

    Добавлено спустя 5 минут 23 секунды:
    впринципе работает и без public static functions. Короче секрет в слове self
    Код (PHP):
    1. $a = 1;
    2. class Ttt
    3. {        
    4.     function first($a)
    5.     {
    6.         $a = $a + 1;
    7.         return $a;
    8.     }
    9.     
    10.     function second($a)
    11.     {
    12.         $a = self::first($a);
    13.         return $a;
    14.     }
    15. }  
    16. $a = Ttt::second($a);
    17. echo $a; 
    Добавлено спустя 15 минут 14 секунд:
    еще тут хорошее описание
    http://php.ru/manual/language.oop5.static.html
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Просто у вас не включены предупреждения.
    Работать будет но с последующими предупреждениями:
    Strict Standards: Non-static method Ttt::second() should not be called statically
    Strict Standards: Non-static method Ttt::first() should not be called statically

    По этому в 10 раз будет работать медленнее...
    Так как сначала роется в статике и не находит выводя предупреждение, а потом лезет в объект.
    Да и возможны недоразумения в дальнейших обработках и условиях, по этому ваш скрипт не корректен и не стоит его использовать с такой концепцией и последовательностью вызова.
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ммм.. оказывается есть такое волшебное слово self
     
  11. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    пытаюсь вывести код без слова static, но ошибки не выводятся (ниже код и настройки php и apache

    Код (PHP):
    1. class Ttt{        
    2.    public function first($a) {
    3.         $a = $a + 1;
    4.         return $a;   
    5.     }
    6.     public function second($a) {
    7.         $a = self::first($a);
    8.         return $a;
    9.     }
    10. }  
    11. $c =Ttt::second($a);
    12. echo $c; 
    в php.ini стоит:
    Код (Text):
    1. error_reporting  =  E_ALL
    2. display_errors = On
    3. display_startup_errors = On
    перед кодом:
    Код (Text):
    1. error_reporting(E_ALL);
    в .htaccess стоит:
    Код (Text):
    1. php_value display_errors On
    2. php_value display_startup_errors 1
    3. ## показать все ошибки кроме предупреждений (Notice)
    4. ## php_value error_reporting "E_ALL & ~E_NOTICE"
    5. php_value error_reporting "E_ALL"
     
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Значит версия старовата. Вообще, указания области видимости функции Public / Private, а так же static методов - хорошая практика.

    Кстати, судя по всему вы плаваете в терминологии и ОПП, ознакомьтесь с этим для начала: http://goo.gl/1LKk6C (прямые ссылки на php.net режутся этим форумом), что бы понимать что к чему и лишний раз не наступать на грабли.
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7