PHP'de Üç noktanın (…) Anlamı


126

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 5.6'da sunulan dizi paketleme / paket açma
Mark Baker

Yüklemeden önce gereksinimleri kontrol ettiniz mi: devdocs.magento.com/guides/v2.0/install-gde/…
Mathieu de Lorimier

4
Sadece rastgele bir yorum, bu JS'deki yayılma operatörüdür. :)
Chris Happy

@ChrisHappy bu durumda aslında dinlenme operatörü .
Kenny Horna

Ayrıca bakınız: PHP
uyarlama

Yanıtlar:


193

...$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!


1
Teşekkürler :), neden SPLAT operatörünü kullanmalıyım, bunun yerine bir dizideki tüm bu dizeleri ikinci argüman olarak geçirebilirim ???
bikash.bilz

3
@ bikash.bilz Cevaplayan için konuşacağım: Sanırım bu sadece sözdizimsel şeker . Uyarlama operatörü sizi argümanları [ve ile çevrelemekten kurtarır ]. Pek bir faydası yok ama bence güzel görünüyor.
Kodos Johnson

20
Variadic parametreleri de yazabilirsiniz. Yani PHP 7.2'de tanımlayabilirsiniz 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.
Jason

4
Bu, sözdizimi şekerinden daha fazlasıdır, çünkü aksi takdirde sabit sayıda dizge gerektiren bağlamlarda bir diziye izin verir. Sabit sayıda dize kullanmak, dize sayısı her değiştiğinde kaynak kodunuzu yeniden faktörlendirmenizi gerektirir.
dreftymac

2
Kolay bir örnek, bir veritabanını sorgulamak için kullanılan bir işlev imzasıdır. 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
dreftymac

21

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!


13

İç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.

Örneğin:

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

4
Bu en iyi cevap. Çok net açıklama ve örnekler. Teşekkür ederim!!!
Jee

Unpack, Doctrine'in OrX işlevi için süper kullanışlıdır
Erdal G.

5

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);

4

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.


O kadar çirkin değil. Doctrine'in bir listeye ihtiyaç duyan OrX işlevlerinde olduğu gibi, ancak bir diziyi geçmeniz gerekir (çünkü kaç öğe geçireceğinizi bilmiyorsunuz). Bu yolu call_user_func_array kullanmaktan daha iyi buluyorum
Erdal G.

3

Bu sözde "uyarılı" operatördür. Temelde bu şey "herhangi bir sayıda argümana" çevrilir; PHP 5.6 ile kullanıma sunuldu

Daha fazla ayrıntı için buraya bakın.


3

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 .


1
artı Google'a PHP'de Rest Parametresini bulmada yardımcı olmak için bir tane
kapreski

1

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) {
            ...
        }
    }

    ...

}


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.