PDA

Просмотр полной версии : Помогите Класс Php


SSB1981
01.03.2008, 14:26
Здравствуйте реши написать класс авторизации для сайта.
для начала решил вспомнить классы.

Вот элементарный класс:



<?php

class test
{
$this->v='works';
}

$t=new test();
echo $t->v;
?>



На экране отображается следующее:
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in Z:\home\ssb1981.ru\www\Test\class.php on line 5

Стоит Denwer 3.

nc.STRIEM
01.03.2008, 14:31
инициализировать переменные в теле класса можно только функциях, и конструктор тоже обязателен, и обявлять пременные тоже надо


<?php

class test
{
var $v;
function test()
{
$this->v='works';
}
}

$t=new test();
echo $t->v;
?>



>>для начала решил вспомнить классы.
может стоит не вспоминать а поучить?

SSB1981
01.03.2008, 14:40
Погоди! Я открыл учебник вот код:

<?php

class Car
{
$gas=0;
function addGas($ammount)
{
$this->gas=$this->gas + $ammount;
echo "Â áàê çàëèòî $ammount ëèòðîâ áåíçèíà";
}
}

Тоже самое!
?>

Piflit
01.03.2008, 15:19
//class
function test()
{
return $this->v='works';
}
//class
...

$t=new test();
echo $t->test();
так правильнее?

bul.666
01.03.2008, 15:32
<?php

class test
{
var $v = 'HELLO';
}

$t=new test();
echo $t->v;
?>


2Piflit у тебя название класса и функции совпадает, для отладки - очень вредно =)

Piflit
01.03.2008, 15:43
2Piflit у тебя название класса и функции совпадает, для отладки - очень вредно =)
это у них совпадает. я написал о другом.

DIAgen
01.03.2008, 15:56
[php]
2Piflit у тебя название класса и функции совпадает, для отладки - очень вредно =)
А чего вредно то?:) Посмотри ответ nc.STRIEM так и должно выглядеть...

bul.666
01.03.2008, 15:59
Я к человеческому фактору...
В таком примере да, но при большем объеме кода совпадения в именах классов и функций доставят массу хлопот...

DIAgen
01.03.2008, 16:12
Я к человеческому фактору...
В таком примере да, но при большем объеме кода совпадения в именах классов и функций доставят массу хлопот...
Ну может быть... это было в 4 ветке, а в пятой это уже не так важно (http://www.php.net/manual/ru/language.oop5.php)...:)

nc.STRIEM
01.03.2008, 16:32
Я к человеческому фактору...
В таком примере да, но при большем объеме кода совпадения в именах классов и функций доставят массу хлопот...
мож я чет не допонимаю о чем ваше речь, но всеже, когданибудть слышал про конструктор?

Piflit
01.03.2008, 16:37
когданибудть слышал про конструктор?
у меня в детстве был Lego. ога

это зависит от того, надо ему автоматом задавать значения атрибутов сразу при создании объекта или нет.

Евгений Минаев
01.03.2008, 16:37
Кто ответит на вопрос без использования php получит респект от всех кто откроет тему, надеюсь на вашу честность, порой полезно себя проверить - "Что выведется в итоге?"


<?php

class firstClass
{
private $_;

function setValue ( $value ) {
$this->_ = $value;
}

}

class secondClass extends firstClass
{
public $_;
}

$__s = new firstClass();
$__z = new secondClass();

echo $__s->setValue( 'foo' );
echo $__z->setValue( 'foo' );

echo $__z->_ . ':' . $__s->_;

?>

bul.666
01.03.2008, 16:45
foo:foo

Хотя наверное

foofoo:foo

SSB1981
01.03.2008, 16:47
Всем спаибо! Разобрался!
Оказывается нужно добовлять "public" пред именем пременной!

Helios
01.03.2008, 16:52
Выведедся соообщение о доступе к закрытому свойству класса, а именно - $__s->_

Евгений Минаев
01.03.2008, 16:55
Helios прав, выведется только fatal error тк обращаться к private переменным нельзя вне класса, а $__z->_ будет пуст

Macro
01.03.2008, 16:57
Ссылка в тему...
http://ru2.php.net/manual/ru/language.oop5.visibility.php
Читал-читал и ничего не понял :) С ООП я не дружу

Helios
01.03.2008, 17:16
Тут больше интересен не доступ к закрытым полям класса, а неудавшийся Паблик Морозов: в одном объекте $__z образуется две переменные с одним именем, но с разными уровнями доступа касательно "подобъектов", чтоли.
Вот по человечески:

Класс firstClass содержит переменную $_ с флагом private, т.е. доступ к ней имеют только методы данного класса и не более.

Класс secondClass тоже содержит переменную $_, но с флагом public. По идее, она должна редефайнить переменную в классе-родителе и наделять ее флагом public (классическое поведение Пабликов Морозовых).

Но не тут-то было.

Благодаря тому, что в firstClass использовался именно private, а не protected (private + доступ из классов-потомков), при инициализации secondClass происходит следующее:

1 инициализация firstClass, появляется private $_;
2 инициализация secondClass, который не имеет доступа к firstClass::_, потому делает себе вторую переменную public $_.

При этом функция setValue имеет влияние не над public secondClass::_, а над private firstClass::_;

Помнится подобная ситуация наблюдается в сях, только там дело касалось указателей на классы и лечилось методами с модификатором virtual