[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перегрузка методов
Страницы: 1, 2, 3
Arh
sergeiss
Цитата
Ни в коем случае!!! Все "перегруженные" методы с одним названием относятся к одному классу. И, соответственно, к одному экземпляру одновременно.

А как бы примерно это могло выглядеть на php?

$Test = new Test();
$Test->display(['юху']); // принимает массив, возвращает результат
$Test->display (object $object) {
// как то на лету перегружаем метод
}
$Test->display((object)['юху']); // принимает объект


В таком случае есть анонимные функции.

AllesKlar
Да это не пример удобства, это пример как вызывать.
Пример - это решение придуманной или реальной задачи.


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Invis1ble
Цитата (Arh @ 10.11.2016 - 18:32)
А как бы примерно это могло выглядеть на php?


class StringBuilder {

public function append(StringBuilder $stringBuilder) {
$this->string += $stringBuilder->toString();
}

public function append(string $string) {
$this->string += $string;
}

}


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Arh
Invis1ble
Не понял. Типа как с переменными, новый код перезапишет старый?
$a = 1;
$a = 2;


class StringBuilder {

/*public function append(StringBuilder $stringBuilder) {
$this->string += $stringBuilder->toString();
}*/


public function append(string $string) {
$this->string += $string;
}

}


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
AllesKlar
Цитата (Arh @ 10.11.2016 - 16:32)
AllesKlar
Да это не пример удобства, это пример как вызывать.
Пример - это решение придуманной или реальной задачи.


What? :blink:
Ну вот еще
public function int max(int a, int b) { 
return a > b ? a : b;
}

public function int max(int a, int b, int c) {
return max(max(a,b), c);
}


Помимо прочего, в строго типизированных языках, очень часто нужно вызывать функции с одинаковой логикой, но разными типами параметров, как это уже показал Invis1ble

Нет одного конкретного примера.
Это тоже самое, что спросить, зачем использовать молоток - хочешь, гвозди ломай, хочешь, камни долби, хочешь в бубен бей, хочешь, головы проламывай.
Молоток - это мощный многофункциональный инструмент.

Цитата (Arh)
Invis1ble
Не понял. Типа как с переменными, новый код перезапишет старый?


Нет, класс посмотрит на вызываемую функцию (имя, количество параметров и их типы) - это сигнатура функции.
если у него есть подходящая сигнатура, то он вызовет ее.

_____________
[продано копирайтерам]
Arh
AllesKlar
Цитата
класс посмотрит на вызываемую функцию (имя, количество параметров и их типы) - это сигнатура функции.
если у него есть подходящая сигнатура, то он вызовет ее.

во)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
AllesKlar
Цитата
Это тоже самое, что спросить, зачем использовать молоток

Ну тут пример "гвозди забивать")
А ты показываешь как держать, а чё с ним делать хз)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
sergeiss
Вообще, если в ПХП (как и в JS) требуется сделать некий универсальный метод или функцию, чтобы принимали разные параметры, достаточно чуть-чуть расширить начальные условия :) Или, иными словами, посмотреть на это всё с немного другой точки зрения.
"Перегруженные" функции принимают параметры разного типа. Но в ПХП и в JS мы можем передать ассоциативный массив (ПХП) или объект (JS) в качестве параметра!!! Получим, по сути, тот же функционал, что и с перегруженными методами/функциями.

Примеры, совершенно абстрактные. Вызываем одну и ту же функцию, но в зависимости от параметров она может делать как что-то одинаковое, так и разные веще.
// PHP
setSomething( [ 'id' => 5] );
setSomething( [ 'first_name' => 'New name'] );
setSomething( [ 'first_name' => 'First name', 'last_name' => 'Last name'] );


// JS
doSomething( { id: 5 } );
doSomething( { first_name: 'New name' } );
doSomething( { first_name: 'First name', last_name: 'Last name' } );


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

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

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

user posted image
Arh
sergeiss
Можно и через

class Test {

function get (...$arg) {

if (count($arg) == 1 && is_string($arg[0])) {
return $this->stringTest(...$arg);
} elseif (count($arg) == 1 && is_array($arg[0])) {
return $this->arrayTest(...$arg);
} elseif (count($arg) == 2 && is_array($arg[0]) && is_array($arg[1])) {
return $this->arraysTest(...$arg);
}

}


function stringTest (string $string) {
return 'строка';
}

function arrayTest (array $array) {
return 'массив';
}

function arraysTest (array $array1, array $array2) {
return 'два массива';
}

}


$Test = new Test();
print_r($Test->get('привет'));
print_r($Test->get([1]));
print_r($Test->get([1], [2]));


Но я думал тут типа наследования, потому что bestxp сказал про OpenClosed, типа "не править код".



_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Быстрый ответ:

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