про self вопрос

Духовность™

Продвинутый новичок
про self вопрос

Что-то я торможу. Посмотрите на код

PHP:
class a
{
    private $var;
    
    public function __construct($var)
    {
        $this->var = $var;
    }
    
    function printed()
    {
        echo $this->var;
    }
    
    function foo()
    {
        self::printed();
    }
}

$a = new a(123456);
$a->foo();
self::рrinted() можно было бы заменить на $this->printed(); и результат был бы точно такой же. В данном случае self - это эквивалент $this или что это такое?.. Как более правильно писать?
 

Духовность™

Продвинутый новичок
нет, статик - это отдельная тема. Я привел конкретный код и я не пойму, в чем разница между написанием с this и self в данном случае.
 

AmdY

Пью пиво
Команда форума
$this является псевдопеременной в контексте класса ссылающейся на сам _объект_, потому правильнее использовать $this

-~{}~ 02.03.09 16:10:

а self связан с самим классом, поэтому можно делать в статическом методе для создания объекта "new self()";
 

x-yuri

Новичок
$this ссылается на текущий объект и вызовы через :: текущий объект не меняют, поэтому может создастся впечатление, что self и $this - одно и то же. На этом основана работа parent (может еще чего-то)
 

A1x

Новичок
self::printed(); - это статический вызов, а так как в методе printed используется $this более правильно будет писать $this->printed();
в статических методах нельзя использовать $this
 

A1x

Новичок
parent::printed() - это специальный случай, метод родителя по-другому не вызовешь.

я думаю что если в методе есть $this то его правильнее не вызывать статически (через :: кроме parent::) во избежание возможной путаницы
 

fixxxer

К.О.
Партнер клуба
если говорить не об ооп а о пхп реализации то дело обстоит так ;)

$this определяется как ссылка на текущий класс при обращениях к объекту класса - явных ( $FooObject->method() ) или неявных ( new FooClass -> $this в конструкторе, magic-методы и т.п. ).

self - это своего рода динамический #define - можно считать, что во время компиляции в байткод заменяется на имя класса, в котором находится.

parent:: можно считать что заменяется точно так же на имя родительского класса.

при этом $this это такая хитрая переменная, которая сохраняется при вложенных вызовах методов, если не была этим вызовом переопределена (в т.ч. и в не особо "логичных" с точки зрения классических ООП-языков ситуациях). это объясняет, как работает parent, но дает и простор для хаков которыми никогда не стоит пользоваться ;)

например

PHP:
/tmp$ cat 1.php
<? 
class A {
    function x() {
        var_dump($this);
    }
}

class B {
    function y() {
        A::x();
    }
}

$obj = new B;
$obj->y();
/tmp$ php 1.php
object(B)#1 (0) {
}
Тут this не переопределился потому что мы делаем статический вызов. А статический вызов ничего с $this не делает.

Кстати, определение метода как static в php делает единственную вещь - отменяет установку $this при его вызове.
 

x-yuri

Новичок
это объясняет, как работает parent, но дает и простор для хаков которыми никогда не стоит пользоваться
может быть удобно сделать метод, который может как работать с текущим объектом, так и принимать объект в качестве параметра (правда это получается в пределах одного класса). Но согласен, что такие случаи - скорее исключение, чем правило
 

A1x

Новичок
$this определяется как ссылка на текущий класс при обращениях к объекту класса
может лучше говорить что $this - это ссылка на текущий объект (экземпляр класса) ?
 
Сверху