[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перегрузка методов
Страницы: 1, 2, 3
Zzepish
Кто знает: в php вообще будут вводить такое?
Ибо было бы удобно (местами)
Arh
Цитата
Ибо было бы удобно (местами)

Например?

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Zzepish
Arh
public function doSomething(array $array)
{
return $array;
}

public function doSomething(Obj $obj)
{
return $obj->something();
}
sergeiss
Что вообще такое "перегрузка функций" по своей сути? Это когда средствами языка определяется, что в зависимости от типа параметров вызывается определенная функция.

Вопрос: возможно ли это сделать в ПХП? Давай думать. Можешь ли ты в принимающей функции четко и однозначно определить, какого типа параметры переданы? Если можешь, то и сам язык сможет это сделать. А если не сможешь, то и автоматически это будет невозможно.

Учитывая отсутствие четкой типизации в ПХП, я думаю, что полноценную перегрузку функций сделать нельзя.

Кстати. В С++, по крайней мере в его версии от Борланда, с коей я работал, насчет перегрузки функций было сказано очень однозначно. Фактически, каждая функция имеет внутреннее имя, зависящее от данного ей имени и типа параметров. Например, объявили int getData(char *), а внутри эта функция будет иметь имя getData__c (точный формат не помню, но суть точно помню). Если же её перегрузили и создали int getData(int), то её внутреннее имя будет getData__i. То есть, это будут все-таки разные функции.

PS. Написал ты в ПХП doSomething($val), но точная величина и тип переменной будут известны только во время исполнения, а не во время интерпретации. А в Си всё происходит во время компиляции, причем типы переменных однозначно известны.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Arh
А удобство то в чём?
Ты меняешь api метода, сама обработка данных тоже меняется, по сути это полностью новый метод.


public function etwasZuTun (array $array) {
return $array;
}

public function ietsTeDoen (object $object) {
return $object->soko();
}


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
sergeiss
Arh, на самом деле в ряде случаев это может быть удобно. Но как я написал выше, с учтом специфики ПХП не получится так сделать.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
kaww
Цитата (sergeiss @ 10.11.2016 - 17:02)
Вопрос: возможно ли это сделать в ПХП?

Цитата (sergeiss @ 10.11.2016 - 17:02)
Учитывая отсутствие четкой типизации в ПХП, я думаю, что полноценную перегрузку функций сделать нельзя.

http://php.net/manual/ru/migration70.new-features.php Scalar type declarations и Return type declarations
Arh
sergeiss
Цитата
на самом деле в ряде случаев это может быть удобно.

Например?

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Invis1ble
Цитата (2015-06-29 18:20 UTC kalle@php.net)
it is unlikely to be implemented
Zzepish
sergeiss
строгую типизацию уже вводят в PHP!

Invis1ble
ок(((


P.S.
Arh
Чтоб юзать не 2 разных метода, а один!
sergeiss
Цитата (Arh @ 10.11.2016 - 14:18)
sergeiss
Цитата
на самом деле в ряде случаев это может быть удобно.

Например?

Ну вот смотри. Например, тебе нужно получать инфу о некоем объекте. Надо что-то там общёлкать и выдать нечто (что именно - в данном случае не важно), должен быть один и тот же ответ. Допустим, что объект можно идентифицировать по имени, по айдишнику, и по набору параметров, состоящему из двух целых идентификаторов.
Можно сделать 3 разных функции (3 разных названия), а можно с одним названием, но разным набором аргументов (либо строка, либо одно целое число, либо 2 целых числа). Второй подход ты особенно оценишь, если у тебя будет не одна такая "группа" перегруженных функций, а штук 10-20 smile.gif Потому что либо ты работаешь с этими 10-20 функциями, либо, возможно, с несколькими сотнями.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Arh
sergeiss
Цитата
либо ты работаешь с этими 10-20 функциями, либо, возможно, с несколькими сотнями

Но так ведь придётся работать с сотнями разных экземпляров классов.

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
bestxp
перегрузка методов это очень хороший пример OpenClosed принципа) мы пишем новый код, а не изменяем старый)

вообще крутотень, я после obj-c пару лет назад, плакал из-за отсутствия сего в PHP, насколько это удобно в зависимости от источников данных вызывать перегруженный методы, и получать один результат =) добавил источник, добавил метод с тем же именованием) на сколько меньше всего писать) нежели плодить фабрики с кучей классов и через фабрику вызывать что-то еще , фу какая гадость
sergeiss
Цитата (Arh @ 10.11.2016 - 17:12)
Но так ведь придётся работать с сотнями разных экземпляров классов.

Ни в коем случае!!! Все "перегруженные" методы с одним названием относятся к одному классу. И, соответственно, к одному экземпляру одновременно.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
Цитата (sergeiss @ 10.11.2016 - 12:02)
Это когда средствами языка определяется, что в зависимости от типа параметров вызывается определенная функция.

Называется сигнатура функции.

Цитата (Arh @ 10.11.2016 - 12:18)
sergeiss
Цитата
на самом деле в ряде случаев это может быть удобно.

Например?

например
public function String toString(int a);
public function String toString(long a);
public function String toString(Object a);
public function String toString(myClass a);
public function String toString(etc... a);


Это классика, а вообще, перезагрузка - это очень мощный инструмент.
например
public function void getParam(MyTyp a) {
getParam(a, null);
}

public function void getParam(MyTyp a, YourTyp b) {
// bla-bla-bla 20 строк
}


_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.