Вопрос синтаксиса

slego

Новичок
Вопрос синтаксиса

Возникла проблемка, может кто сталкивался и знает пути решения.
Есть необходимость реализовать следующее

я могу cделать так

PHP:
class Foo
{
    public function __construct(){};
    public function doSomething(){}
}

$class_name = "Foo";
$bar = new $class_name();
$bar->doSomething();
что работает. Но мне нужно сделать так

PHP:
class Foo
{
    public function __construct(){};
    public  STATIC  function doSomething(){}
}

$class_name = "Foo";
$class_name::doSomething();
что НЕ работает. Выдается ошибка "Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in..." :( (на всякий случай - смысл ошибки я понимаю :) )

Такая заморочка нужна для автоматизации кода на основе конфигурационного файла.
 

slego

Новичок
Где-то так получается?
PHP:
$class_name = "Foo"
call_user_func(array($class_name, "doSomething"));
Спасибо большое. Только все равно не понятно, почему при
PHP:
$bar = new $class_name();
интерпретация происходит нормально, а при
PHP:
$class_name::doSomething()
вываливается ошибка. Или это особенность php и с этим нужно просто смириться?
 

basboy

Новичок
slego
Вот выдержка из мануала
PHP:
<?php
class A
{
   function foo()
   {
       if (isset($this)) {
           echo '$this is defined (';
           echo get_class($this);
           echo ")\n";
       } else {
           echo "\$this is not defined.\n";
       }
   }
}

class B
{
   function bar()
   {
       A::foo();
   }
}

$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>
-~{}~ 27.09.05 10:42:

А вот резулт:

$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined
 

basboy

Новичок
svetasmirnova
slego
Ладно, в след. раз буду чуваку просто ссылку давать на ман.
 

svetasmirnova

маленький монстрик
Всё равно не поняла какое отношение к заданному вопросу имеет $this :confused:
 

slego

Новичок
basboy
Просто желательно "чувакам" давать ссылки по теме
 

basboy

Новичок
svetasmirnova
slego
Экзампл показывает как и в каких случаях используются конструкции типа
PHP:
A::foo();
и
PHP:
$a->foo();
СИнтаксис подразумевает, что если перед набором символов стоит $, то это будет или переменная, или экземпляр класса.
для переменной конструкции -> и :: не подходят, а для экземпляра класса подходит только ->

А
PHP:
A::foo();
используется для доступа к методам и свойствам классов на прямую.

Таким образом
PHP:
$class_name::doSomething()
заведомо работать не будет.
В данном случае даже с константами не прокатит.
 

svetasmirnova

маленький монстрик
basboy
А как ты думаешь, для чего $this:
PHP:
function foo()
   {
       if (isset($this)) {
           echo '$this is defined (';
           echo get_class($this);
           echo ")\n";
       } else {
           echo "\$this is not defined.\n";
       }
   }
в примере? Почему авторы так эту функцию не определили?
PHP:
function foo()
   {
       if (isset($x)) {
           echo '$x is defined (';
           echo __CLASS__;
           echo ")\n";
       } else {
           echo "\$x is not defined.\n";
       }
   }
 

slego

Новичок
ну как что, почему

$class_name::doSomething()

не работает. Вроде как все логично.

-~{}~ 27.09.05 16:18:

а если ты про $this, то это пока туманно
 

svetasmirnova

маленький монстрик
Ладно, тогда ответь мне, пожалуйста, почему авторы примера назвали переменную таким странным именем как $this, а не $x, к примеру?

-~{}~ 27.09.05 16:21:

>а если ты про $this, то это пока туманно
так разберитесь с $this сначала, заодно и эту страницу мана внимательно прочитайте.
 

slego

Новичок
а ты не понимаешь или пытаешься заставить нас увидеть и понять САМИМ что-то? ;)
 

slego

Новичок
1. мне бы ссылку на ман
2. а что, собственно с $this должно быть не понятно?(называется посмотрел чуть внимательней). Вот как раз c $x возникают недоумения... А при чем тут $x?

-~{}~ 27.09.05 16:30:

боюсь, прописные истины сейчас будем обсуждать, но все-таки. В чем проблема? Я вроде как о другом совершенно топик заводил.

Ну да ладно, итак: объект класса создан - $this (указатель сам на себя) определен. Если обращаемся как к статическому методу, используя имя класса, то $this'у появится неоткуда.

Или речь о другом?
 

svetasmirnova

маленький монстрик
1. http://www.php.net/manual/ru/language.oop5.basic.php
Читать то, что написано перед примером.
2. Мне непонятно какое отношение этот пример имеет к тому, что PHP не поддерживает синтаксис $class_name::doSomething().

-~{}~ 27.09.05 16:35:

Ну да ладно, итак: объект класса создан - $this (указатель сам на себя) определен. Если обращаемся как к статическому методу, то $this'у появится неоткуда.
Это правильно. Но причём тут то, что PHP не поддерживает синтаксис $class_name::doSomething()?
 

slego

Новичок
1. Я прекрасно осознал для чего "назвали переменную таким странным именем как $this" очень-очень давно, еще на заре изучения с++. Если ты именно ЭТО хотела донести до нас ;)

2. Пример, думаю, мало что иллюстрирует. Но вот комментарий
Автор оригинала: basboy
Синтаксис подразумевает, что если перед набором символов стоит $, то это будет или переменная, или экземпляр класса.
для переменной конструкции -> и :: не подходят, а для экземпляра класса подходит только ->"
лично меня убедил.

-~{}~ 27.09.05 16:43:

хотя, возможно, объяснение совершенно в другом :)
 
Сверху