Помогите Класс Php

Discussion in 'PHP' started by SSB1981, 1 Mar 2008.

  1. SSB1981

    SSB1981 Elder - Старейшина

    Joined:
    7 Jan 2008
    Messages:
    108
    Likes Received:
    9
    Reputations:
    0
    Здравствуйте реши написать класс авторизации для сайта.
    для начала решил вспомнить классы.

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

    PHP:

    <?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.
     
  2. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    инициализировать переменные в теле класса можно только функциях, и конструктор тоже обязателен, и обявлять пременные тоже надо

    PHP:
    <?php

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

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

    >>для начала решил вспомнить классы.
    может стоит не вспоминать а поучить?
     
    #2 nc.STRIEM, 1 Mar 2008
    Last edited: 1 Mar 2008
  3. SSB1981

    SSB1981 Elder - Старейшина

    Joined:
    7 Jan 2008
    Messages:
    108
    Likes Received:
    9
    Reputations:
    0
    Погоди! Я открыл учебник вот код:

    <?php

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

    Тоже самое!
    ?>
     
  4. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    PHP:
    //class
    function test()
    {
        return 
    $this->v='works';

    //class
    ...

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

    bul.666 булка

    Joined:
    6 Jun 2006
    Messages:
    719
    Likes Received:
    425
    Reputations:
    140
    PHP:
    <?php 

    class test

        var 
    $v 'HELLO'


    $t=new test(); 
    echo 
    $t->v
    ?>
    2Piflit у тебя название класса и функции совпадает, для отладки - очень вредно =)
     
    #5 bul.666, 1 Mar 2008
    Last edited: 1 Mar 2008
    1 person likes this.
  6. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    это у них совпадает. я написал о другом.
     
  7. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    376
    Reputations:
    460
     
  8. bul.666

    bul.666 булка

    Joined:
    6 Jun 2006
    Messages:
    719
    Likes Received:
    425
    Reputations:
    140
    Я к человеческому фактору...
    В таком примере да, но при большем объеме кода совпадения в именах классов и функций доставят массу хлопот...
     
  9. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    376
    Reputations:
    460
    Ну может быть... это было в 4 ветке, а в пятой это уже не так важно (http://www.php.net/manual/ru/language.oop5.php)...:)
     
  10. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    мож я чет не допонимаю о чем ваше речь, но всеже, когданибудть слышал про конструктор?
     
    1 person likes this.
  11. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    у меня в детстве был Lego. ога

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

    Евгений Минаев Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    55
    Likes Received:
    169
    Reputations:
    159
    Кто ответит на вопрос без использования php получит респект от всех кто откроет тему, надеюсь на вашу честность, порой полезно себя проверить - "Что выведется в итоге?"

    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->_;

    ?>
     
  13. bul.666

    bul.666 булка

    Joined:
    6 Jun 2006
    Messages:
    719
    Likes Received:
    425
    Reputations:
    140
    foo:foo

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

    foofoo:foo
     
  14. SSB1981

    SSB1981 Elder - Старейшина

    Joined:
    7 Jan 2008
    Messages:
    108
    Likes Received:
    9
    Reputations:
    0
    Всем спаибо! Разобрался!
    Оказывается нужно добовлять "public" пред именем пременной!
     
  15. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Выведедся соообщение о доступе к закрытому свойству класса, а именно - $__s->_
     
    4 people like this.
  16. Евгений Минаев

    Евгений Минаев Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    55
    Likes Received:
    169
    Reputations:
    159
    Helios прав, выведется только fatal error тк обращаться к private переменным нельзя вне класса, а $__z->_ будет пуст
     
    #16 Евгений Минаев, 1 Mar 2008
    Last edited: 1 Mar 2008
    1 person likes this.
  17. Macro

    Macro Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Ссылка в тему...
    http://ru2.php.net/manual/ru/language.oop5.visibility.php
    Читал-читал и ничего не понял :) С ООП я не дружу
     
  18. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Тут больше интересен не доступ к закрытым полям класса, а неудавшийся Паблик Морозов: в одном объекте $__z образуется две переменные с одним именем, но с разными уровнями доступа касательно "подобъектов", чтоли.
    Вот по человечески:

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

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

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

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

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

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

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