Java ile OOP başladı, ve şimdi ben PHP içine oldukça ağır alıyorum. Java gibi farklı argümanlar ile bir fonksiyon katları oluşturmak mümkün mü? Veya dil yorumlanır / untyped doğa Bunu önlemek ve çatışmaların neden olur?
Herkes iyi kod açıklamalar ile cevap vermektedir. Burada daha üst düzey açısından bir açıklaması var: Eğer aynı ada ancak farklı argümanlarla fonksiyonu hakkında konuşmak ne başvuruyorsunuz Java destekleyen Method overloading hangi. PHP dinamik yazdığınız dili olduğu için, bu mümkün değildir. Eğer çok aynı etkiyi elde etmek için kullanabileceğiniz Default arguments yerine PHP destekler.
Eğer sınıfları ile ilgili iseniz __call()
ile yöntemlerini aşırı (bkz. Overloading), örneğin yapabilirsiniz:
class Foo {
public function doSomethingWith2Parameters($a, $b) {
}
public function doSomethingWith3Parameters($a, $b, $c) {
}
public function __call($method, $arguments) {
if($method == 'doSomething') {
if(count($arguments) == 2) {
return call_user_func_array(($this,'doSomethingWith2Parameters'), $arguments));
}
else if(count($arguments) == 3) {
return call_user_func_array(($this,'doSomethingWith3Parameters'), $arguments));
}
}
}
}
Sonra yapabilirsiniz:
$foo = new Foo();
$foo->doSomething(1,2); // calls $foo->doSomethingWith2Parameters(1,2)
$foo->doSomething(1,2,3); // calls $foo->doSomethingWith3Parameters(1,2,3)
Bu iyi örnek olmayabilir ama __call
bazen çok kullanışlı olabilir. Temelde bu yöntem mevcut değil nesneler yöntem çağrıları yakalamak için kullanabilirsiniz.
Ama aynı ya da Java kadar kolay değildir.
Kısa cevap: Hayır, sadece belirli bir isim ile bir fonksiyon olabilir.
Daha uzun cevap: Sen argümanlar doğru sayıda fonksiyonu içerir include kıvrık sistemi oluşturarak yapabilirsiniz. Ya da, daha iyisi, parametreleri ve aynı zamanda parametrelere değişken bir miktar için varsayılan değerleri izin PHP yararlanabilirsiniz.
Varsayılan değerler yararlanmak için sadece fonksiyonunu tanımlarken bir parametre için bir değer atamak:
function do_something($param1, $param2, $param3 = 'defaultvaule') {}
Bu işlevi çağrıldığında onlar ihmal edilebilir beri işlevi bildirisinin sonunda varsayılan değerlerle parametreleri koymak yaygın bir uygulamadır ve bunları net kullanmak için sözdizimi yapar:
do_something('value1', 'value2'); // $param3 is 'defaultvaule' by default
Ayrıca func_num_args()
ve func_get_arg()
argümanları almak için kullanarak parametrelerin değişken miktarda gönderebilirsiniz:
<?php
function dynamic_args() {
echo "Number of arguments: " . func_num_args() . "<br />";
for($i = 0 ; $i < func_num_args(); $i++) {
echo "Argument $i = " . func_get_arg($i) . "<br />";
}
}
dynamic_args("a", "b", "c", "d", "e");
?>
Herkesin dediği gibi, varsayılan tarafından desteklenmiyor değil. Kullanarak Felix'in örnek __call()
, muhtemelen en iyi yoldur.
Eğer birbirlerinden miras sınıfları kullanıyorsanız, aksi takdirde, her zaman çocuğunuzun derslerinde yöntem adlarını aşırı olabilir. Bu aynı zamanda ebeveyn yöntemi çağırmak için izin verir.
Örneğin bu dersleri almak ...
class Account {
public function load($key,$type) {
print("Loading $type Account: $key\n");
}
}
class TwitterAccount extends Account {
public $type = 'Twitter';
public function load($key) {
parent::load($key,$this->type);
}
}
Sonra bu yüzden gibi onları arayabilirsiniz ...
$account = new Account();
$account->load(123,'Facebook');
$twitterAccount = new TwitterAccount();
$twitterAccount->load(123);
Ve sonuç olurdu ...
Loading Facebook Account: 123 Loading Twitter Account: 123
PHP istediğiniz işlevi argümanlar anlaması olamaz çünkü Hayır bu (sizin beklediğiniz hangi tür belirtmeyen), mümkün değildir. Ancak, php argümanlarına varsayılan değerleri verebilir.
Bu şekilde arayan argümanları farklı miktarlarda verebilirsiniz. Bu olsa aynı işlevi çağırır.
Bir örnektir:
function test($a = true)
Bu 0 argümanlar verilir true bir varsayılan verir ve 1 argüman verilirse, arama değeri alır.
Aşırı yükleme PHP mümkün değil ama diğer cevaplar açıklandığı gibi bazı varsayılan parametre değerleri ile uzatmak etrafında alabilirsiniz.
Bir parametre türlerine göre bir işlev / yöntem aşırı istediği zaman bu geçici çözümün sınırıdır. Bu PHP mümkün değildir, bir parametre türleri kendinizi test etmek gerekir, ya da çeşitli işlevleri yazın. Fonksiyonlar min ve max bu iyi bir örnektir: dizinin bir parametre varsa, aksi takdirde bu parametrelerin min / max döndürür, bu dizinin min / max döndürür yazın.