PHP'de Üç nokta (...) nedir?
Magento 2'yi Sunucuma yüklerken bir hata aldım. Kodu araştırın ve hatayı üreten bir Üç nokta (...) olduğunu bulun. Aşağıdaki koddan bahsettim
return new $type(...array_values($args));
PHP'de Üç nokta (...) nedir?
Magento 2'yi Sunucuma yüklerken bir hata aldım. Kodu araştırın ve hatayı üreten bir Üç nokta (...) olduğunu bulun. Aşağıdaki koddan bahsettim
return new $type(...array_values($args));
Yanıtlar:
...$strBir denir PHP'de uyarısı operatör .
Bu özellik, isterseniz bir işleve iletilen "normal" bağımsız değişkenlerle birlikte değişken sayıda bağımsız değişken yakalamanıza olanak tanır. Bir örnekle görmek en kolayı:
function concatenate($transform, ...$strings) {
$string = '';
foreach($strings as $piece) {
$string .= $piece;
}
return($transform($string));
}
echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES
İşlev bildirimindeki parametreler listesinde ...operatör vardır ve temelde "... ve diğer her şey $ dizelere girmelidir" anlamına gelir. Bu işleve 2 veya daha fazla argüman iletebilirsiniz ve ikinci ve sonraki argümanlar kullanıma hazır olarak $ dizeler dizisine eklenecektir.
Bu yardımcı olur umarım!
[ve ile çevrelemekten kurtarır ]. Pek bir faydası yok ama bence güzel görünüyor.
function myFunc($foo, string ...$bar). Ardından $bar, işlevinize bir dizi dize verir ve başka hiçbir şey vermez, çalışma zamanında garanti edilir. Bunu tek bir dizi parametresiyle yapamazsınız.
function get_data($fname,$lname,$age)Bu üçü dışındaki alanların değişmesini istemiyorsanız function get_data(...$fields)değiştirmeniz gerekecektir, yalnızca istediğiniz alanları belirtmeniz gerekir $fields. @heykatieben
Her cevap aynı blog gönderisine atıfta bulunur, bunların yanı sıra, değişken uzunluklu argüman listeleri hakkında resmi belgeler :
http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list
PHP 5.6 ve sonrasında, bağımsız değişken listeleri, işlevin değişken sayıda bağımsız değişken kabul ettiğini belirtmek için ... belirtecini içerebilir. Argümanlar verilen değişkene bir dizi olarak aktarılacaktır.
Görünüşe göre "uyarılı" operatör resmi bir isim değil, yine de sevimli!
İçin İKİ kullanımları vardır üç nokta (...) PHP belirteci -Düşün bunlardan olarak ambalaj bir dizi ve açma dizisi. Her iki amaç da işlev bağımsız değişkenleri için geçerlidir.
paket
Bir işlevi tanımlarken, işleve sağlanan dinamik sayıda değişkene ihtiyacınız varsa (yani, kodda çağrıldığında bu işleve kaç argüman sağlanacağını bilmiyorsanız) üç nokta (...) simgesini kullanın. bu işleve sağlanan kalan tüm bağımsız değişkenleri işlev bloğu içinde erişilebilen bir dizide yakalar. Üç nokta (...) tarafından yakalanan dinamik bağımsız değişkenlerin sayısı sıfır veya daha fazla olabilir.
Örneğin :
// function definition
function sum(...$numbers) { // use ellipsis token when defining function
$acc = 0;
foreach ($numbers as $nn) {
$acc += $nn;
}
return $acc;
}
// call the function
echo sum(1, 2, 3, 4); // provide any number of arguments
> 10
// and again...
echo sum(1, 2, 3, 4, 5);
> 15
// and again...
echo sum();
> 0
İşlev somutlaştırmada paketleme kullanıldığında, üç nokta (...) kalan tüm bağımsız değişkenleri yakalar , yani hala herhangi bir sayıda ilk, sabit (konumsal) bağımsız değişkene sahip olabilirsiniz:
function sum($first, $second, ...$remaining_numbers) {
$acc = $first + $second;
foreach ($remaining_numbers as $nn) {
$acc += $nn;
}
return $acc;
}
// call the function
echo sum(1, 2); // provide at least two arguments
> 3
// and again...
echo sum(1, 2, 3, 4); // first two are assigned to fixed arguments, the rest get "packed"
> 10
açmak
Alternatif olarak, bir işlevi çağırırken, o işleve sağladığınız bağımsız değişkenler daha önce bir dizi halinde birleştirildiyse , diziyi işleve sağlanan bağımsız bağımsız değişkenlere dönüştürmek için üç nokta (...) simgesini kullanın — her dizi öğesi ilgili işlev tanımında belirtilen işlev bağımsız değişken değişkeni.
function add($aa, $bb, $cc) {
return $aa + $bb + $cc;
}
$arr = [1, 2, 3];
echo add(...$arr); // use ellipsis token when calling function
> 6
$first = 1;
$arr = [2, 3];
echo add($first, ...$arr); // used with positional arguments
> 6
$first = 1;
$arr = [2, 3, 4, 5]; // array can be "oversized"
echo add($first, ...$arr); // remaining elements are ignored
> 6
Paket açma, dizileri veya değişkenleri işlemek için dizi işlevlerini kullanırken özellikle yararlıdır .
Örneğin, array_slice sonucunun paketinden çıkarılması :
function echoTwo ($one, $two) {
echo "$one\n$two";
}
$steaks = array('ribeye', 'kc strip', 't-bone', 'sirloin', 'chuck');
// array_slice returns an array, but ellipsis unpacks it into function arguments
echoTwo(...array_slice($steaks, -2)); // return last two elements in array
> sirloin
> chuck
Bu özelliği kullanmak için PHP'yi, diziyi değişkenlere ayırmak için ... operator. Daha fazla ayrıntı için buraya bakın , basit bir örnek şöyle görünebilir:
$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";
mail("someone@example.com", ...$email);
Bunun anlamı, ilişkilendirilebilir bir diziyi bir listeye ayırmasıdır. Yani bir metodu çağırmak için N parametresi yazmanıza gerek yok, sadece bir tane. Yöntem ayrıştırılmış bir parametreye izin veriyorsa ve parametreler aynı türdeyse.
Benim için, splat operatörüyle ilgili en önemli şey, dizi parametrelerini yazmaya yardımcı olabilmesidir:
$items = [
new Item(),
new Item()
];
$collection = new ItemCollection();
$collection->add(...$items); // !
// what works as well:
// $collection->add(new Item());
// $collection->add(new Item(), new Item(), new Item()); // :(
class Item {};
class ItemCollection {
/**
* @var Item[]
*/
protected $items = [];
public function add(Item ...$items)
{
foreach ($items as &$item) {
$this->items[] = $item;
}
}
}
özellikle büyük koleksiyonlarla veya çok nesne yönelimli çalışırken, tür kontrolünde biraz çaba sarf eder.
Dikkat edilmesi ...$arraygereken önemli, bir diziyi, öğelerinin türüne rağmen ayrıştırmaktır , böylece çirkin bir şekilde de gidebilirsiniz:
function test(string $a, int $i) {
echo sprintf('%s way as well', $a);
if ($i === 1) {
echo('!');
}
}
$params = [
(string) 'Ugly',
(int) 1
];
test(...$params);
// Output:
// Ugly way as well!
Ama lütfen yapma.
Görünüşe göre kimse bundan bahsetmedi, bu yüzden burada kalmak için [Ayrıca, PHP'de Rest Parametreleri isteyen Google'a (ve Diğer SE'ler) kılavuz geliştiricilerine yardımcı olacaktır ]:
Burada belirtildiği gibi onun adı verilen istirahat Parametreler JS & O uyarısı şey üzerinde bu anlamlı adlandırmayı tercih!
PHP'de, ... args tarafından sağlanan işlevsellik işlevsellik , PHP5.6'da tanıtılan Variadic işlevler olarak adlandırılır . Aynı işlevsellik kullanılarak gerçekleştirildi func_get_args().
Düzgün kullanmak için, ortak kodun azaltılmasına yardımcı olduğu her yerde dinlenme parametreleri sözdizimini kullanmalısınız .
Bu işlecin, dinamik yapılandırılabilir parametrelerle (düşünülen XML yapılandırma dosyaları) nesneleri başlattığı Magento çerçevesinde bir kullanımını paylaşmak istiyorum.
createObjectFonksiyonu aşağıdaki kod parçacığından görebileceğimiz gibi , nesne oluşturma için hazırlanmış bir dizi argümanı alır. Daha sonra ...dizi değerlerini gerçek argümanlar olarak sınıfın yapıcısına iletmek için (üç nokta) operatörünü kullanır .
<?php
namespace Magento\Framework\ObjectManager\Factory;
abstract class AbstractFactory implements \Magento\Framework\ObjectManager\FactoryInterface
{
...
/**
* Create object
*
* @param string $type
* @param array $args
*
* @return object
* @throws RuntimeException
*/
protected function createObject($type, $args)
{
try {
return new $type(...array_values($args));
} catch (\TypeError $exception) {
...
}
}
...
}
PHP'de uyarlama veya dağılım operatörüdür
In PHP 7.4 üç nokta da Yayılması operatörü :
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];