Эта тема на forum.dklab.ru


Anonymous: Как обратиться к переменной, не создавая экземляр класса?
PHP 4

Как обратиться к переменной, не создавая экземляр класса? Типа этого:

class Name {

var $name = 'value';

}

echo Name::$name;

Работает только с ф-циями. Это вообще возможно?

PS Ключевое слово static появилось только в PHP 5?
Юрий Насретдинов:
echo Name::$name;
Потому что нужно не Name:$name, а Name:name...
Константин Жинько [tIT]:
PS Ключевое слово static появилось только в PHP 5?
В PHP4.3.чего-то-там
Maus:
Ключевое слово static появилось только в PHP 5?
Для переменных "]В PHP4.3.чего-то-там
Для методов классов, имхо, только в пятом
Константин Жинько [tIT]:
Для методов классов, имхо, только в пятом
Возможно... Помню, что в четверке это слово зарезервировано (-%
Anonymous:
[b][u]Юpий Насрeтдинов[/u][/b]
У вас работает на PHP 4 (одной из посл.):
<?php

class Name {

var $name = 'value';

}

echo Name::name;

?>

???

"]Возможно... Помню, что в четверке это слово зарезервировано (-%
Это наверное только для переменных ф-ций.
Юрий Насретдинов:
У вас работает на PHP 4 (одной из посл.):
Хм, действительно, не работает. Значит этого сделать нельзя. Для того, чтобы обращаться к переменным класса, нужно создавать для них объект.
Anonymous:
Жаль, Singleton хотел сделать.
Maus:
вроде в тему:
In PHP 4, only constant initializers for var variables are allowed. To initialize variables with non-constant values, you need an initialization function which is called automatically when an object is being constructed from the class. Such a function is called a constructor (see below)./* None of these will work in PHP 4. */
class Cart
{
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
var $items = array("VCR", "TV");
}

К сожалению насчет "::" в мане есть только примеры с методами, и нет - со свойствами. Можно, конечно, методов на каждое свойство напихать :) Во всяком случае, сие в 4.4 работает:
class Namme {

var $nam;
function getNam() {
$this->nam = 'value';
return $this->nam;
}

}
echo Namme::getNam();
Евгений Галашин:
Singleton хотел сделать.
static-переменная+метод класса?
Rumata:
http://ru3.php.net/manual/ru/keyword.paamayim-nekudotayim.php#40783

или


class DummyClass
{

function getStaticProperty($name, $value=NULL)
{
static $properties;
if ( !is_null($value) ) {
$properties[$name] = $value;
}
return $properties[$name];
}

function dummy($value=NULL)
{
return DummyClass::getStaticProperty('dummy', $value);
}
}

Anonymous:
Во всяком случае, сие в 4.4 работает:
Странно, $this ведь еще не существует? Спасибо, это все решает. Правда я уже сделал и через экземпляр (http://php4you.kiev.ua/docs/oop_patterns.html), ну ладно. Offtop: никто еще таких статей про OOP patterns с примерами на PHP не знает?

вроде в тему:
Не-а, это для доступа и через экземляр класса и через ::.

или
Спасибо, тоже работает, но мне пример Maus больше нравится как более простой.

static-переменная+метод класса?
Придется делать static-переменную ф-ции (а не класса), а это, как сказал Maus:
Можно, конечно, методов на каждое свойство напихать :)
Mich:
Лично я уже давно запутался как это все работает. Вот пример:


<?php

class Test {

var $foo;

function setVar($var, $value) {

$this->$var = $value;
return $this->$var;

}

function callSetVar($var, $value) {

$this->setVar($var, $value);

}

function getVar($var) {

return $this->$var;

}

}

echo Test::setVar('foo', 'value'); // all right

echo Test::callSetVar('foo', 'value'); // Fatal error: Call to a member function on a non-object in... on line 16

echo Test::getVar('foo'); // Notice: Undefined variable: this in... on line 22


?>


Кто мне объяснит как это все работает??? return $this->$var; в ф-ции setVar() прокатывает на ура (хотя и не должен), а в ф-ции getVar уже "работает" (выдает как и должен ошибку) как надо...
Maus:
Кто мне объяснит как это все работает?
Думаю, разработчики PHP
Rumata:
в свое время я тоже спотыкался на этом месте.
представление ООП у разработчиков РНР очень своеобразное

вот вам минимальный рабочий код.

<?

class Test
{
function setVar($var, $value)
{
$this->$var = $value;
return $this->$var;
}
}

echo Test::setVar('Queen', 'Freddy Mercury'); // all right

?>

Дмитрий Котеров:
Забавно... Куда же пишется значение, если $this не определена?
Mich:
вот вам минимальный рабочий код.
Забавно... Куда же пишется значение, если $this не определена?
Я сначал думал, что PHP не выдает предупреждения, т.к. он разрешает использовать в классах неопреденные переменные. Но то, что return $this->$var; в ф-ции setVar работает, а в getVar не работает - вот это уже действительно забавно.
Mich:
Забавно... Куда же пишется значение, если $this не определена?
Ответ на ваш вопрос:


<?php

class Test {

function setVar($var, $value) {

var_dump($this); // Notice: Undefined variable: this in... on line 7... NULL

$this->$var = $value;
var_dump($this); // object(stdClass)(1) { ["var"]=> string(5) "value" } value

return $this->$var;

}

}

echo Test::setVar('var', 'value'); // all right

?>


Буду благодарен за комментарий.
Дмитрий Котеров:
Блин, ну что все друг другу голову морочат...

<?
$obj->a = 10;
echo $obj->a;
?>

Это весь скрипт, 4 строчки.

Понятно теперь, куда что пишется?
Mich:
Это я понял еще по своему примеру: object(stdClass). Только как это работает и почему это работает я так и не понял.
Дмитрий Котеров:
А что тут непонятного-то? Объект, как и массив, создается при присвоении любого значения его свойству:

$a['a'] = 20;
var_dump($a);
$b->b = 40;
var_dump($b);

Mich:
Спасибо, я уже начал рыть в сторону object(stdClass), думал это его тараканы. Это работает на ура (хотя обратиться к массиву через -> нельзя :( ):

<?php

class Test {

var $var;

}

$test = new Test();

$test->var = 'value of obj';

var_dump($test); // object(test)(1) { ["var"]=> string(5) "value" }

$test = (array)$test;

var_dump($test); // array(1) { ["var"]=> string(12) "value of obj" }

$test = (object)$test;

var_dump($test); // object(stdClass)(1) { ["var"]=> string(12) "value of obj" }

?>

Эта тема на forum.dklab.ru