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

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

16.08.2016, 07:54. Показов 4551. Ответов 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
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,854
Записей в блоге: 4
09.09.2016, 08:40
Студворк — интернет-сервис помощи студентам
Gcom, интерфейс это требования к конструкции - что то вроде "у домика должны быть: крыша, дверь,...", а как именно эти требования будут реализованы - неважно.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
09.09.2016, 10:14  [ТС]
Цитата Сообщение от Cra3y Посмотреть сообщение
что то вроде "у домика должны быть: крыша, дверь,...",
Скорее всего не сами: крыша, дверь, а то что с ними можно будет сделать: покрасить крышу в красный цвет, поменять дверь увеличив дверной проем. В интерфейсах же идет объявление ТОЛЬКО методов (и то без описания способа их реализации), а свойства (ширина двери, цвет крыши) не объявляют в интерфейсах.

Добавлено через 1 час 28 минут
разбираемся с конструктором
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function myprint($obj) { echo ('<pre>'); var_dump($obj); echo ('</pre><hr>'); }
 
class InstructionsFirst
{
    # объявление свойств
    protected  $window1;
    protected  $door1 = 'red';
    protected  $door_width = 100; # ширина двери
 
    # объявление методов
    public function setDoorWidth($width)
    {
        $this->door_width = $width;
    }
 
    public function getDoorWidth()
    {
        return $this->door_width;
    }
}
 
class InstructionsSecond
{
    # объявление свойств
    protected  $window1;
    protected  $door1 = 'green';
    protected  $door_width = 150; # ширина двери
 
    # объявление методов
    public function setDoorWidth($width)
    {
        $this->door_width = $width;
    }
}
 
class InstructionThird
{
    protected $door_width = 200;
 
    function __construct($door_width)
    {
        $this->door_width = $door_width;
    }
}
 
$house1 = new InstructionsFirst(); #myprint($house1);
 
$house2 = new InstructionsFirst(); myprint($house2);
$house2->setDoorWidth(110); myprint($house2);
 
$house3 = new InstructionsSecond(); myprint($house3);
$house3->setDoorWidth($house2->getDoorWidth()); myprint($house3);
 
$house4 = new InstructionThird(); myprint($house4);
$house5 = new InstructionThird('250'); myprint($house5);

Интересны домики под номером 4 и 5:
На данном этапе выдается ошибка:
Warning: Missing argument 1 for InstructionThird::__construct(), called in $house4 = new InstructionThird(); and defined in function __construct($door_width)
Notice: Undefined variable: door_width in $this->door_width = $door_width;
почему? вообще хочу при создании по третьей инструкции домов по умолчанию (без указания размера) создавать двери шириной 200, а если указать размер, то создавать с указанным размером.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,854
Записей в блоге: 4
09.09.2016, 10:18
Цитата Сообщение от Gcom Посмотреть сообщение
вообще хочу при создании по третьей инструкции домов по умолчанию
PHP
1
function __construct($door_width = 250)
либо
PHP
1
2
3
4
5
function __construct($door_width = null) {
    if (!is_null($door_width)) {
        $this->door_width = $door_width;
    }
}
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
09.09.2016, 10:36  [ТС]
Теперь чисто эстетический момент, что лучше?
Так:
PHP
1
2
3
4
5
6
7
8
9
10
11
class InstructionThird
{
    private $door_width = 200;
 
    function __construct($door_width = null)
    {
        if (!is_null($door_width)) {
            $this->door_width = $door_width;
        }
    }
}
Или так:
PHP
1
2
3
4
5
6
7
8
9
class InstructionThird
{
    private $door_width;
 
    function __construct($door_width = 200)
    {
        $this->door_width = $door_width;
    }
}
и почему, объясните.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,854
Записей в блоге: 4
09.09.2016, 11:09
Цитата Сообщение от 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
25
26
27
28
29
30
31
32
33
class InstructionThird
{
    const DEFAULT_DOOR_WIDTH = 300;
    /**
     * @var int
     */
    private $door_width;
 
    /**
     * InstructionThird constructor.
     * @param int|null $value
     */
    public function __construct($value = null)
    {
        $this->setDoorWidth($value);
    }
 
    /**
     * @return int
     */
    public function getDoorWidth(): int
    {
        return $this->door_width;
    }
 
    /**
     * @param int|null $door_width
     */
    public function setDoorWidth($door_width)
    {
        $this->door_width = is_null($door_width) ? static::DEFAULT_DOOR_WIDTH : $door_width;
    }
}
Избавляет от "магических" чисел и позволяет переопределять умолчания в потомках
PHP
1
2
3
4
5
class InstructionOther extends InstructionThird
{
    const DEFAULT_DOOR_WIDTH = 250;
}
var_dump((new InstructionOther())->getDoorWidth());
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
13.09.2016, 06:01  [ТС]
Cra3y, А в какой версии работает следующая конструкция:
PHP
1
2
3
4
    public function getDoorWidth(): int
    {
        return $this->door_width;
    }
и я так понимаю что getDoorWidth(): int говорит о том, что метод возвращает значение door_width с типом int.
Просто у меня стоит РНР 5.3 и выдает синтаксическую ошибку данная конструкция.

Добавлено через 1 час 9 минут
Цитата Сообщение от Cra3y Посмотреть сообщение
PHP
1
$this->door_width = is_null($door_width) ? static::DEFAULT_DOOR_WIDTH : $door_width;
И еще почему именно так static::DEFAULT_DOOR_WIDTH, а не так: self::DEFAULT_DOOR_WIDTH в случае родительского класса или parent::DEFAULT_DOOR_WIDTH в случае дочернего класса.

Добавлено через 19 минут
Цитата Сообщение от Gcom Посмотреть сообщение
И еще почему именно так static::DEFAULT_DOOR_WIDTH, а не так: self::DEFAULT_DOOR_WIDTH в случае родительского класса или parent::DEFAULT_DOOR_WIDTH в случае дочернего класса.
Походу я нашел ответ на этот вопрос
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class a
{
    static protected $test = "class a";
 
    public function static_test()
    {
        echo static::$test; // Results class b
        echo self::$test; // Results class a
    }
}
 
class b extends a
{
    static protected $test="class b";
}
 
$obj = new b();
$obj->static_test();
В нашем случае static::DEFAULT_DOOR_WIDTH будет вызываться константа из родительского метода, при условии если она не переопределена в дочернем классе.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
13.09.2016, 06:05
Цитата Сообщение от Gcom Посмотреть сообщение
в какой версии работает следующая конструкция:
Начиная с PHP 7.
Цитата Сообщение от Gcom Посмотреть сообщение
я так понимаю что getDoorWidth(): int говорит о том, что метод возвращает значение door_width с типом int.
http://php.net/manual/ru/funct... eclaration
Цитата Сообщение от Gcom Посмотреть сообщение
почему именно так static:EFAULT_DOOR_WIDTH, а не так: self:EFAULT_DOOR_WIDTH в случае родительского класса
Позднее статическое связывание,
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
13.09.2016, 06:16  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Начиная с PHP 7.
А на РНР5 если реализовать нечто подобное, на сколько это правильно:
PHP
1
2
3
4
    public function setDoorWidth($door_width)
    {
        $this->door_width = is_null($door_width) ? static::DEFAULT_DOOR_WIDTH : (int)$door_width;
    }
Ну и строим наш шестой домик:
PHP
1
$house6 = new InstructionThird('222'); myprint($house6);
Code
1
2
3
4
object(InstructionThird)#6 (1) {
  ["door_width":"InstructionThird":private]=>
  int(222)
}
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
13.09.2016, 06:44
Не знаю, зачем здесь константа DEFAULT_DOOR_WIDTH. Значение по умолчанию можно прямо в свойстве указать:
PHP
1
private $door_width = 300;
Потом, зачем проверка на NULL? А если строку передадут? Лучше просто так:
PHP
1
2
3
4
public function setDoorWidth($door_width)
{
    $this->door_width = (int) $door_width;
}
Наше дело получить число. Вот и приводим к числу и дело в шляпе.
В PHP 7 ещё проще:
PHP
1
2
3
4
public function setDoorWidth(int $door_width)
{
    $this->door_width = $door_width;
}
$door_width будет числом теле метода.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
13.09.2016, 10:13  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Не знаю, зачем здесь константа DEFAULT_DOOR_WIDTH.
Я тоже этого не понял, поэтому продолжаю эксперименты:
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
class InstructionFourth
{
    private static $door_width = 300;
 
    public function __construct($value = null)
    {
        $this->setDoorWidth($value);
    }
 
    public function setDoorWidth($door_width)
    {
        $this->door_width = is_null($door_width) ? static::$door_width : (int)$door_width;
    }
 
    public function getDoorWidth()
    {
        return $this->door_width;
    }    
}
 
class InstructionFourthOther extends InstructionFourth
{
    private static $door_width = 333;
}
Вопрос как создать домик по дочерней инструкции (InstructionFourthOther) через родительский класс, используя метод getDoorWidth()
Что то на подобии этого:
(new InstructionFourthOther())->getDoorWidth();

Добавлено через 42 минуты
Разобрался, поигрался с "зонами видимости" и заработало:
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
class InstructionFourth
{
    private static $door_width = 300;
 
    public function __construct($value = null)
    {
        $this->setDoorWidth($value);
    }
 
    private function setDoorWidth($door_width)
    {
        $this->door_width = is_null($door_width) ? static::$door_width : (int)$door_width;
    }
 
    private function getDoorWidth()
    {
        return $this->door_width;
    }    
}
 
class InstructionFourthOther extends InstructionFourth
{
    protected static $door_width = 333;
}
$house11 = new InstructionFourthOther(); myprint($house11);
$house12 = new InstructionFourthOther(555); myprint($house12);
$house13 = new InstructionFourthOther(array()); myprint($house13);
Получается у нас в классе должна быть хотя бы одна "точка входа" в данном случае:
PHP
1
2
3
4
    public function __construct($value = null)
    {
        $this->setDoorWidth($value);
    }
остальное private и protected в дочерних классах.

Добавлено через 2 часа 35 минут
Едем дальше ВотЪ код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class myLoader
{
    private $pathwayToConnectFiles = '.'; # текущая дериктория (по умолчанию)
    
    function __construct()
    {
        spl_autoload_register(array($this, 'autoloadClass'));
    }
 
    private function autoloadClass($value = null)
    {
        if ($value) {
            set_include_path($this->pathwayToConnectFiles);
            spl_autoload_extensions('.php');
            spl_autoload($value);
        }
    }
}
 
$start = new myLoader(); myprint($start);
Temp::startTemp();
Собственно вопрос: как лучше(правильней) будет, так:
PHP
1
2
3
4
    function __construct()
    {
        spl_autoload_register(array($this, 'autoloadClass'));
    }
или так:
PHP
1
2
3
4
  public  function __construct()
    {
        spl_autoload_register(array($this, 'autoloadClass'));
    }
З.Ы. Вы наверно уже устали от моих "тупых" вопросов
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
13.09.2016, 10:50
Методы, для которых явно не указана область видимости, являются публичными. Там что и так и так правильно.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
13.09.2016, 12:09  [ТС]
А вопросы все поступают и поступают
Продолжаем эксперименты:
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
class myLoader
{
    private $pathwayToConnectFiles; # = '.'; # текущая директория (по умолчанию)
    
    public function __construct()
    {
        $this->setPathwayToConnectFiles();
        spl_autoload_register(array($this, 'autoloadClass'));
    }
 
    private function setPathwayToConnectFiles()
    {
        $this->pathwayToConnectFiles = '.';
    }
 
    private function autoloadClass($value = null)
    {
        if ($value) {
            set_include_path($this->pathwayToConnectFiles); # set_include_path('.'.PATH_SEPARATOR.implode(PATH_SEPARATOR, $aPathToDirectory));
            spl_autoload_extensions('.php');
            spl_autoload($value);
        }
    }
}
 
$start = new myLoader(); myprint($start);
Temp::startTemp();
TempPath::startTemp();
Собственно вопрос, этот скрипт отрабатывает:
Code
1
2
3
4
object(myLoader)#1 (1) {
  ["pathwayToConnectFiles":"myLoader":private]=>
  string(1) "."
}
и если сделать так:
PHP
1
    #private $pathwayToConnectFiles; # = '.'; # текущая директория (по умолчанию)
тоже работает:
Code
1
2
3
4
object(myLoader)#1 (1) {
  ["pathwayToConnectFiles"]=>
  string(1) "."
}
Нужна ли это переменная pathwayToConnectFiles? Если без нее работает.

Добавлено через 2 минуты
Цитата Сообщение от Para bellum Посмотреть сообщение
Методы, для которых явно не указана область видимости, являются публичными. Там что и так и так правильно.
Ну явное лучше чем не явное, значит будем всегда указывать явно

Добавлено через 1 час 13 минут
Опять эстетический вопрос
Что лучше (правильней), так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
    public function getArrayOfPathwayToConnect()
    {
        return implode(PATH_SEPARATOR, $this->pathwayToConnectFiles);
    }
 
    private function autoloadClass($value = null)
    {
        if ($value) {
            set_include_path($this->getArrayOfPathwayToConnect());
            spl_autoload_extensions('.php');
            spl_autoload($value);
        }
    }
или так?
PHP
1
2
3
4
5
6
7
8
    private function autoloadClass($value = null)
    {
        if ($value) {
            set_include_path(implode(PATH_SEPARATOR, $this->pathwayToConnectFiles));
            spl_autoload_extensions('.php');
            spl_autoload($value);
        }
    }
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
13.09.2016, 20:53
Цитата Сообщение от Gcom Посмотреть сообщение
Нужна ли это переменная pathwayToConnectFiles? Если без нее работает.
Нужна. Только не понятно зачем тут setPathwayToConnectFiles(), если значение можно сразу задать при объявлении переменной.

Цитата Сообщение от Gcom Посмотреть сообщение
Что лучше (правильней), так:
Боюсь себе представить что же содержит свойство $this->pathwayToConnectFiles
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
14.09.2016, 04:58  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
Только не понятно зачем тут setPathwayToConnectFiles()
Ну это типа заглушка, там потом будет реализована обработка по получению массива с путями, который и будет подставляться в set_include_path()
Цитата Сообщение от pav1uxa Посмотреть сообщение
Боюсь себе представить что же содержит свойство $this->pathwayToConnectFiles
ну вот в нем как раз и будет храниться массив с путями.

Опять вопрос что брать за "отправную точку", это (полный путь):
$this->pathwayToConnectFiles = array(__DIR__, );
или это (относительный путь) $this->pathwayToConnectFiles = array('.', );
вроде как в целях безопасности зачем лишний раз светить полный путь, ну в случае, если произойдет непредвиденная ситуация с вылетом какой либо неучтенной ошибки?
0
14.09.2016, 09:08

Не по теме:

Цитата Сообщение от Gcom Посмотреть сообщение
ну вот в нем как раз и будет храниться массив с путями.
А, там все нормально, я просто перепутал PATH_SEPARATOR с DIRECTORY_SEPARATOR

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2016, 09:08

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
95
Ответ Создать тему
Новые блоги и статьи
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru