-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
1

Полиморфизм в PHP

05.02.2017, 19:07. Показов 2496. Ответов 23
Метки php (Все метки)

Author24 — интернет-сервис помощи студентам
В книге по ПХП,где авторы Люк Веллинг,Лора Томпсон "Разработка веб-приложений с помощью ПХП и Msql"

упоминается ,что

Полиморфизм-это скорее характеристика поведения,нежели обьектов.

В ПХП полиморфными могут быть только функции-члены класса.


======

1)И тут возник вопрос--означает ли такое утверждение в книге,что в ПХП можно перегружать методы?

2)И если перегрузка методов в ПХП невозможна,то каким способом реализуется принцип полиморфности?


Например, в C# полиморфизм воплощается через использование перегрузки методов.

(совместное использование одного и того же имени двумя или более методами одного и того же класса, при условии, что их параметры объявляются по-разному. В этом случае говорят, что методы перегружаются, а сам процесс называется перегрузкой методов. Перегрузка методов относится к одному из способов реализации полиморфизма в C#.)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2017, 19:07
Ответы с готовыми решениями:

полиморфизм
using System; class A { public String Call() { return "A"; } } class B

Полиморфизм
Есть 4 класса Клиент(абстрактный), Вкладчик, Кредитор, Организация(производные) ...

Полиморфизм
Никак не пойму, как применить этот полиморфизм...Покажите пожалуйста пример с его использованием.

Полиморфизм
привет, подскажите, везде в книгах пишут: - дочерний класс может вызывать методы свои и своего...

23
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
05.02.2017, 19:23 2
Цитата Сообщение от TVPNERO Посмотреть сообщение
1)И тут возник вопрос--означает ли такое утверждение в книге,что в ПХП можно перегружать методы?
А пробовали попробовать?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
05.02.2017, 19:31 3
Лучший ответ Сообщение было отмечено TVPNERO как решение

Решение

Цитата Сообщение от TVPNERO Посмотреть сообщение
что в ПХП можно перегружать методы?
Нет. Перегрузка это один из частных случаев полиморфизма. В PHP данный механизм не поддерживается, но частично "эмулируется" с помощью параметров по умолчанию.
Цитата Сообщение от TVPNERO Посмотреть сообщение
Например, в C# полиморфизм воплощается через использование перегрузки методов.
В C# помимо перегрузки существует переопределение методов, которое, на мой взгляд, играет не меньшую, а может даже и большую роль в полиморфизме. Сказанное о переопределении имеет отношение и к PHP.

Добавлено через 7 минут
Добавлю, что переопределение относится как к полиморфизму, так и к наследованию и без последнего невозможно.
1
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
05.02.2017, 19:49  [ТС] 4
Kerry_Jr, а что такое переопределение?

Добавлено через 1 минуту
Kerry_Jr, значит в книге где есть утверждение что функции в ПХП -полиморфные имеется ввиду переопределение?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
05.02.2017, 20:35 5
Цитата Сообщение от TVPNERO Посмотреть сообщение
что такое переопределение?
Переопределение, хм... На примере
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base {
    public function some() {
        echo 'Base';
    }
}
 
class Derived extends Base {
    // переопределение метода some
    public function some() {
        echo 'Derived';
    }
}
 
$var = new Derived;
$var->some(); // выведет Derived
// закомментируем функцию some в классе Derived
$var->some() ;// выведет Base
Т.е. переопределение - это "замена" реализации метода базового класса в дочернем.
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.02.2017, 22:13 6
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Перегрузка это один из частных случаев полиморфизма.
А можно это как-то прокомментировать подробнее?
Ведь полиморфизм: один интерфейс - несколько реализаций. А перегруженные методы - это разные методы, несмотря на одинаковое имя, т.е. уже теряется единый интерфейс.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
05.02.2017, 22:22 7
Jewbacabra, первые строчки статьи. Да и вообще статья неплохая.
2
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
07.02.2017, 15:40  [ТС] 8
Kerry_Jr, Спасибо за разьяснение.
А можете ли вы продемонстрировать как например "эмулировать " перезагрузку методов в ПХП.
на таком примере с C#
https://professorweb.ru/my/csh... l6/6_1.php
(на этом ресурсе взял пример перезагрузки методов)

C#
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class UserInfo
    {
        // Перегружаем метод ui
        public void ui()
        {
            Console.WriteLine("Пустой метод\n");
        }
 
        public void ui(string Name)
        {
            Console.WriteLine("Имя пользователя: {0}",Name);
        }
 
        public void ui(string Name, string Family)
        {
            Console.WriteLine("Имя пользователя: {0}\nФамилия пользователя: {1}",Name,Family);
        }
 
        public void ui(string Name, string Family, byte Age)
        {
            Console.WriteLine("Имя пользователя: {0}\nФамилия пользователя: {1}\nВозраст: {2}", Name, Family, Age);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            UserInfo user1 = new UserInfo();
            // Разные реализации вызова перегружаемого метода
            user1.ui();
            user1.ui("Ерохин", "Александр", 26);
 
            Console.ReadLine();
        }
    }
}
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
07.02.2017, 16:11 9
TVPNERO,
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class UserInfo {
    public function ui($name = null, $family = null, $age = null) {
        $result = "Пустой метод\n";
        if (!is_null($name)) {
            $result = 'Имя пользователя: '. $name;
        }
        if (!is_null($family)) {
            $result .= "\nФамилия пользователя: $family";
        }
        if (!is_null($age)) {
            $result .= "\nВозраст: $age";
        }
        echo $result;
    }
}
 
$user = new UserInfo;
$user->ui();
$user->ui('Александр', 'Ерохин', 26);
1
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
07.02.2017, 17:53  [ТС] 10
Kerry_Jr, Спасибо.

Добавлено через 10 минут
Kerry_Jr, а переменная $result которая находиться в блоках с if{} и переменная $result которая находится просто внутри метода
$result = "Пустой метод\n";

это разные локальные переменные или это одна и та же переменная ,которая динамически меняет свое значение ?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
07.02.2017, 17:56 11
TVPNERO, это чуть чуть некорректный вариант, но для примера сойдет. Некорректный, потому что если первым параметром передать null, то вывод будет некорректным.

Добавлено через 57 секунд
Цитата Сообщение от TVPNERO Посмотреть сообщение
а переменная $result
это
Цитата Сообщение от TVPNERO Посмотреть сообщение
это одна и та же переменная ,которая динамически меняет свое значение
1
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
07.02.2017, 18:00  [ТС] 12
Kerry_Jr,Благодарю.
Но в реальности,такой подход можно использовать?

Добавлено через 1 минуту
Kerry_Jr, и что вместо null лучше использовать?(если есть такой вариант конечно)
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
07.02.2017, 18:34 13
Цитата Сообщение от TVPNERO Посмотреть сообщение
Но в реальности,такой подход можно использовать?
В реальности вместо null задаются реальные значения.
PHP
1
2
3
4
5
6
7
8
9
10
11
class UserInfo {
    public function ui($name = 'None', $family = 'None', $age = 0) {
        echo 'Имя пользователя: ', $name, PHP_EOL,
             'Фамилия пользователя: ', $family, PHP_EOL,
             'Возраст: ', $age, PHP_EOL;
    }
}
 
$user = new UserInfo;
$user->ui();
$user->ui('Александр', 'Ерохин', 26);
1
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
07.02.2017, 23:13  [ТС] 14
Kerry_Jr, Спасибо.

Добавлено через 3 часа 13 минут
Kerry_Jr,

я еще пробовал так оставить(то есть без значений null ) но вылазит ошибка
PHP
1
 public function ui($name, $family, $age)
Добавлено через 8 минут
Kerry_Jr, ну и последнее.

а для чего после переменной
PHP
1
$result
идет точка а потом уже знак уравнения?

PHP
1
$result .=
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
08.02.2017, 20:09 15
Цитата Сообщение от TVPNERO Посмотреть сообщение
идет точка а потом уже знак уравнения?
Вы взялись за ООП, не зная таких фундментльных вещей?! Это конкатенация + присваивание, иначе добавление значения в конец данной строки.

Добавлено через 6 минут
Цитата Сообщение от TVPNERO Посмотреть сообщение
я еще пробовал так оставить(то есть без значений null ) но вылазит ошибка
PHP
1
public function ui($name, $family, $age)
Я так думаю, здесь?
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
PHP
1
$user->ui();
Добавлено через 2 минуты
Я сказал, что подставляются реальные значения, которые должны быть использованы по умолчанию, если данный параметр не указан при вызове. Т.е. нежно null не убирать, а заменить на значение, которое будет использовано поумолчанию (собственно, это и называется параметром по умолчанию)

Добавлено через 1 час 28 минут

Не по теме:

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Т.е. нежно null не убирать
Опечатка по Фрейду :D:rofl:

1
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
08.02.2017, 20:18  [ТС] 16
Kerry_Jr, если убрать все точки в result,то выводится только возраст обьектов.А почему именно возраст показывает а другие переменные result с именем обьекта и фамилией нет?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
08.02.2017, 20:27 17
TVPNERO, это на самом деле уже не смешно, это азы PHP, рановато вы начали с ООП, перегрузки методов и пр. Если убрать точку, то переменная $result будет перезаписывать. Если же точка есть, то к уже имеющемуся значению приклеиться следующее.
1
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
08.02.2017, 22:46  [ТС] 18
Kerry_Jr, просто не понимаю почему именно возраст выводит в таком случае,а не что либо другое(имя например)
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
09.02.2017, 09:18 19
TVPNERO, потому что последним присваивается возраст, а, как говорится, "кто последний, тот и папа".
0
-26 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,154
09.02.2017, 14:45  [ТС] 20
Kerry_Jr,
А разве скрипт считываеться не сверху вниз?
Если сверху вниз--то по идее должно быть name.
0
09.02.2017, 14:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2017, 14:45
Помогаю со студенческими работами здесь

Полиморфизм
Очень нужна помощь, запутался. Есть студент и студент-контрактник. При выводе информации у меня...

Полиморфизм
Вот сделал прогу а ее надо было сделать полиморфизмом - кому несложно переделайте #include...

Полиморфизм.
Доброго времени суток. Если задача : При запуске приложение показывает окно фиксированного...

Полиморфизм :(
Всем здравствуйте. Ребят помогите пожалуйста с полиморфизмом. Я читал некоторые статьи и чем больше...


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

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

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