как сделать чтобы это заработало Код (PHP): $a = 1; class Ttt { function first($a) { $a = $a + 1; return $a; } function second($a) { $a = this::first($a)//ругается на эу строки //если написать $a = first($a); тоже ругается //Fatal error: Call to undefined function first() in return $a; } } $a = Ttt::second($a); echo $a; ошибка Fatal error: Class 'this' not found in Z
тогда вот что Parse error: syntax error, unexpected T_OBJECT_OPERATOR in... Добавлено спустя 1 минуту 11 секунд: Код (PHP): $a = 1; class Ttt { function first($a) { $a = $a + 1; return $a; } function second($a) { [b]$a = this->first($a);[/b] return $a; } } $a = Ttt::second($a); echo $a;
Fatal error: Using $this when not in object context in Z... on line 16 Добавлено спустя 1 минуту 45 секунд: Код (PHP): $a = 1; class Ttt { function first($a) { $a = $a + 1; return $a; } function second($a) { [b]$a = $this->first($a);[/b] return $a; } } $a = Ttt::second($a); echo $a; Добавлено спустя 3 минуты 32 секунды: если сделать экземпляр класса внутри функции, то получается, но хотелось бы не делать такого Код (PHP): function second($a) { $b= New Ttt; $a = $b::first($a); return $a; }
???? $obj = new Ttt(); $a = $obj->second($a); или public static function second($a) $a = Ttt::second($a); Может книжку почитаешь? Добавлено спустя 2 минуты 35 секунд: Напиши что хочешь, я не понимаю, пока я вижу просто хрень какую то.
По идее должен ругаться и на Код (PHP): $a = Ttt::second($a); , т.к. функция second($a) не объявлена статической. Нужно объявлять так Код (PHP): public static function second($a){...} //и public static function first($a) {...} Тогда first($a) снаружи класса вызывается Код (PHP): $a = Ttt::second($a); , а внутри Код (PHP): <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
Да, теперь работает без ошибок Добавлено спустя 5 минут 23 секунды: впринципе работает и без public static functions. Короче секрет в слове self Код (PHP): $a = 1; class Ttt { function first($a) { $a = $a + 1; return $a; } function second($a) { $a = self::first($a); return $a; } } $a = Ttt::second($a); echo $a; Добавлено спустя 15 минут 14 секунд: еще тут хорошее описание http://php.ru/manual/language.oop5.static.html
Просто у вас не включены предупреждения. Работать будет но с последующими предупреждениями: 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 раз будет работать медленнее... Так как сначала роется в статике и не находит выводя предупреждение, а потом лезет в объект. Да и возможны недоразумения в дальнейших обработках и условиях, по этому ваш скрипт не корректен и не стоит его использовать с такой концепцией и последовательностью вызова.
пытаюсь вывести код без слова static, но ошибки не выводятся (ниже код и настройки php и apache Код (PHP): class Ttt{ public function first($a) { $a = $a + 1; return $a; } public function second($a) { $a = self::first($a); return $a; } } $c =Ttt::second($a); echo $c; в php.ini стоит: Код (Text): error_reporting = E_ALL display_errors = On display_startup_errors = On перед кодом: Код (Text): error_reporting(E_ALL); в .htaccess стоит: Код (Text): php_value display_errors On php_value display_startup_errors 1 ## показать все ошибки кроме предупреждений (Notice) ## php_value error_reporting "E_ALL & ~E_NOTICE" php_value error_reporting "E_ALL"
Значит версия старовата. Вообще, указания области видимости функции Public / Private, а так же static методов - хорошая практика. Кстати, судя по всему вы плаваете в терминологии и ОПП, ознакомьтесь с этим для начала: http://goo.gl/1LKk6C (прямые ссылки на php.net режутся этим форумом), что бы понимать что к чему и лишний раз не наступать на грабли.