[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ООП внутриклассовая переменная this
kent666
Помогите разобраться с классом
<?php

class
My_first_class
{

var $hello = array(
'Привет',
'Салют',
'Хай',
'Улыбнись',
'Рады видеть тебя'
);



function __construct($name)
{
$this->name = $name;
}


function helloUser()
{
return $this->hello[$this->random($this->hello)] .', '. $this->name .'!';
}


function random($arr)
{
return rand(0, count($arr) - 1);
}
}



$name = 'Денис';

$obj = new My_first_class($name);

echo $obj -> helloUser(), '<br>';

Почему мы обращаемся к переменной $hello как $this->hello
К переменной $name было явно прописано в конструкторе
$this->name = $name;



Спустя 10 минут, 39 секунд (4.05.2011 - 11:22) pyha_coder написал(а):
Цитата (kent666 @ 4.05.2011 - 08:11)
Почему мы обращаемся к переменной $hello как $this->hello
К переменной $name было явно прописано в конструкторе
$this->name = $name;

Потому что $this->hello это есть Var $hello, $this это ссылка на My_first_class. My_first_class->hello

Спустя 3 минуты, 35 секунд (4.05.2011 - 11:25) kent666 написал(а):
А если бы переменная была бы в функции класса, то выглядело бы так:
$this->функция->переменная

Спустя 6 минут (4.05.2011 - 11:31) pyha_coder написал(а):

class test {

public function setName($name){

$myname = $name;

}

}


$class = new test();
$class->setName('Вася');


вот так. Но и область переменной $myname только в функции setName().

Спустя 2 минуты, 44 секунды (4.05.2011 - 11:34) sharki написал(а):
kent666
Цитата
А если бы переменная была бы в функции класса, то выглядело бы так:
$this->функция->переменная


Не всегда, если функция возвращает объект самого себя, тогда возможна такая конструкция.

$this служит для обращения к методам и полям класса в которым мы работаем. И наследуемых классах, у которых модификатор доступа protected или public, но не private/

Спустя 21 минута, 59 секунд (4.05.2011 - 11:56) linker написал(а):
$this - это ссылка внутри объекта на самого себя. Чтобы объект мог обратиться к своим полям и методам используется эта ссылка $this. Почему так, пример:
class MyClass
{
public $name;

public function setName($name)
{
$this->name = $name;
}
}
как мы видим, в классе определено поле $name, есть метод setName(), который принимает параметр $name. Как PHP понять, что нужно этот параметр присвоить соответствующему полю объекта, ведь имена у них одинаковые - $name и $name и конструкция $name = $name; выглядит абсурдной? Чтобы PHP понял, что мы присваиваем значение параметра $name соответствующему полю $name объекта, необходимо указывать $this:
$this->name = $name;
т.е. $this - "я объект", -> - принимаю значение для своего поля - $name из параметра $name.

Спустя 10 часов, 34 минуты, 36 секунд (4.05.2011 - 22:31) kent666 написал(а):
Что то я еще больше запутался.
т.е.
$this->name равнозначно что класс имеет свой элемент по имени name

Но тогда как понять

<?php

class
My_first_class
{

static $hello = array(
'Привет',
'Салют',
'Хай',
'Улыбнись',
'Рады видеть тебя'
);

static function helloUser()
{
return self::$hello[self::random()];
}

static function random()
{
return rand(0, count(self::$hello) - 1);
}
}



$name = 'Денис';

$hello = My_first_class::helloUser();

echo $hello .', '. $name .'!';

чем отличается self от $this
и если у нас есть функция внутри класса почему ее вызов в другой функции происходит через $this->функция.
<?php

class
My_first_class
{

var $hello = array(
'Привет',
'Салют',
'Хай',
'Улыбнись',
'Рады видеть тебя'
);



function __construct($name)
{
$this->name = $name;
}



function helloUser()
{
return $this->hello[$this->random($this->hello)] .', '. $this->name .'!';
}


function random($arr)
{
return rand(0, count($arr) - 1);
}
}



$name = 'Денис';

$obj = new My_first_class($name);

echo $obj -> helloUser(), '<br>';

Спустя 24 минуты, 16 секунд (4.05.2011 - 22:55) linker написал(а):
Есть две сущности: класс и экземпляр класса(объект). self - указывает на класс, а $this - на объект. Статические поля в отличии от простых полей принадлежат классу, а не объекту. Человек - это класс, его статические поля - это общие характеристики описывающие вид человека дабы его можно было определить в массе других классов, т.е. такие поля отличают его например от земноводных. Личность - это экземпляр класса человек, имеющий поля, которые его выделяют в массе других экземпляров класса человек: форма головы, форма ушей, форма носа, характер, тембр голоса и т.д. Так вот, когда я рассматриваю класс человек, то к его полям (характеристикам) я обращаюсь через self, когда я рассматриваю отдельную личность (экземпляр класса человек), то к его полям я обращаюсь через $this. Например, мой рост 192 см, или на php -
$this->height = 192;
когда я говорю о себе как о классе человек, то говорю например, я хожу на двух ногах
self::$legs = 2;

Спустя 18 часов, 53 минуты, 58 секунд (5.05.2011 - 17:49) kent666 написал(а):
Блин все равно я в ступоре!!!
Не могу понять данную конструкцию
    class My_first_class  
{
var $gas=12;
function __construct($gas)
{
$this->gas=$gas;
}

function Gasok()
{
echo $this->gas;
}

}

Это получается если в класс не передается из вне переменная $gas то она будет равна 12 или будет такой какую мы передадим!???
Пробовал делать так,

$gas=1000000;
$object=new My_first_class($gas);
$object->Gasok();

то выводится 1000000,
Делаю так

$object=new My_first_class();
$object->Gasok();

выдает ошибку что не определен аргумент класса!!!
В чем смысл тогда в классе ставить переменную var $gas=12 если мы ее никогда не сможем использовать
Сам класс взял из книги (т.е. он должен быть рабочим)
:unsure:

Спустя 7 минут, 53 секунды (5.05.2011 - 17:57) Zerstoren написал(а):
Если аргумент в функции не обязателен, то он выводится вот так function __construct($gas=12)

Нужно ж задать дефолтное значения для переменной.

    class My_first_class  
{
// Объявление переменных просто хороший тон.
// Но их нужно будет создавать $this->benzin98 = FALSE;
// Главное не забывайте, что рано или поздно - но ваши исходники будут читать, по этому соблюдайте хорошие манеры.

var $gas;
function __construct($gas=12)
{
$this->gas=$gas;
}

function Gasok()
{
echo $this->gas;
}

}

Спустя 2 часа, 11 минут, 8 секунд (5.05.2011 - 20:08) kent666 написал(а):
Да все работает. Спасибо. Наверное книжка старая РНР5)))

Спустя 38 минут, 36 секунд (5.05.2011 - 20:47) Zerstoren написал(а):
Цитата (kent666 @ 5.05.2011 - 17:08)
Да все работает. Спасибо. Наверное книжка старая РНР5)))

Как мне помнится, это еще использовалось в пхп 4.

Может Вы или автор упустили это.

Спустя 11 часов, 27 минут, 35 секунд (6.05.2011 - 08:14) linker написал(а):
Напиши просто
class My_first_class  
{
public $gas = 12;

public function __construct($gas = null)
{
if (!is_null($gas))
$this->gas = $gas;
}

function Gasok()
{
echo $this->gas;
}
}
или как написал Zerstoren, а твоя книжка реально очень старая. Когда написано вот так
public function __construct($gas)
то ты просто обязан передать в конструктор параметр, т.е. так
$object=new My_first_class(3343);
, если ты напишешь так
$object=new My_first_class();
то PHP будет ругаться, что ты не передал обязательный параметр $gas в конструктор. Чтобы этого избежать, необходимо для параметра задать значение по умолчанию, т.е. так
public function __construct($gas = null)
только в этом случае в конструктор можно ничего не отдавать.

Спустя 2 часа, 15 минут, 12 секунд (6.05.2011 - 10:29) kent666 написал(а):
Опять наткнулся :rolleyes: Теперь уже в курсах Ирбис
<?php

/**
* IRB_Cache_Img - Class of preservation of foreign files
* NOTE: Requires PHP version 5 or later and GD version 2.0.1 or later
*
@package irb_cache_img
*
@author IT studio IRBIS-team
*
@copyright © 2009 IRBIS-team
*
@version 0.1
*
@license http://www.opensource.org/licenses/rpl1.5.txt
*/

class IRB_Cache_Img
{

private $url = '';
private $cache = '';
private $time = 0;
private $flag = true;

/*
* Constructor
* @param string
* @param string
* @param integr
*/

public function __construct($url, $cache = 'cache/', $time = 24)
{
$this->url = $url;
$this->cache = $cache;
$this->time = date('U') - $time * 3600;
}
Зачем было описывать private $url = ''; ???
Переменная указана в конструкторе. Значит мы обязаны передать ее в класс!!!
и надо было ее описывать в классе как private $url; , но не private $url = '';

Спустя 7 минут, 7 секунд (6.05.2011 - 10:36) linker написал(а):
Это не имеет никакого принципиального значения.

Спустя 2 минуты, 5 секунд (6.05.2011 - 10:39) twin написал(а):
Не вредно это. Можно просто объявить переменную, можно сразу инициализировать.
И еще раз - $url и $this->url, это совершенно разные переменные.

Спустя 46 минут, 18 секунд (6.05.2011 - 11:25) kent666 написал(а):
Да оно может и так, просто немного запутывает!

Спустя 8 минут, 13 секунд (6.05.2011 - 11:33) kent666 написал(а):
Тогда почему в методе helloUser мы обращаемся к переменной $hello как $this->hello
class My_first_class  
{

var $hello = array(
'Привет',
'Салют',
'Хай',
'Улыбнись',
'Рады видеть тебя'
);



function __construct($name)
{
$this->name = $name;
}



function helloUser()
{
return $this->hello[$this->random($this->hello)] .', '. $this->name .'!';
}
Если переменная $this->hello не является переменной var $hello которую мы определили в начале класса???
Цитата


twin  Дата 6.05.2011 - 07:39
  Не вредно это. Можно просто объявить переменную, можно сразу инициализировать.
И еще раз - $url и $this->url, это совершенно разные переменные.

Спустя 7 минут, 37 секунд (6.05.2011 - 11:41) linker написал(а):
class IRB_Cache_Img 
{

private $url = '';
...

public function __construct($url, $cache = 'cache/', $time = 24)
{
$this->url = $url;
...

}
private $url = ''; - это одна переменная(поле), которая принадлежит объекту
__construct($url - это другая переменная, обычная переменная
К первой мы обращаемся $this->url, а ко второй как обычно $url. Первая есть поле класса, вторая есть обычная переменная.

$this->hello является описанным полем var $hello, поэтому оно одно и тоже.

Спустя 12 минут, 19 секунд (6.05.2011 - 11:53) kent666 написал(а):
ну в принципе я понял что все переменные которые были обозначены внутри класса как
private $url = ''; и т.д. К ним внутри методов можно обращаться как this->url
а переменные которые попадают в конструктор из вне

 public function __construct($url, $cache = 'cache/', $time = 24) 
{
$this->url = $url;
должны быть определены как $this->url = $url; и тогда в классе появиться переменная $this->url

Спустя 27 минут, 1 секунда (6.05.2011 - 12:20) twin написал(а):
Можно и сразу задать значение, не в конструкторе.

class IRB_Cache_Img 
{

public $url;

public function __construct($url)
{
$this->url = $url;
}

public function display()
{
echo $this->url;
}
}


$obj = new IRB_Cache_Img('http');
$obj -> display();
echo '<br>';
// Новое значение
$obj -> url = 'ftp';
$obj -> display();



Спустя 34 минуты, 43 секунды (6.05.2011 - 12:55) linker написал(а):
Цитата
должны быть определены как $this->url = $url; и тогда в классе появиться переменная $this->url

Она уже есть в классе, а потом в объекте, таким образом просто присваивается ей значение.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.