Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 14
1

Чем отличается объект класса от экземпляра класса

15.06.2017, 19:44. Показов 3349. Ответов 10

Читаю книгу "PHP Объекты, шаблоны и методики программирования" автор Мэт Зандстра. Перевод на русском.
Там есть абзац про статические свойства класса.

А зачем вообще нужны статические методы или свойства? Статические элементы имеют ряд полезных характеристик. Во-первых, они доступны из любой точки сценария (при условии, что у вас есть доступ к классу). Это означает, что вы можете вызывать функции, не передавая экземпляр класса от одного объекта другому или, что еще хуже, сохраняя экземпляр объекта в глобальной переменной. Во-вторых, статическое свойство доступно каждому экземпляру объекта этого класса. Поэтому можно определить значения, которые должны быть доступны всем объектам данного типа. И наконец, в-третьих, сам факт, что не нужно иметь экземпляр класса для доступа к его статическому свойству или методу, позволит избежать создания экземпляров объектов исключительно ради вызова простой функции.

Следуя логике перевода или автора, не знаю точно), то во 2 пункте(во-вторых) выходит так:

PHP
1
2
3
4
5
6
7
8
9
10
class A
{
     static public $var=5;
}
 
$obj = new A;
echo $obj->var;
 
Хотя статическое свойство вызывается A::$var
Ясно, что статические свойства принадлежат классу и не доступны объекту.
Что имеет ввиду автор или это трудности перевода?
В книге такие моменты часто встречаются и без пониманию этого, сложно книгу понять.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2017, 19:44
Ответы с готовыми решениями:

Создание экземпляра класса, имя класса находиться в строковой переменной
Подскажите люди добрые, как можно выйти из такой ситуации, вот допустим имеются классы class new1{...

Свойству класса присвоить объект другого класса
Добрый день форумчане. Подскажите, пожалуйста. Свойствам класса можно при описании присваивать...

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

Нужны ли скобки () при создании экземпляра класса через new
Подскажите как правильно писать (как в первом варианте или как во втором) и чем они отличаются? 1)...

10
Эксперт PHP
3630 / 3035 / 1273
Регистрация: 01.08.2012
Сообщений: 10,388
15.06.2017, 19:50 2
Чем отличается объект класса от экземпляра класса
Ничем.
Цитата Сообщение от foxit007 Посмотреть сообщение
Что имеет ввиду автор или это трудности перевода?
Что имеет ввиду автор - понимаю, а что пытаетесь донести вы - пока не понял.
0
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 14
15.06.2017, 20:15  [ТС] 3
$obj это объект класса A. Как у объекта класса может быть доступны статические свойства?
0
Эксперт PHP
3630 / 3035 / 1273
Регистрация: 01.08.2012
Сообщений: 10,388
15.06.2017, 20:25 4
Цитата Сообщение от foxit007 Посмотреть сообщение
Ясно, что статические свойства принадлежат классу и не доступны объекту
А, не обратил на это внимания.

Статические свойства доступны любому объекту (экземпляру) этого класса. Могут быть получены через self:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
class Test
{
    private static $var = 5;
    
    public function show()
    {
        echo self::$var;
    }
}
 
$test = new Test();
$test->show();
0
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 14
15.06.2017, 20:38  [ТС] 5
Да, это знаю. А как это предложение понимать: "Во-вторых, статическое свойство доступно каждому экземпляру объекта этого класса" ?
0
Эксперт PHP
3630 / 3035 / 1273
Регистрация: 01.08.2012
Сообщений: 10,388
15.06.2017, 20:44 6
foxit007, так и понимать. Статическое свойство $var доступно каждому экземпляру класса Test.
0
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 14
15.06.2017, 20:47  [ТС] 7
В твоем примере выше ты получаешь доступ к статическому свойству через метод. А что значит экземпляр класса?
0
459 / 367 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
15.06.2017, 21:16 8
В примере выше объект $test есть экземпляр класса Test.
Как только ты создаешь объект через new, то ты создаешь экземпляр класса.
вроде так
0
502 bad gateway
Эксперт PHP
4608 / 3748 / 1565
Регистрация: 24.04.2014
Сообщений: 10,984
15.06.2017, 21:41 9
Лучший ответ Сообщение было отмечено foxit007 как решение

Решение

Цитата Сообщение от foxit007 Посмотреть сообщение
$obj это объект класса A. Как у объекта класса может быть доступны статические свойства?
Публичные статические свойства/методы глобальны. Следовательно к ним везде можно получить доступ
PHP
1
2
3
4
5
6
7
class A
{
     static public $var=5;
     public static function foo() { return 4; }
}
 
var_dump(A::$var, A::foo());
Можем обратиться к статическим свойствам/методам через объект
PHP
1
2
$obj = new A();
var_dump($obj::$var, obj::foo());
Но с оператором -> можно вызвать статический метод, но нельзя обратиться к статическому свойству
PHP
1
2
var_dump($obj->foo());
var_dump($obj->var); // NULL + warning
Можно создать второй экземпляр класса A.
PHP
1
$obj2 = new A();
Статическое свойство $var будет общим для этих объектов. Следовательно изменив его через 1 объект можно увидеть изменения через второй
PHP
1
2
$obj::$var = 10;
var_dump($obj2::$var, A::$var);
1
1939 / 1763 / 825
Регистрация: 23.01.2014
Сообщений: 6,210
15.06.2017, 22:01 10
Цитата Сообщение от foxit007 Посмотреть сообщение
Чем отличается объект класса от экземпляра класса
Как указали Выше, в русском языке - это одно и то же.
Цитата Сообщение от foxit007 Посмотреть сообщение
... не передавая экземпляр класса от одного объекта другому ...
Я бы отнес это к неточности перевода и только. Так не говорят.

Из определения Объекта в программировании на русской википедии:
Цитата Сообщение от wikipedia
Термины «экземпляр класса» и «объект» взаимозаменяемы.
https://ru.wikipedia.org/wiki/... ммирование)
0
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 14
15.06.2017, 22:26  [ТС] 11
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Можем обратиться к статическим свойствам/методам через объект

$obj = new A();
var_dump($obj::$var, obj::foo());
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Можно создать второй экземпляр класса A.

$obj2 = new A();
Статическое свойство $var будет общим для этих объектов. Следовательно изменив его через 1 объект можно увидеть изменения через второй

$obj::$var = 10;
var_dump($obj2::$var, A::$var);

Я теперь понял предложение "Во-вторых, статическое свойство доступно каждому экземпляру объекта этого класса. Поэтому можно определить значения, которые должны быть доступны всем объектам данного типа." Выходит если я изменю статическое свойство класса, то оно измениться во всех объектах класса, при вызове этого свойства объектом. Вот почему статические свойства принадлежат классу. А про вызов $obj::$var я не знал. Думал только можно вызывать A::$var. Даже в php.net про такой вызов не написано. Вот где было недопонимание. Спасибо, ты хорошо разъяснил.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2017, 22:26

Объект класса
Содержимое файла test.php: <?php namespace Test; class BlogManager { public function...

Возвращать объект класса
Здравствуйте, форумчане! Первый раз реализовываю такую структуру, требуется Ваша помощь :) ...

Получить объект класса по имени
Получается какая проблема, работаю с loader, который подключает файлы и объявляет классы. К...

Объект класса с подключением PDO
Есть класс для подключения с БД (используется PDO). В этом же классе есть основные ф-ии для работы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru