Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка при объявлении члена класса
 
 автор: Старший товарищ   (16.01.2011 в 22:27)   письмо автору
 
 

Приветствую всех участников форума.
Начал практиковать ООП и столкнулся с одной ошибкой.

Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in ... on line 5

<?
class mysql_base
{
public $connect;
$connect = mysql_connect('localhost', 'root', 'pas');
}

Вопрос: можно ли без использования метода получить в обьекте свойство connect ?

  Ответить  
 
 автор: neadekvat   (16.01.2011 в 22:37)   письмо автору
 
   для: Старший товарищ   (16.01.2011 в 22:27)
 

<?php
$obj 
= new mysql_base;
$obj->connect mysql_connect('localhost''root''pas');

Обошлись без метода.

Может, вам нужно это?
<?php
class mysql_base
{
    public 
$connect
    
    public function 
__construct($server$login$password)
    {
        
$this->connect mysql_connect($server$login$password);
    }
}

$obj = new mysql_base('localhost''root''pas'); 
var_dump($obj->connect); // Ресурс либо false, если подключение не удалось.

  Ответить  
 
 автор: Starshii Tovarish   (19.01.2011 в 20:44)   письмо автору
 
   для: neadekvat   (16.01.2011 в 22:37)
 

Да это то что нужно. Только непонятно почему объявить член класса с каким либо значением можно в теле самого класса, а результат какой-либо функции необходимо присваивать через конструктор.

  Ответить  
 
 автор: neadekvat   (19.01.2011 в 21:12)   письмо автору
 
   для: Starshii Tovarish   (19.01.2011 в 20:44)
 

Не совсем верное утверждение.
Члены класса объявляются вне методов для того, чтобы быть доступными из любой точки класса (созданная в методе переменная будет являться локальной относительно этого конкретного метода, и обратится к ней будет трудновато).
А оперировать с членами класса можно из любого метода.. Тот же класс, что я представил выше, можно переписать иначе - создать не конструктор, а обычный метод. Просто потом придется объявить новый объект класса и отдельно вызвать новый метод.
Удобнее в данном случаи работать с конструктором.

  Ответить  
 
 автор: Starshii Tovarish   (22.01.2011 в 14:43)   письмо автору
 
   для: neadekvat   (19.01.2011 в 21:12)
 

Благодарю за ответ но понимания всё равно нет.

>(созданная в методе переменная будет являться локальной относительно этого конкретного метода, и обратится к ней будет трудновато).
>А оперировать с членами класса можно из любого метода.

Имелось ввиду что оперировать с переменными внутри класса созданными в методе можно но это будет сложновато ? :)

Короче говоря в ООП так делать нельзя:

class db_base
{
public $db_connect = mysql_connect("localhost", "root", "");
public $memory_current = memory_get_usage();
}

  Ответить  
 
 автор: neadekvat   (22.01.2011 в 14:54)   письмо автору
 
   для: Starshii Tovarish   (22.01.2011 в 14:43)
 

Как вы показали - нельзя.

Я имел в виду, что если некое свойство должно быть в нескольких методах, то его лучше сделать членом класса.

Вот смотрите (ситуация надумана и не дай бог вообще так в реальном проекте делать):
<?php
class some()
{
    public function 
__construct()
    {
        
$name 'Вася';
        
$this->echo_name($name);
    }

    protected function 
echo_name($name)
    {
        echo 
$name;
    }
}

class 
some()
{
    protected 
$name null;
    
    public function 
__construct()
    {
        
$this->name 'Вася';
        
$this->echo_name();
    }

    protected function 
echo_name()
    {
        echo 
$this->name;
    }
}

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

  Ответить  
 
 автор: Trianon   (22.01.2011 в 14:57)   письмо автору
 
   для: Starshii Tovarish   (22.01.2011 в 14:43)
 

>Имелось ввиду что оперировать с переменными внутри класса созданными в методе можно но это будет сложновато ? :)


Переменные не бывают внутри класса.
Внутри класса бываютт члены.
Переменные бывают внутри функции (как частный случай - внутри метода)

>Короче говоря в ООП так делать нельзя:

в каком ООП?

>class db_base
>{
>public $db_connect = mysql_connect("localhost", "root", "");
>public $memory_current = memory_get_usage();
>}

в контексте какого из методов должен выполниться этот код?

  Ответить  
 
 автор: The Electronic Cat   (22.01.2011 в 19:14)   письмо автору
 
   для: Trianon   (22.01.2011 в 14:57)
 

Примерно то, о чем говорит товарищ, в некоторых реализациях ООП возможно. В js, например.

Но там, к сожалению, нет классов. О которых говорит товарищ... Да и метод на самом деле есть, только неявный.

Это я так, треплюсь размышляю )

  Ответить  
 
 автор: Старший товарищ   (01.02.2011 в 23:33)   письмо автору
 
   для: Trianon   (22.01.2011 в 14:57)
 

Вопрос стоял что как можно получить член с результатом выполнения какой-либо функции не используя ни методов, ни конструкторов и даже не аксессоров в классе.

Повторю пример:
class cls
{
public $i;
$i = 0;
}

Для таких тривиальных вещей можно использовать статические члены:
class cls
{
static private $one = 1;
static private $two = 2;
}

Но как с этими данными оперировать в дальнейшем, если нужно например сложить self::$one и self::$two и записать значение куда нибудь ?

Вторую книгу читаю, не слова об этом !

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования