Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1

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

16.08.2016, 07:54. Показов 4453. Ответов 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
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
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
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
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
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
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
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru