php işlevi varlığı kontrolü. isset() ve array_key_exists() işlevlerini kullanma. PHP'de değişken başlatma ve silme

  • 20.06.2020

Sınıflar, varlığı harici bir geliştirici için açık olmayan dinamik yöntemler içerebilir. Ayrıca, işlem sırasında çeşitli yöntemler içerebilen heterojen nesne dizileri oluşturulabilir. Bu gibi durumlarda, bir sınıftaki bir yöntemin varlığını kontrol etmek için araçlara ihtiyacınız vardır. PHP'nin "method_exists()" işlevi böyle bir araçtır.

İşlev, ilk parametre olarak sınıf veya nesnenin adını, ikinci parametre olarak yöntemin adını alır ve nesne veya sınıf bu yönteme sahipse "true", değilse "false" döndürür.

"method_exists()" fonksiyonunun nasıl çalıştığını gösterelim ve public ve private olmak üzere iki metot içeren bir "myExists" sınıfı oluşturalım.

Sınıf myExists ( public function method_public() ( echo "Genel yöntem"; ) özel işlev method_private() ( echo "Özel yöntem"; ) ) $_Class_myExists = new myExists(); if(method_exists($_Class_myExists, "method_public")) ( echo "

"method_public" yöntemi mevcut
"; ) if(method_exists($_Class_myExists, "method_private")) ( echo "
"method_private" yöntemi var
"; ) if(method_exists($_Class_myExists, "method_protected")) ( echo "
"method_protected" yöntemi mevcut
"; ) başka ( yankı "
'method_protected' yöntemi mevcut değil
"; }

Örnekte, "myExists" sınıf nesnesindeki "method_exists()" işlevini kullanarak, mevcut "method_public()", "method_private()" yöntemlerinin ve var olmayan "method_protected()" yönteminin varlığını kontrol eder. . Sonuç:

"method_public" yöntemi var "method_private" yöntemi var "method_protected" yöntemi yok

Kontrolün sonucundan da görebileceğiniz gibi, işlev, erişim belirtecinden bağımsız olarak yöntemlerin her biri için "true" değerini döndürür, "false" yalnızca nesnenin o ada sahip ne özel ne de genel bir yöntemi yoksa döndürülür.

"method_exists()" işlevinin ilk argümanı "$_Class_myExists" sınıfının bir nesnesidir, ancak yöntemi test etmek için bir nesne oluşturmak gerekli değildir, sınıf adını geçmek yeterlidir. Örnek:

Method_exists("myExists", "method_public");

"method_exists()" işleviyle çalışırken, "__call()", "__callStatic()" özel yöntemi kullanılarak oluşturulan dinamik yöntemlerin varlığını belirleyemeyeceğini unutmayın.

"method_exists()" işlevine ek olarak, "method_exists()"in aksine, sınıf yöntemini kontrol etmenin yanı sıra, bir işlevin varlığını kontrol etmenizi sağlayan alternatif "is_callable()" işlevini de kullanabilirsiniz. sınıfın bir parçası değildir.

Üçüncü taraf bir sınıfla çalışan geliştirici genellikle bu sınıfın tüm yöntemlerini tam olarak bilmez. Bunların tam listesini almak için "get_class_methods()" işlevini kullanabilirsiniz. İşlev, ilk parametre olarak sınıf adını alır ve genel yöntemlerinin bir dizisini döndürür. Özel yöntemlerin bu işlev tarafından döndürülmediği vurgulanmalıdır. Örnek:

$_all_pulic_method = get_class_methods($_Class_myExists); Eko "

"; print_r($_all_pulic_method); echo "
";

Sonuç:

Dizi ( => method_public)

Gördüğünüz gibi, "method_private()" özel yöntemi, sonuçta ortaya çıkan diziye dahil edilmedi. "__call()", "__callStatic()" özel yöntemi kullanılarak öykünülen dinamik yöntemler de "get_class_methods()" işlevi kullanılarak elde edilen listeye dahil edilmez.


Çinli bir çevrimiçi mağaza motorunda isset() işlevinin yanlış kullanımı nedeniyle karşılaştığım bir sorundan ilham aldım. Orada, bazı anahtarlarla bir dizi öğesinin varlığını belirlemek için isset() kullanıldı. Bu durumdaki en tatsız şey, birçok insanın bu hatayı yapmasıdır. Bu temelde yanlış olsa da, bu bağlamda isset() ilk kez kullanılmamaktadır. Ama bu sefer geliştiricilerin cehaletleri bana kayıp zamana mal oldu ve bu da beni bu yazıyı yazmaya itti.

Öfkeme şaşıran “bilinmeyen” bir tanıdığın yorumlarından daha da “memnun oldum”. Array_key_exists() işlevinin varlığı hakkında bir şeyler duymuş, ancak bunu kendisi hiç kullanmamıştı. Ayrıca, bir yerde isset() ile değiştirmenin daha iyi olduğunu okudum, çünkü ikincisi daha hızlı.

Aslında PHP programcılarının beceri seviyesi hakkında çok şey söylendi ve buna eklenecek bir şey yok.

PHP'de değişken başlatma ve silme

PHP'de, bir değişkene bir değer atandığı anda başlatılır. Bir değişken iki durumda başlatılmamış olarak kabul edilir:

  • ona hiçbir değer atanmamıştır;
  • boş bir değere atanmış veya unset() işlevine iletilmiştir.

Bir değere NULL atamak, unset() işlevine benzer bir değişkeni siler, yani onu başlatılmamış hale getirir.

unset() ile kaldırılmış bir değişkeni kullanmayı denerseniz, E_NOTICE düzeyinde bir hata üretilecektir. NULL'a bir değişken dökümü ile bu olmayacak.

isset() işlevi

İşlev, değişkenin başlatılıp başlatılmadığını kontrol eder. parametre olarak başlatılmamış bir değişken iletirseniz isset() false döndürür. Aynısı, NULL değeri olan dizi anahtarı için de olacaktır. Dizi anahtarları, değişkenlerle aynı geçersiz kılma kurallarına tabidir.

$nullVar = boş; var_dump($nullVar); $dizi = array("key_str" => "foo", "key_null" => null, "key_int" => 1); var_dump($dizi);

Sonuç:

hükümsüz dizi"key_str" => "foo" dizesi (uzunluk=3)"key_null" => null "key_int" => int 1

array_key_exists() işlevi

array_key_exists() işlevi isset() işlevine benzer, tek fark NULL değerine sahip bir anahtar için bile DOĞRU döndürülecek olmasıdır.

$dizi = array("key_str" => "foo", "key_null" => null, "key_int" => 1); var_dump(array_key_exists("key_null", $dizi)); // boole değerini doğru döndür

Bir anahtar/değer çiftini tamamen kaldırmak için unset() kullanmanız gerekir.

Bir dizi için, anahtarın varlığının korunması gerekiyorsa, bir NULL anahtar değeri kullanmak uygundur. Bu anahtarın kullanılacağı bağlama güvenmek mümkün olacaktır. Örneğin, bu, form alanlarını varsayılan değerlerle doldururken kullanışlıdır. Örneğin, yankı yapısını kullanırken, boş bir dizgeye bir NULL değeri atılacaktır.

Aldığım şey bana açık görünüyor. Dizi tuşlarıyla çalışıyorsanız, tam olarak bunun için tasarlanmış işlevi kullanın. Ayrıca array_key_exists() kullanmak, uygulamanın mantığını doğru bir şekilde anlamanızı sağlar. Belirsizlik oluşmaz.

isset() ve array_key_exists() hızı

array_key_exists() öğesinin isset()'ten daha yavaş olduğu gerçeği, PHP kılavuzunun ilgili sayfasındaki yorumlarda bile yazılmıştır. 200'den fazla anahtar/değer çifti içeren dizilerde array_key_exists() öğesinin daha yavaş olduğundan şikayet eder.

Banal bir test yapmaktan başka bir şey kalmadı:

$testArray = dizi(883209 => 568420, 553314 => 266114, 133088 => 367615, // ...); $timerStart = mikrozaman(); için ($i = 0; $i

$testArray ilişkisel dizisi şunları içerir: 10.000 ürün. Bu bahsedilenlerden daha fazladır. 200 .

Ardından, döngüyü miktarla çalıştırıyoruz yineleme 100.000. Döngünün gövdesinde, önce isset() ile sonra array_key_exists() ile kontrol ederiz. Varlığını kontrol ettiğimiz anahtar, dizide bulunma olasılığını en aza indirmek için rastgele oluşturulur.

/>
isset() array_key_exists()
0.687027 0.728652

Test, elbette, çok basit ve oldukça özneldir. Örneğin, kullanılan hafızanın ölçümlerini almak güzel olurdu. Ancak bu testin sonuçlarına baktığımda, fare telaşına girmeye devam etmek gibi bir arzum yok. Açıkçası, hızda hiçbir kazanç yoktur.

isset() işlevi ve nesne özellikleri

Dizilerde olduğu kadar yaygın değil, ancak şu koşulları karşılıyor:

Sınıf Foo ( genel $özellik = boş; genel işlev __construct() ( ) ) $nesne = yeni Foo(); if (!isset($object->property)) ( echo "özellik yok"; )

Özelliklerin varsayılan değeri olarak NULL kullanmak çok yaygın bir uygulama olduğundan, durum korkunç. Ve bir nesne özelliğinin varlığını isset() aracılığıyla kontrol etmek kesinlikle kabul edilemez.

Bir nesnede bir özelliğin olup olmadığını kontrol etmek için PHP, property_exists() işlevine sahiptir. array_key_exists() gibi, property_exists(), özellik değeri NULL'a dönüştürülse bile DOĞRU döndürür.

Ayrıca property_exists() kullanımının bir sınıf nesnesinin varlığını gerektirmediğine dikkat edin. Doğrulama, sınıf adı ve özellik adı ile yapılabilir.

Foo Sınıfı ( public $property = null; public function __construct() ( ) ) var_dump(property_exists("Foo", "property")); // true döndür

Bu biraz eğlenceli bir programlama.

Örneğin, dosyayla daha sonra bazı eylemler gerçekleştirmek için belirtilen dosyanın var olup olmadığını kontrol etmeniz gereken durumlar vardır.

Modülü geliştirirken de bu sorunla karşılaştım. Ve soruna iki çözüm buldum.

URL'ye göre bir dosyanın varlığını kontrol etme

PHP'de bir işlev var " fopen”, belirtilen URL'yi açabilir.

Biz ne yapıyoruz? Dosyayı açmaya çalışıyoruz ve başarılı olursak dosya var, yoksa dosya yok.

Uygulama:

Ama ya bir dosyamız değil, tabiri caizse birkaç bağlantımız varsa? Bu tam olarak başlangıçta önümde olan görevdi. Ve bu sorunun çözümü şudur:

Bu durumda, yalnızca var olan dosyaların bir listesini alırız.

Yerel Dosya Varlığını Kontrol Etme

"Yerel" kelimesi, komut dosyasının ve kontrol edilecek dosyaların aynı sunucuda bulunduğu anlamına gelir. Oldukça geniş bir bağlantı diziniz varsa, bu seçenek sorunu çözmek için en iyisidir, çünkü üçüncü taraf bir sunucuya istekte bulunmayız, ancak belirtilen dizinleri tararız.

Bu yöntem "file_exists" işlevini kullanır ve önceki sürüme benzer şekilde komut dosyasının bir kısmını değiştirir:

Ve bağlantı dizisi için aynı:

değeri nedir Not? Bu yöntemin dosya sistemimizdeki dosyaları çalıştırmak için uygun olduğunu. Bu nedenle, tüm bağlantıların göreceli olarak belirtilmesi arzu edilir.

Bu arada, siparişlerden birini verirken sadece birkaç saniyede yaklaşık 135.000 dosyayı taramayı başardım.