Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1

Классы требуется разъяснение

16.08.2016, 07:54. Показов 4341. Ответов 94

Студворк — интернет-сервис помощи студентам
Начал изучение классов и тут возникли вопросы, может кто подсказать и прояснить ситуацию?
1. Не могу понять зачем создавать дочерние классы, можно же обойтись одним родительским классом?
2. На примере:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class OtherClass extends MyClass {
   public static $my_static = 'статическая переменная';
 
   public static function doubleColon() {
      echo parent::CONST_VALUE . "\n";
      echo self::$my_static . "\n";
   }
}
 
OtherClass::doubleColon();
?>
Как я понял, после extends указывается родительский класс MyClass?
Слово parent указывает что константа будет вызвана из родительского класса, а self из дочернего класса?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2016, 07:54
Ответы с готовыми решениями:

Требуется разъяснение по типам данных
Курю книгу по Java и алгоритмам,и наткнулся на такую фразу которая поменяла моё отношение к программированию,изучаю сам программирование,и...

Требуется разъяснение по системам векторов
Пусть дано две системы векторов. Как определить, будет ли одна линейно выражаться чкрез другую? допустим размерность первой системы 3х3, а...

Требуется разъяснение понятий GPT и MBR применительно к SSD
Здравия желаю. пытаюсь установить windows 7 максимальная на SSD жесткий диск. понятие GPT и MBR для SSD бывает? просто UEFI надо ставить на...

94
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
25.08.2016, 11:00  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jodah Посмотреть сообщение
Конечно 1, поскольку
Ну а если добавить
PHP
1
2
3
4
5
function increment($a)
{
    $a++;
return $a;
}
Вообще не вижу смысла от это функции, это тоже самое что:
PHP
1
2
3
4
5
function increment($a)
{
    $a++;
    echo 'А это бесполезная функция, которая не чего не возвращает:)';
}
А во втором примере, я так и не понял при чем тут ссылки
Цитата Сообщение от Jodah Посмотреть сообщение
$obj = new Obj();
создаем объект $obj
Цитата Сообщение от Jodah Посмотреть сообщение
increment($obj);
Вызываем функцию, в качестве аргумента передаем созданный объект
Цитата Сообщение от Jodah Посмотреть сообщение
function increment($obj)
Принимаем объект в функции, делаем...
Цитата Сообщение от Jodah Посмотреть сообщение
$obj->id++;
обращаемся к переменной объекта класса и увеличиваем ее на 1
Цитата Сообщение от Jodah Посмотреть сообщение
echo $obj->id;
обращаемся к значению переменной объекта и выводим ее

Причем тут ссылки?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
25.08.2016, 11:05
Цитата Сообщение от Gcom Посмотреть сообщение
Вообще не вижу смысла от это функции
Речь не о том, какая от этой функции польза, а о принципах работы PHP.

Цитата Сообщение от Gcom Посмотреть сообщение
Причем тут ссылки?
Ну как же, $obj внутри функции - это ссылка на объект.

Если бы это был просто объект, увеличение $obj->id произошло бы только внутри функции, а вне её был бы старый объект с id = 1.

Но поскольку мы передали ссылку, увеличение на 1 произошло у оригинального объекта, а не копии.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
25.08.2016, 11:07  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Выведет 2. Знак & означает, что нужно не создать локальную копию переменной, а использовать оригинальную переменную (т.е. внутри функции $a - это не значение, а ссылка на переменную).
Я так и не чего не понял механизм ссылок, а что бы вывести 2, я бы сделал так:
PHP
1
2
3
4
5
6
7
8
9
function increment($a)
{
    $a++;
return $a;
}
 
$a = 1;
$a = increment($a);
echo $a;
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
25.08.2016, 11:08
Gcom, посмотрите ещё раз этот пример (возможно вы его пропустили? Я поздно добавил):
PHP
1
2
3
4
5
6
7
8
function increment(&$a)
{
    $a++;
}
 
$a = 1;
increment($a);
echo $a;
& означает, что нужно использовать не локальную копию переменной, а оригинальную переменную $a, т.е. ссылку на $a. И увеличение $a внутри функции приводит к её увеличению и вне функции.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
25.08.2016, 11:13  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Но поскольку мы передали ссылку, увеличение на 1 произошло у оригинального объекта, а не копии.
Откуда копия? там же
PHP
1
$obj = new Obj();
А вот если так
PHP
1
$obj1 = new Obj();
То $obj1 будет копией $obj или я и тут не так понимаю?

Добавлено через 1 минуту
Цитата Сообщение от Jodah Посмотреть сообщение
& означает, что нужно использовать не локальную копию переменной, а оригинальную переменную $a,
походу я не вижу разницы между локальной и оригинальной переменной, переменная либо есть, либо ее нету, как то так
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
25.08.2016, 11:21
Цитата Сообщение от Gcom Посмотреть сообщение
а что бы вывести 2, я бы сделал так:
Да это понятно. Ну хорошо, если вам более реальный пример нужен, давайте напишем функцию, которая рассчитывает стоимость товара в зависимости от закупочной цены.

Вариант 1. Без ссылок.
PHP
1
2
3
4
5
6
7
8
9
10
function calcPrice($price)
{
    if($price < 500)
        return $price * 2;
    else
        return $price * 1.5;
}
 
$price = 100;
$price = calcPrice($price);
Вариант 2. Со ссылками.
PHP
1
2
3
4
5
6
7
8
9
10
function calcPrice(&$price)
{
    if($price < 500)
        $price *= 2;
    else
        $price *= 1.5;
}
 
$price = 100;
calcPrice($price);
Добавлено через 1 минуту
Цитата Сообщение от Gcom Посмотреть сообщение
Откуда копия?
Всё верно, там нет никакой копии. Об этом я и говорю.

Добавлено через 3 минуты
Цитата Сообщение от Gcom Посмотреть сообщение
походу я не вижу разницы между локальной и оригинальной переменной, переменная либо есть, либо ее нету, как то так
Стоп, а вы понимаете, что такое область видимости? К примеру, почему этот код выдаст ошибку?
PHP
1
2
3
4
5
6
function generate()
{
    $a = 5;
}
generate();
echo $a;
Если нет, тогда вам сюда.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
25.08.2016, 11:48  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
К примеру, почему этот код выдаст ошибку?
Конечно вернет ошибку, в функцию не поступили аргументы, ну и она не чего не возвращает, ни каких значений, это первый момент, в второй, переменная $a не определена.

Что касается ссылок, на примерах вижу не большое сокращение кода
В частности это
PHP
1
$price = calcPrice($price);
поменялось на это
PHP
1
calcPrice($price);
хотя если потом с этой переменной еще делать какие либо манипуляции (перед тем же вводом) меня второй вариант как бы запутает, а так я вижу
PHP
1
$price = calcPrice($price);
Походу ссылки это не мое
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
25.08.2016, 12:04
Цитата Сообщение от Gcom Посмотреть сообщение
Конечно вернет ошибку, в функцию не поступили аргументы, ну и она не чего не возвращает, ни каких значений, это первый момент, в второй, переменная $a не определена.
Ну аргументы и отсутствие return - это не ошибка. Я имею ввиду, что PHP выдаст ошибку из-за того, что $a отсутствует в глобальной области видимости.

Цитата Сообщение от Gcom Посмотреть сообщение
хотя если потом с этой переменной еще делать какие либо манипуляции (перед тем же вводом) меня второй вариант как бы запутает
В данном случае путаницы особо не будет:
PHP
1
2
3
4
5
6
7
$price = 100;
calcPrice($price);
 
if($discount)
    $price -= $discount;
 
// ... и поехали дальше
В целом я с вами согласен, ссылки делают код менее интуитивно понятным. Но и использовать их далеко не всегда есть смысл. Часто их используют для рекурсий (запихнуть категорию внутри категории внутри другой категории), хотя я предпочитаю их вообще не использовать. Кроме объектов, конечно.
0
25.08.2016, 12:19  [ТС]

Не по теме:

Цитата Сообщение от Jodah Посмотреть сообщение
хотя я предпочитаю их вообще не использовать
походу тут мы солидарны ;)

0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.08.2016, 12:27
Как работают ссылки в PHP
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
25.08.2016, 12:56  [ТС]
PHP
1
$a = new Foo();
Если объяснять на пальцах, то объект класса Foo можно сравнить с курткой в гардеробе. Присваивание в строке кладет в переменную $a номерок от этой куртки, а не саму куртку.
Вон оно как оказалось то, неожиданно...

Добавлено через 6 минут
Итак, Ссылка на Ссылку объекта имеет право на существование, если Вы четко понимаете, что делаете.
Вот это вообще выше какого либо понимания...
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.08.2016, 13:04
Цитата Сообщение от Gcom Посмотреть сообщение
Вот это вообще выше какого либо понимания...
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function test($o) {
    var_dump($o);
    $o = new StdClass;
    $o->foo = 'bar';
    var_dump($o);
}
 
function test_link(&$o) {
    var_dump($o);
    $o = new StdClass;
    $o->foo = 'bar';
    var_dump($o);
}
 
$obj = new StdClass;
$obj->var = 'a';
 
var_dump($obj);
test($obj);
 
var_dump($obj);
 
test_link($obj);
var_dump($obj);
Попробуй ответить на вопрос почему каждый var_dump выводит именно такие данные
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
07.09.2016, 12:20  [ТС]
Чем дальше в лес - тем больше дров

Ну а мы продолжаем познание классов, появились очередные вопросы, есть код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class A
{
    function example()
    {
        echo 'Это первоначальная функция A::example().<hr>';
    }
}
 
class B
{
    function example()
    {
        echo 'Это первоначальная функция B::example().<hr>';
    }
 
    static function functionName1()
    {
        self::example();
    }
 
    function functionName2()
    {
        self::example();
    }
 
    function functionName3()
    {
        $this->example();
    }
}
 
class C extends B
{
    function example()
    {
        echo 'Это переопределенная функция C::example().<br>';
        parent::example(); # C::example();
    }
}
Используя эту оператор :: можно обращаться к константам, статическим или перегруженным свойствам или методам класса.
1. У нас есть class A я в нем не вижу того что перечислено выше, тогда почему A::example(); - работает?
2. В чем отличие этого:
PHP
1
2
$x = new C;
$x->example();
от этого?
PHP
1
C::example();
по факту делает одно и тоже.
3. Мне тут в одной теме дали пояснения:
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Если self::, то в объявлении метода нужен static, иначе self:: заменить на $this->. У вас в классе ни одного статического метода (кроме autoloadClass), а все вызовы статические - это очень плохо. К тому же есть два закрытых члена, которые нигде не используются.
Вызываем:
PHP
1
2
B::functionName1();
B::functionName2();
обе отработали, и это:
PHP
1
2
3
4
    static function functionName1()
    {
        self::example();
    }
и это:
PHP
1
2
3
4
    function functionName2()
    {
        self::example();
    }
что со static что без него, разницы не вижу.
4. А вот это:
PHP
1
B::functionName3();
Дает ошибку: Fatal error: Using $this when not in object context in $this->example(); - почему?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.09.2016, 13:39
Цитата Сообщение от Gcom Посмотреть сообщение
1. У нас есть class A я в нем не вижу того что перечислено выше, тогда почему A::example(); - работает?
Эта такая фича. С включенными ошибками должен быть варнинг. И работает потому что нет $this, как только он появляется то сразу
Цитата Сообщение от Gcom Посмотреть сообщение
Дает ошибку: Fatal error: Using $this when not in object context in $this->example();
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
07.09.2016, 13:51  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
С включенными ошибками должен быть варнинг.
ошибки включены:
PHP
1
2
ini_set('display_errors', 1);                    /** добавлять в отчет все PHP ошибки (режим отладки) */
ini_set('error_reporting', E_ALL);               /** добавлять в отчет все PHP ошибки */
но все равно работает A::example();
Цитата Сообщение от Jewbacabra Посмотреть сообщение
И работает потому что нет $this, как только он появляется то сразу
тут не совсем понял о чем речь, если можно пример, желательно на том который я написал выше (что бы понятней было)

Jewbacabra, А что скажите про п.2-4?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.09.2016, 13:54
Цитата Сообщение от Jewbacabra Посмотреть сообщение
С включенными ошибками должен быть варнинг.
А в PHP 7 Deprecated.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.09.2016, 18:06
Цитата Сообщение от Gcom Посмотреть сообщение
тут не совсем понял о чем речь
Так как статические методы вызываются без создания экземпляра класса, то псевдо-переменная $this не доступна внутри метода, объявленного статическим.
http://php.net/manual/ru/language.oop5.static.php

На офф сайте есть отличная документация http://php.net/manual/ru/oop5.intro.php
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
08.09.2016, 12:18  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
На офф сайте есть отличная документация http://php.net/manual/ru/oop5.intro.php
Начал читать, так сказать все с начала, заполнять пробелы, которые образовались при чтении разных источников про ООП в PHP.

Есть код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
function myprint($obj) { echo ('<pre>'); var_dump($obj); echo ('</pre><hr>'); }
 
class TestExample {}
 
$obj1 = new TestExample(); 
$obj2 = new TestExample();
$obj3 = clone $obj1;
 
myprint(new TestExample()); # object(TestExample)#4 (0) {}
myprint($obj1);             # object(TestExample)#1 (0) {}
myprint($obj2);             # object(TestExample)#2 (0) {}
myprint($obj3);             # object(TestExample)#3 (0) {}
В комментах результаты работы var_dump()
Собственно вопрос что значат эти цифры #1, #2, #3, #4?
И чем отличаются $obj1, $obj2, $obj3 между собой в данном примере?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.09.2016, 12:27
Цитата Сообщение от Gcom Посмотреть сообщение
Собственно вопрос что значат эти цифры #1, #2, #3, #4?
некий идентификатор объекта
Цитата Сообщение от Gcom Посмотреть сообщение
И чем отличаются $obj1, $obj2, $obj3 между собой в данном примере?
3 разных объекта класса TestExample
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
08.09.2016, 12:41  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
3 разных объекта класса TestExample
Что значит разных?
На примере:
PHP
1
2
3
$a = 1;
$b = 2;
$c = 3;
тут я понимаю что $a, $b, $c это разные переменные, а тут не понимаю Объясните плизз, если это возможно

Добавлено через 4 минуты
Цитата Сообщение от Jewbacabra Посмотреть сообщение
некий идентификатор объекта
А можно пример из реального мира (не абстрактный) что бы понять суть этих неких идентификаторов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2016, 12:41
Помогаю со студенческими работами здесь

Задача (разъяснение) в алгоритм (программа, используя базовый и производный классы, создавала массив объектов типа производного класса)
Задача на наследование классов, базовый класс - &quot;люди&quot;, производный - &quot;студенты&quot;...как я понял, а базовом надо создать символьную...

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

Механизм наследования. В программе требуется описать базовый и производные классы
В программе требуется описать базовый и производные классы. Базовый класс (возможно, абстрактный) с помощью виртуальных или абстрактных...

Разъяснение
Ребят, может кто-то сможет объяснить новичку в данном языке программирования, что требуется сделать в данной работе

Разъяснение по ТЗ
Доброго времени суток, суть вопроса состоит в том что бы вы помогли мне разобраться с данным ТЗ. Что вам не ясно в данном ТЗ и какой...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru