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

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

1. Joo - 19 Июля, 2010 - 19:24:37 - перейти к сообщению
Здравствуйте, уважаемые пользователи. У меня такой вопрос.
Есть класс, с некими методами, мне нужно заставить работать их и как Static и как обычный метод.

PHP:
скопировать код в буфер обмена
  1. class foo(){
  2.   public function bar(){}
  3. }
  4. //Надо добиться работоспособности данного кода
  5. $f = new foo();
  6. $f->bar();
  7. foo::bar();


Следует учесть, что в методе могут быть обращения как к static свойствам так и к не статик.
2. Champion - 19 Июля, 2010 - 19:58:39 - перейти к сообщению
Статичные методы и не статичные ведут себя по-разному. Не может метод одновременно быть и так, и так. Ты ведь не можешь идти одновременно налево и направо.
3. Joo - 19 Июля, 2010 - 20:08:35 - перейти к сообщению
Champion пишет:
Статичные методы и не статичные ведут себя по-разному. Не может метод одновременно быть и так, и так. Ты ведь не можешь идти одновременно налево и направо.


Я могу идти или налево или направо, это я решаю и остаюсь я самим собой (пока еще не раздвоился), куда бы я не шел. Вот я и хочу заставить метод работать или так, или так, выбирать поведение на лету.

Я знаю, что вызвать функцию можно и так и так, но хотелось бы определить каким образом функция вызвана, как статик или нет, и от этого как раз определить её поведение.

У меня есть класс. В некоторых местах нужны, отдельные экземпляры этого класса, а в некоторых нужен глобальный экземпляр.
Конечно можно где то объявить переменную, и там где надо просто написать global $varFoo; а можно и прям внутри класса статическую переменную данного класса сделать, static $varFoo; и потом к ней обращаться как foo::$varFoo->bar(); Можно. Но задача стоит в другом, нужно чтобы был static и not static метод с одним именем и обращение происходило как foo::bar() или varFoo->bar()
4. wats - 19 Июля, 2010 - 20:37:36 - перейти к сообщению
так нельзя сделать и вообще в чем смысл?
5. Joo - 19 Июля, 2010 - 20:42:47 - перейти к сообщению
wats пишет:
так нельзя сделать и вообще в чем смысл?


Смысл есть. А на счет нельзя, я когда то встречал пример похожего поведения, но не обратил внимания, а теперь не могу отыскать.
6. Joo - 20 Июля, 2010 - 13:53:13 - перейти к сообщению
Все просто, но в свежей версии PHP вызовет предупреждение
PHP:
скопировать код в буфер обмена
  1. class foo{
  2.     public function bar(){
  3.         if(isset($this)){
  4.             echo('Не статик');
  5.         }else{
  6.             echo('Статик');
  7.         }
  8.     }
  9. }
  10.  
  11. $obj = new foo();
  12. $obj->bar();
  13. foo::bar();
7. ArchAngel - 20 Июля, 2010 - 17:45:57 - перейти к сообщению
Извиняюсь за такой нубский вопрос но что делать параметр static ?
8. unded - 20 Июля, 2010 - 21:21:12 - перейти к сообщению
Статические члены класса
Определения классов могут теперь включить статических членов класса (свойства и методы), доступ к которым осуществляется через класс. Общее использование статических членов показано на примере:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Singleton {
  3.      static private $instance = NULL;
  4.  
  5.      private function __construct() {
  6.      }
  7.  
  8.      static public function getInstance() {
  9.          if (self::$instance == NULL) {
  10.              self::$instance = new Singleton();
  11.          }
  12.          return self::$instance;
  13.      }
  14. }
  15. ?>

Статические методы
Вы можете теперь определить методы как статические, разрешая им быть вызванными вне контекста объекта. Статические методы не определяются через переменную $this, поскольку они не должны быть ограничены определенным объектом.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class MyClass {
  4.      static function helloWorld() {
  5.          print "Hello, world";
  6.      }
  7. }
  8. MyClass::helloWorld();
  9. ?>
  10.  

 

Powered by ExBB FM 1.0 RC1