Soru PHP - foreach / for, foreach, for - kaşlı ayraçlar olmadan mı?


Gerçekten bilmek istediği ama asla öğrenilemeyen bir şey PHP’de kısayollar.

Şu anda bir fonksiyon ile kodlama yapıyorum foreach İçinde sadece tek bir açıklama ile döngü. Küme parantezlerini / else kontrol yapılarında yapabileceğiniz gibi çıkarmaya çalıştım ve işe yarıyor. Hata yok.

foreach($var as $value)
    $arr[] = $value;

Şimdi aynı şekilde kullanmaya çalıştım ama içinde bir if / else bloğu koyuyorum. Yine, çalışma ve hata yok.

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

Sonra, "neden bu çalışıyor?" Diye düşündüm. ve kapanış noktalı virgülü çıkarıldı. Hala çalışıyor. Bu yüzden for / else ifadesini foreach döngüsünün içinde kaşlı ayraçlar olmadan kullanmaya çalıştım ve yine hala çalışıyor ve hata yapmam. Ama foreach döngüsü şu an gerçekten kapalı / bitmiş mi?

foreach($var as $value)
    if(1 + 1 == 2)
        $arr[] = $value;

En azından kapanış noktalı virgülü tekrar atladı ve (beklendiği gibi) bir ayrıştırma hatası oluştu.

Öyleyse benim büyük sorum şu: Küme parantezini ve hangi yapı / döngü / işlevi ne zaman atabilirim? Bunu kesinlikle yapabileceğimi biliyorum. if ve else. Ama ne hakkında while, for ve foreach?

Ve evet, güvenli olmadığını biliyorum, akıllı, kaşlı ayraçsız kod ne olursa olsun ve kestirme gibi $condition ? true : false; ve if: doSomething(); endif;, endfor; ve endforeach;. Kestirmeler hakkında bilgi edinmek istemiyorum. Sadece küme parantezlerini atmanın ne zaman ve nerede mümkün olabileceğini anlamak istiyorum.


44
2018-01-04 11:45


Menşei


Bu arada, bir kapanış ayracından sonra bir noktalı virgül koymak gerekli değildir. Bunun sözdizimsel anlamı, aralarında boş bir ifade eklemektir. Bu açıklamaları hariç, tüm C gibi diller için geçerlidir. struct ve classC ve C ++ - Eric
Kıvırcıkların ne zaman atlanabileceğini anlamak için ifadeler ve ifadeler arasındaki farkı öğrenmelisiniz. Ve sonra, güçlü bir ifade uyumu anlayışı hala gereklidir. - mario


Cevaplar:


Diş tellerini çıkardığınızda, yalnızca sonraki ifadeyi koşulun gövdesi olarak ele alır.

if ($x) echo 'foo';

aynıdır

if ($x) { echo 'foo'; }

ama şunu unutma

if ($x)
  echo 'foo';
  echo 'bar';

irade her zaman "bar" yazdır

İçten içe başka bir yol var: if sadece bir sonraki ifadeye bakacak, ama PHP her şeyi {} tek bir "gruplandırılmış" ifade olarak.

Diğer kontrol ifadeleri için de aynı (foreach, ve bunun gibi)


75
2018-01-04 11:48



Çok güzel ve kısa bir açıklama, teşekkürler! :) Her kontrol yapısı üzerinde çalışıyor mu? - headacheCoder
Olması gerekiyor. şu anda hakkında ne bilmiyorum (ve test edemiyorum) do{}while($X);veya "geçiş". - KingCrunch
@headacheCoder Evet, bunun için çalışıyor for, while, foreach ve if. Ayrıca C-benzeri bir sözdizimi olan her dil için de böyle. Tkone'un cevabını, her zaman diş tellerini kullanmak için nasıl İyi Uygulama olduğunu not edin. - Eric
@headacheCoder: Hatta her ifadeyle çalışıyor, gör php.net/expressions . - hakre
Bir istisna var; ile çalışmıyor İstisnalar. Pun tamamen amaçlanmış. - Francisco Presencia


Yapabileceğin yerler var, ama asla yapmamalısın.

Açık her zaman örtük olmaktan iyidir.

Geriye dönmek ve eski kodu değiştirmek zorunda kalacağınızı kim bilir. Bu şeyleri kaçırmak çok kolay ve bunu yaparak kazanılan hiçbir şey yok.


25
2018-01-04 11:51





İçinde sadece bir argüman varsa iyi çalışır! Ancak kaşlı ayracı atlamak istiyorsanız, kolon ve son kullanabilirsiniz. örnek:

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;

10
2018-01-04 12:46





Kısacası hakkında öğrenmek istemediğini söylediğin gibi ve kabul edilen cevap, ihmal hakkında iyi bir örnek verir curly bracesama ekleyecek bir şey var. Gördüğünüz gibi atlamak güzel curly braces durumunda if ($x) echo 'foo';. Kodda, performansta veya başka sorunlarda yanlış bir şey yoktur ve diğer geliştiriciler tarafından okunabilir. Ve örnek olarak eğer yazarsanız

if ($x)
    echo 'foo';
    echo 'bar';

yerine

if ($x)
    echo 'foo';

echo 'bar';

İstenmeyen sonuçlarla karşılaşabilirsiniz. bar yazdırılmasını istemediğiniz halde yazdırılır ve kodunuz bu ifadelerle doluysa, kendi kodunuzu okumanız ve başkalarının okuması için daha da zorlaştırır.

Kestirme hakkında öğrenmek istemiyorum, sadece küme parantezlerini atmanın ne zaman ve nerede mümkün olabileceğini anlamak istiyorum.

Bu şeyler yakından ilişkilidir, eğer gerçekten küme parantezlerini atlamanın mümkün olduğunu anlamak istiyorsanız, o zaman ya da en azından kısa yoldan haberdar olmanızın bir zorunluluk olması gerekir.

  1. PHP Kontrol Yapıları
  2. PHP üçlü koşullu operatörler ve genel ifadeler

Öyleyse benim büyük sorum şu: Küme parantezini ve hangi yapı / döngü / işlevi ne zaman atabilirim?

Ancak okunabilirlik ve bakım için kaşlı ayraç gerekli değildir, birçok geliştirici bunları içermemesine kötü bir stil düşünür. Önceki 2 linkler, kaşlı ayraçları atladığınızda kendi kararlarınızı vermeniz için gereken bilgileri size vermelidir. Örneğin, hepsi aynı şeyi yapan aşağıdaki kod parçacıkları ile ilgili bir sorun yoktur.

Kaşlı ayraç ile

if (PHP_VERSION_ID < 70000)
{
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
}

İle aynı 

if (PHP_VERSION_ID < 70000) :
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
endif;

Ya da nokta operatörünü kullanabilirsiniz

if (PHP_VERSION_ID < 80000)
    (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

Ve üçlü koşullu operatörü kullanabilir ve hatta ihmal edebilirsiniz. if kıtık kaşlı ayraçları ihmal etmeden

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

Sadece yazdırdığımızdan beri bunu kısaltabilir ve biraz print string functions küme parantez olmadan ifade birden fazla işlevi temsil etmek için buradaydı

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1);

Php 7'den itibaren Null coletcing operatörünü kullanabiliriz

(PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "\n") . exit(1);

Tam olarak aynı sonucu alabileceğiniz birçok yol olduğunu görebilirsiniz. Bu sadece bunun için geçerli değil if örnek ama aynı ile uygulanabilir structure/loop/function. Yani senin için hiç kimse yok büyük soru. Biri esas olarak takip etmelidir.

  1. Yazmakta olduğunuz kodun bakımı kolay mı.
  2. Kendin için cevap verebilir misin, kaşlı ayraçları atlayarak kazanmış bir şey var.

5
2018-01-25 20:04



Hmm, Elvis operatörüne boş bir birleştirici operatör eklediklerini bilmiyordum ... temiz. Ancak, operatörün hangi tarafı boş ve koşullu blokta değişken olmayan değişkenlere izin veriyor mu? - Ber
$I_want_value = $if_im_not_null_use_me ?? $if_first_is_null_use_me ?? $if_second_is_null_use_me; Yani önceki değişkenin NULL olması durumunda sizin kadar çok alternatifiniz olabilir; PHP 7 Yeni özellikler - M.Kungla
İlginç, bu yüzden bir infense operatör ... ama tanımlanmamış değişkenler üzerinde çalışıyor mu? Doktora bakacağım. Bence bu, boş bir birleştirme operatörüne sahip olmanın tek amacıdır, aksi halde sadece Elvis'i kullanmaz. ? :) - Ber
Ah Bu yüzden, ?? belirsiz değişkenler üzerinde çalışır, diyor docs. olağanüstü! Bu, PHP'deki isset () çağrılarının büyük yığınını azaltabilir. - Ber


PHP şablonumda kaşlı ayraçları ihmal ediyorum. Örneğin. döngüler aşağıdaki gibi kullanabilirsiniz:

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>

3
2018-01-04 11:51



alternatif sözdizimi farklı bir şeydir. - KingCrunch
OP bile alternatif sözdizimini bildiğini ve sorunun ne hakkında olduğunu söylemedi. - CommandZ


Basit şeyler için kullanabilirsiniz:

if($a === true) continue;

Ancak bazı daha karmaşık alt koşullar için sorunlara neden olabilir:

    $a = false;
    $b = false;
    if ($a === true)
        if ($b === true)
            echo 1;
    else
        echo 2;

Yukarıdaki kodla, çıktı olarak "2" yi görmeyi beklersiniz, ancak yapmayacaksınız.


2
2018-05-21 08:03





Tek satırlı ifadeler için.

Yapmaya çalıştıysanız

foreach($array as $x => $y)
    $do_something = $x;
    $do_something_else = $y;

Yanlış anlaşılmadığı sürece php yorumlayıcısı, foreach ifadesinin altında ikinci satırı ima edilen parantezlerin dışına çıkaracaktır.

Girintiye bağlı olarak, daha sonra bu koda geri geldiyseniz ya da başka bir geliştirici işinize baktığınızda kafa karıştırıcı olurdu.

Bu nedenle, bu ifadelerle her zaman parantez kullanmak genellikle akıllıca olur. Daha sonra baş ağrısını / karışıklığını koruyacaktır.


1
2018-01-04 11:49



Haklısın. İkinci satır, döngünün içinde değil. Sadece bir sonraki ifade. - CommandZ


Tamamlamak için @MarkoCevap, bu konu için nokta operatörü kullanırken, parantez içinde her işlemi kapatmalısınız, aksi takdirde siparişi tersine çevireceğini unutmayın.

Örneğin, aşağıdaki kod yazdırılacak PHP >= 7.0 required yours is 5.6.15.

(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n");

Bu basılırken 5.6.151PHP >= 7.0 required yours is 1.

print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("\n");

Ayrıca kullanabilirsiniz and Bunun çalışması için operatör. Öyle:

if (PHP_VERSION_ID < 70000)
    print("PHP >= 7.0 required yours is ") and
    print(phpversion()) and
    print("\n");

1
2017-07-31 18:02





Maddenin ardından yalnızca bir ifadeniz olduğunda mümkündür.

Örneğin,

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

doğru ama

foreach($var as $value)
    $somevar = $var;
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

değil ve php yorumlayıcı bunu düşünecek if deyim dışarıda foreach


0
2018-01-04 11:48





Cevap çok kolay. Bu C / C ++ 'da aynıdır.

eğer / else, / else if / else ve loops => Eğer bir sonraki ifade tek bir satır ise, kaşlı ayraçları atlayabilirsiniz.

Ör:

for($i= 0; $i<=100; $i++)
{
    if($i % 7 == 0)
    {   
        echo $i . "<br>";
    }

}

Bu şekilde de yazılabilir:

for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>";

0
2018-04-21 10:46