Під PHP, що ви маєте на увазі під перевантаженням функцій та перезавантаженням функції. і яка різниця між ними обома? не вдалося зрозуміти, у чому різниця між ними.
Під PHP, що ви маєте на увазі під перевантаженням функцій та перезавантаженням функції. і яка різниця між ними обома? не вдалося зрозуміти, у чому різниця між ними.
Відповіді:
Перевантаження - це визначення функцій, які мають подібні підписи, але мають різні параметри. Переопределення стосується лише похідних класів, де батьківський клас визначив метод, і похідний клас бажає замінити цей метод.
У PHP можна перевантажувати лише методи, використовуючи магічний метод __call
.
Приклад переосмислення :
<?php
class Foo {
function myFoo() {
return "Foo";
}
}
class Bar extends Foo {
function myFoo() {
return "Bar";
}
}
$foo = new Foo;
$bar = new Bar;
echo($foo->myFoo()); //"Foo"
echo($bar->myFoo()); //"Bar"
?>
__call
.
Перевантаження функцій відбувається, коли ви визначаєте те саме ім’я функції двічі (або більше), використовуючи різні набори параметрів. Наприклад:
class Addition {
function compute($first, $second) {
return $first+$second;
}
function compute($first, $second, $third) {
return $first+$second+$third;
}
}
У наведеному вище прикладі функція compute
перевантажена двома різними підписами параметрів. * Це ще не підтримується в PHP. Альтернативою є використання необов'язкових аргументів:
class Addition {
function compute($first, $second, $third = 0) {
return $first+$second+$third;
}
}
Перезапис функції відбувається, коли ви розширюєте клас та переписуєте функцію, яка існувала в батьківському класі:
class Substraction extends Addition {
function compute($first, $second, $third = 0) {
return $first-$second-$third;
}
}
Наприклад, compute
переосмислює поведінку, викладену в Addition
.
Subtraction
розширити Addition
клас. :)
Строго кажучи, різниці немає, оскільки ви не можете зробити жодного :)
Переопределення функції могло бути виконано з розширенням PHP, як APD, але це застаріло, і остання версія afaik була непридатною.
Перевантаження функцій у PHP не може бути здійснено через динамічне введення тексту, тобто у PHP ви не визначаєте змінні для певного типу. Приклад:
$a=1;
$a='1';
$a=true;
$a=doSomething();
Кожна змінна має різний тип, але ти можеш знати тип перед виконанням (див. 4-ю). Для порівняння, інші мови використовують:
int a=1;
String s="1";
bool a=true;
something a=doSomething();
В останньому прикладі потрібно насильно встановити тип змінної (як приклад, я використовував тип даних "щось").
Ще одне "питання", чому перевантаження функцій неможливо в PHP: PHP має функцію під назвою func_get_args (), яка повертає масив поточних аргументів, тепер врахуйте наступний код:
function hello($a){
print_r(func_get_args());
}
function hello($a,$a){
print_r(func_get_args());
}
hello('a');
hello('a','b');
Враховуючи, що обидві функції приймають будь-яку кількість аргументів, який слід обрати компілятор?
Нарешті, я хотів би зазначити, чому вищезазначені відповіді частково неправильні; функція перевантаження / переопределення НЕ дорівнює методу перевантаження / переопределення.
Якщо метод схожий на функцію, але специфічний для класу, в цьому випадку PHP дозволяє переосмислити класи, але знову ж таки не мати перевантаження через мовну семантику.
На закінчення такі мови, як Javascript, дозволяють переосмислити (але знову ж таки, не перевантажувати), однак вони також можуть показати різницю між перекриттям функції користувача та методом:
/// Function Overriding ///
function a(){
alert('a');
}
a=function(){
alert('b');
}
a(); // shows popup with 'b'
/// Method Overriding ///
var a={
"a":function(){
alert('a');
}
}
a.a=function(){
alert('b');
}
a.a(); // shows popup with 'b'
Приклад перевантаження
class overload {
public $name;
public function __construct($agr) {
$this->name = $agr;
}
public function __call($methodname, $agrument) {
if($methodname == 'sum2') {
if(count($agrument) == 2) {
$this->sum($agrument[0], $agrument[1]);
}
if(count($agrument) == 3) {
echo $this->sum1($agrument[0], $agrument[1], $agrument[2]);
}
}
}
public function sum($a, $b) {
return $a + $b;
}
public function sum1($a,$b,$c) {
return $a + $b + $c;
}
}
$object = new overload('Sum');
echo $object->sum2(1,2,3);
Хоча парадигма перевантаження не підтримується PHP повністю, однаковий (або дуже подібний) ефект може бути досягнутий за допомогою параметрів (ив) за замовчуванням (як хтось згадував раніше).
Якщо ви визначаєте свою функцію так:
function f($p=0)
{
if($p)
{
//implement functionality #1 here
}
else
{
//implement functionality #2 here
}
}
Коли ви називаєте цю функцію, наприклад:
f();
ви отримаєте один функціонал (№1), але якщо ви будете називати його таким параметром:
f(1);
ви отримаєте ще одну функціональність (№2). Це ефект перевантаження - різний функціонал залежно від вхідних параметрів функції.
Я знаю, хтось зараз запитає, яку функціональність ви отримаєте, якщо він / вона називатиме цю функцію f (0).
Я хотів би зазначити тут, що перевантаження в PHP має зовсім інше значення порівняно з іншими мовами програмування. Багато людей сказали, що перевантаження не підтримується в PHP і звичайним визначенням перевантаження, так, що функціональність прямо не доступна.
Однак правильне визначення перевантаження в PHP зовсім інше.
У PHP перевантаження відноситься до динамічного створення властивостей і методів, використовуючи магічні методи, такі як __set () і __get (). Ці методи перевантаження використовуються під час взаємодії з методами чи властивостями, недоступними або не оголошеними.
Ось посилання з посібника PHP: http://www.php.net/manual/en/language.oop5.overloading.php
Перевантаження методу відбувається, коли два або більше методів з однаковою назвою методу, але різною кількістю параметрів в одному класі. PHP не підтримує метод перевантаження. Перевизначення методу означає два методи з однаковим ім'ям методу та однаковою кількістю параметрів у двох різних класах означає батьківський клас та дочірній клас.
Існують деякі відмінності між перевантаженням та перезавантаженням функцій, хоча обидві містять однакову назву функції. При перевантаженні між однойменними функціями містяться різні типи аргументів або тип повернення; такі як: "функція add (int a, int b)" & " функція add (float a, float b); Тут функція add () перевантажена. У разі переосмислення і аргумент, і ім’я функції однакові. Він, як правило, знаходиться у спадщині або у ознаках. Треба дотримуватися деяких тактик, щоб ввести , яка функція буде виконуватися зараз. Отже, при переосмисленні програміст дотримується певної тактики виконання потрібної функції, де при перевантаженні програма може автоматично визначити потрібну функцію ... Дякую!
Перевантаження: У реальному світі перевантаження означає присвоювати якісь зайві речі комусь. Як і в реальному світі Перевантаження в PHP означає виклик додаткових функцій. Іншим способом можна сказати, що він має функцію слізь з різними параметрами. У PHP ви можете використовувати перевантаження магічними функціями, наприклад __get, __set, __call тощо.
Приклад перевантаження:
class Shape {
const Pi = 3.142 ; // constant value
function __call($functionname, $argument){
if($functionname == 'area')
switch(count($argument)){
case 0 : return 0 ;
case 1 : return self::Pi * $argument[0] ; // 3.14 * 5
case 2 : return $argument[0] * $argument[1]; // 5 * 10
}
}
}
$circle = new Shape();`enter code here`
echo "Area of circle:".$circle->area()."</br>"; // display the area of circle Output 0
echo "Area of circle:".$circle->area(5)."</br>"; // display the area of circle
$rect = new Shape();
echo "Area of rectangle:".$rect->area(5,10); // display area of rectangle
Переопределення: У об'єктно-орієнтованому програмуванні переосмислення полягає в заміні батьківського методу в дочірньому класі. При переопределенні ви можете повторно оголосити метод батьківського класу в дочірньому класі. Отже, в основному метою переосмислення є змінити поведінку методу вашого батьківського класу.
Приклад переопределення:
class parent_class
{
public function text() //text() is a parent class method
{
echo "Hello!! everyone I am parent class text method"."</br>";
}
public function test()
{
echo "Hello!! I am second method of parent class"."</br>";
}
}
class child extends parent_class
{
public function text() // Text() parent class method which is override by child
class
{
echo "Hello!! Everyone i am child class";
}
}
$obj= new parent_class();
$obj->text(); // display the parent class method echo
$obj= new parent_class();
$obj->test();
$obj= new child();
$obj->text(); // display the child class method echo
PHP 5.xx не підтримує перевантаження, тому PHP не є повністю OOP.