ООП, вызов функции, нупский вопрос :)

bobo

Новичок
Привет :) Раздел вроде правильно выбрал.

Имеем класс:

PHP:
class Test {

    function testfunc {

        ....

    }

}
Что бы получить доступ к функции делаем:

PHP:
$tralala = new Test;
$tralala -> testfunc();
Еще можно так:

PHP:
$tralala = Test::testfunc();
Правильно ?

Вопрос: чем эти способы отличаются и какой из них лучше использовать ?
 

zerkms

TDD infected
Команда форума
Они отличаются тем, что в первом случае у тебя есть объект (который может хранить какое-то внутреннее состояние), а во втором - у тебя обычная функция, просто вложенная в класс.
 

zerkms

TDD infected
Команда форума
Если непонятно то что я сказал - тогда всё таки придётся где-нибудь почитать, что такое объект, а что такое класс.
 

bobo

Новичок
Грубо говоря через "::" я могу получить только результат работы функции, а через стрелку могу менять значения переменных и т.д. ?
 

Духовность™

Продвинутый новичок
Во-первых, твой пример не сработает (если указать строгий стандарт отлова ошибок E_STRICT, с PHP 5) и он выдаст ошибку
Strict Standards: Non-static method Test::testfunc() should not be called statically in Z:\home\test\www\index.php on line 9
Hellow
Во-вторых, http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование
 

tz-lom

Продвинутый новичок
zerkms , ты не совсем прав ( self:: , static:: )

вызов через -> это вызов метода объекта (экземпляра класса)
через :: это вызов статического метода класса

а вот об этом читать - уже в документацию / гугл
 

zerkms

TDD infected
Команда форума
tz-lom
да не надо ему голову забивать, в данный момент ему хватит с головой того, что я сказал.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Ок, спасибо, а можно как то подробнее ?)
В первом случае ты можешь в функции использовать $this, потому что объект создан. Во втором - не можешь.
Поэтому в первом случае ты можешь хранить в объекте какие-то данные
 

Активист

Активист
Команда форума
В первом случае ты можешь в функции использовать $this, потому что объект создан. Во втором - не можешь.
Поэтому в первом случае ты можешь хранить в объекте какие-то данные
Хммм.. Все зависит от контекста.

PHP:
<?php
class foo {
public function bar() {
$this->data = 0;
}
}

class bar {
public $data = 1;
public function foo() {
var_dump($this->data);
foo::bar();
var_dump($this->data);
}
}

$bar = new bar();
$bar->foo();
?>
Код:
linux-debian-1:~# php /root/test.ph
int(1)
int(0)
Но так делать не стоит.
 
Сверху