PHP Gizli Özellikleri? [kapalı]


174

Bunun kulağa fena bir soru gibi geldiğini biliyorum ama nereden geldiğimi açıklayayım.

Kolej dışında bir PHP dükkanında iş buldum. Orada bir buçuk yıl çalıştım ve programlama hakkında öğrenilecek her şeyi öğrendiğimi düşündüm.

Sonra tüm çalışmaların C # olduğu büyük bir şirkette tek kişilik bir iç geliştirme dükkanı olarak iş buldum. Pozisyona olan bağlılığımda, bir sürü blog ve kitap okumaya başladım ve her şeyi bildiğimi düşünmenin ne kadar yanlış olduğumu çabucak anladım. Birim testi, bağımlılık enjeksiyonu ve dekoratör kalıpları, gevşek bağlantının tasarım prensibi, kalıtım tartışması üzerine kompozisyon, vb. Söylemeye gerek yok, programlama tarzım geçen yıl tamamen değişti.

Şimdi kendimi bir arkadaşımın start-up için bazı kodlama yaparken bir php proje almak bulmak ve C # programlama aksine tamamen kısıtlı hissediyorum. Sınıf kapsamındaki tüm değişkenlere '$ this->' eklenerek atıfta bulunulması beni gerçekten rahatsız ediyor. Denediğim IDE'lerin hiçbirinin çok iyi bir zekâya sahip olmadıkları ve SimpleTest birim test yöntemlerimin 'test' kelimesiyle başlaması beni rahatsız ediyor. Dinamik yazmanın, bir yöntemin hangi parametre türünün beklediğini örtük olarak belirtmemi ve yöntem aşırı yüklemeleri yapmak için bir switch deyimi yazmamı engellediğinden beni deli ediyor. Yuvalanmış ad alanlarına sahip olamayacağınızı ve temel sınıfın yapıcısını çağırmak için :: operatörünü kullanmanız gerektiğini söyleyemem.

Şimdi bir PHP vs C # tartışma başlatmak niyetinde değil, demek istediğim, ben ya bilmiyorum ya da hakkında henüz bilmiyorum bazı PHP özellikleri olduğunu eminim ki düzgün kullanmak başarısız. Benim C # evrende ve cam kase dışında görmekte sorun yaşıyorum.

Bu yüzden soruyorum, PHP'nin en sevdiğiniz özellikleri nelerdir? .Net dillerinde yapamayacağınız veya daha zorlayabileceğiniz şeyler nelerdir?


Kırık OO paradigması mı? Benim için keşfettiğin en kötü "gizli" özellik.
knoopx

Bu konu biraz komik ... Çünkü ben takım için "gizli özellik" ile çalışmak "hata" anlamına gelen bir kod ifade olduğunu. Ve biliyor musunuz ... Bazen gizli bir özelliği keşfetmek her zaman iyi bir şey değildir ...
Ganesh Shankar

@Ganesh bir adamın hatası başka bir adamın gizli özelliği ...
Xeoncross

Yanıtlar:


328

Belgeler . Dokümantasyon Oyumu alır. Bir programlama dili için daha kapsamlı bir çevrimiçi dokümantasyonla karşılaşmadım - çeşitli web sitelerinden ve man sayfalarından bir araya getirmem gereken her şey.


60
Katılıyorum. Www.php.net/function_name yazabilmek ve çoğu zaman referans alabilmek harika.
Allain Lalonde

1
Bu PHP'nin büyük bir özelliğidir, ancak gerçekten gizli olarak adlandırmazdım ... Eğer yöntem parametreleri, vb için googled olsaydınız, php.net de sona ererdi.
John Bubriski

27
Ben de katılıyorum. Kılavuz hakkında en büyük şey kullanıcı yorumlarıdır. Diğer belgelerin bunlara sahip olduğunu nadiren gördüm. Gerçek taşlar içerebilirler. Tek dezavantajı IMHO onlar çok kısa bir budama olduğunu.
Sander Marechal

3
@Phoexo "biraz daha az okunabilir" ??? PHP belgeleri kolay ve anlaşılırken asla anlamadım ve MSDN'i asla anlamayacağım.
lauriys

3
Katılmıyorum. Dokümantasyonun "iyi" olmasının tek nedeni, bazı kullanıcı açıklamalarının resmi notlardaki tüm delikleri tıklamasıdır.
Rob Howard

179

Diziler . Bu sorunun cevabından yola çıkarak insanların PHP'deki Dizilerin ne kadar kolay ve kullanışlı olduğunu tam olarak takdir ettiklerini sanmıyorum. PHP Dizileri aynı anda listeler, haritalar, yığınlar ve genel veri yapıları gibi davranır. Diziler dil çekirdeğinde uygulanır ve her yerde kullanılır ve bu da CPU önbellek konumunun iyi olmasını sağlar. Perl ve Python, listeler ve haritalar için ayrı dil yapıları kullanır ve bu da daha fazla kopyalamaya ve potansiyel olarak kafa karıştırıcı dönüşümlere neden olur.


11
PHP dizi elemanları sıralanır.
user8134

117
PHP'den C # 'a ilk hamle beni neredeyse öldürdü. C # 'da, diziler yalnızca statik boyut ve sayısal dizin içeren basit bir yapıdır. PHP'de, diziler evrenin koli bandıdır!
Dinah

4
Ben de katılıyorum. Uni ataması için Java ile oynarken, ne kadar katı olduklarına şaşırdım, hiç esneklik yoktu. Gerçekten bana PHP dizilerinin ne kadar iyi olduğunu takdir etti.
Christian

11
Ben php dizileri büyük eminim, ama C # dizileri vurur yorum 40 oy? Bir C # dizisi ihtiyaca uymuyorsa, birçok seçenek vardır. ArrayList ve genel koleksiyonlar çok güçlüdür. Özel ihtiyaçlar için çok sayıda koleksiyon vardır. Bu konuda php tek gerçek avantajı hangi bir programcı karar gerekir herhangi bir seçenek sağlamaz olmasıdır. Dizi kullanırsınız veya dizine eklenebilen bir değişkeniniz yoktur.
G-Wiz

24
Öte yandan, diziler için sözdizimi tamamen berbat. Pek çok yazılım dilinde size gibi pek basit bir 2D dizi oluşturabilirsiniz: [[1, 2], [3, 4]]PHP sürümüne karşılaştıralım: array(array(1, 2), array(3, 4)).
Rene Saarsoo

167

Akış İşleyicileri , bildiğim kadarıyla diğer birçok dilde yapmanın oldukça zor olduğu mantığıyla "Dosya Sistemi" ni genişletmenize izin verir.

Örneğin, MS-Excel Stream işleyicisiyle bir MS Excel dosyasını aşağıdaki şekilde oluşturabilirsiniz:

$fp = fopen("xlsfile://tmp/test.xls", "wb");
if (!is_resource($fp)) { 
    die("Cannot open excel file");
}

$data= array(
    array("Name" => "Bob Loblaw", "Age" => 50),  
    array("Name" => "Popo Jijo", "Age" => 75),  
    array("Name" => "Tiny Tim", "Age" => 90)
); 

fwrite($fp, serialize($data));
fclose($fp);

KIO çerçevesinin bunu yapmanıza izin verdiğine inanıyorum, ancak bu sadece KDE tabanlı masaüstü uygulamaları için kullanılabilir.
MiffTheFox

21
Doğru bir OO yaklaşımına sahip olan IMHO, akış işleyicilerinde bu karmaşadan çok daha mantıklı olacaktır. Evet, Excel dosyalarını okuyabilmek / yazabilmek hoş, ama böyle çalışması gerekiyor mu?
Anti Veeranna

3
Belki öyleyse de, bu yaklaşım, çoğu PHP geliştiricisi için ortak olan bir arayüzde karmaşıklığı kapsar ... onların ötesinde olabilecek Nesne Tabanlı kavramları öğrenmelerini gerektirmeden.
Allain Lalonde

13
Amazon S3 ile çalışıyorsanız, 's3: // {bucket-name} / path' gibi URL'ler için bir akış arayüzü sağlayan Zend_Amazon_S3'e göz atın.
davidtbernal

Ben sadece PHP dosyasını okuyarak, bazı dize değiştirme yaparak ve eval () geçerek görünüm katmanım için basit bir DSL oluşturmak için kullandım. Örneğin, her ne zaman seçtiğim ve @ -> someVar yaptığımda kısa etiketleri kullanabileceğim şekilde yaptım, böylece görünüm düzeyindeki verilere erişebiliyorum.
Jasper Bekkers

131

Sihirli Yöntemler , var olmayan bir yöntemi her çağırdığınızda veya var olmayan bir özelliği atadığınızda veya okuduğunuzda çağrılan düşme yöntemleridir.

interface AllMagicMethods {
    // accessing undefined or invisible (e.g. private) properties
    public function __get($fieldName);
    public function __set($fieldName, $value);
    public function __isset($fieldName);
    public function __unset($fieldName);

    // calling undefined or invisible (e.g. private) methods
    public function __call($funcName, $args);
    public static function __callStatic($funcName, $args); // as of PHP 5.3

    // on serialize() / unserialize()
    public function __sleep();
    public function __wakeup();

    // conversion to string (e.g. with (string) $obj, echo $obj, strlen($obj), ...)
    public function __toString();

    // calling the object like a function (e.g. $obj($arg, $arg2))
    public function __invoke($arguments, $...);

    // called on var_export()
    public static function __set_state($array);
}

Bir C ++ geliştirici burada PHP, örneğin bazı operatörler aşırı yükleme izin verdiğini, fark edebilirsiniz ()ya (string). Aslında PHP daha fazla aşırı yüklemeye izin verir, örneğin []operatör ( ArrayAccess ), foreachdil yapısı ( Iterator ve IteratorAggregate ) ve countfonksiyon ( Sayılabilir ).


4
Sihirli yöntemlerle neler yapılabileceğinin yararlı bir örneği olarak phpcodetips.blogspot.com/2008/07/domain-model-validation.html
grom

6
Katılmıyorum. Smalltalk, Ruby & Python'daki benzer tesislerden çok daha zayıftır (ve muhtemelen bunlardan birinden kopyalanmıştır)
finnw

34
PHP'nin bu işlevselliği uygulamasının diğer dillerden daha zayıf olması, PHP'de daha az kullanışlı olmasını sağlamaz.
Allain Lalonde

2
__call()map domain.com/controller/method/ ile çerçeve içinde harika
alex

7
Büyü yöntemleri de cehennem kadar yavaştır. Dikkatlice kullanın.
Alex Weinstein

95

standart sınıf düzgün bir kaptır. Sadece son zamanlarda öğrendim.

Sunum niteliklerini tutmak için bir dizi kullanmak yerine

$person = array();
$person['name'] = 'bob';
$person['age'] = 5;

Standart bir sınıf kullanabilirsiniz

$person = new stdClass();
$person->name = 'bob';
$person->age = 5;

Bu, özellikle bu değişkenleri bir dizede erişirken yardımcı olur

$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";

43
"{$ person ['name']}, {$ person ['age']} yaşında" çalışıyor.
Kornel

27
"kişi [isim] $ kişi [yaş] yaşında" da çalışır ... Tırnak yok, diş teli yok :)
majelbstoat

16
$ string = sprintf ("% s% d yaşında.", $ person ['name'], $ person ['age']);
Daniel Sloof

60
Konudayken: (object) dizisi ("name" => 'bob', 'age' => 5)
Annika Backstrom

30
@majelbstoat: Tırnakları çıkarmak betiği yavaşlatır çünkü PHP yorumlayıcısı 'name' ve 'age' nin define (...) ile ayarlanıp ayarlanmadığını görecektir. Ayrıca, her durumda erişilen anahtarları tamamen çevirmenin mümkün olacağını düşünmek de kötü bir uygulamadır: define ('age', 'name'); ( 'adı', 'yaş') tanımlar;
brianreavis

90

Dosyaları dahil et, bir değişkene atayabileceğiniz bir dönüş değerine sahip olabilir.

// config.php
return array(
    'db' => array(
        'host' => 'example.org',
        'user' => 'usr',
        // ...
    ),
    // ...
);

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org

@Peter ÇOK db- > localhost istisna hata işleme için yararlıdır.
Talvi Watia

Hızlı ve kirli bir yapılandırma dosyası oluşturmak için uygundur.
Frank Farmer

Bu diziyi neden geri veriyorsunuz? Eklenen bir dosya bir diziyi içeriyorsa, içerme sırasında hemen kullanılabilir.
fabrik

5
@fabrik çünkü global değişken olacak ve tüm ana kapsamda mevcut olacaktı. Bu oldukça tatsız, bu çok daha iyi.
Mikulas Dite

Yii çerçevesinde bir proje üzerinde çalıştı ve bu proje dizisi böyle döndürüldü yapılandırma dosyası var, şimdi neden dosya böyle olduğunu anlıyorum.
Simer Twilio Toronto geliştiricisi

83

Sen aslında yararlanabilirsiniz oroperatör daha düşük önceliğe sahiptir =bunun için:

$page = (int) @$_GET['page'] 
  or $page = 1;

İlk atamanın değeri olarak değerlendirilirse true, ikinci atama dikkate alınmaz. Başka bir örnek:

$record = get_record($id) 
  or throw new Exception("...");

7
Sanırım bundan pek ikna olmadım; hataya meyilli görünmese de karşı sezgiseldir ve kendi içinde hataları teşvik edebilir.
thomasrutter

14
@Pies: dürüst olmak gerekirse şu şekilde oldukça dağınık kod: $ page = isset ($ _ GET ['page'])? (int) $ _ GET ['sayfa']: 1; // Bunun avantajı, hata bastırma gerekmez.
Hoşnutsuz Keçi

3
ikinci düşüncelerde, bunun yerine kullanabileceğiniz bir tamsayı arıyorsanız: $ page = is_int ($ _ GET ['page'])? $ _GET ['sayfa']: 1;
Hoşnutsuz Keçi

4
Önceki orkodun orsayısal değerle sonuçlanması durumunda, sonraki kodun yürütüleceğini belirtmek gerekir 0. Yani anlamsal olarak, böyle bir şeyle daha az olası olabilir $_GET['page'], ancak açık bir şekilde durum ortaya çıkabilir ve buna dikkat etmek iyidir.
göz kapağısızlığı

3
orOperatörün, operatörün daha düşük emsal bir versiyonu olduğunu da belirtmek gerekir ||. Ayrıca, +1 çünkü bu çok etkileyici ve çoğu zaman mümkün olduğunu unutuyorum. Daha sık kullanılmalıdır ve ne yaptığı konusunda kesinlikle açıktır. Nasıl "gerçek erkek" kodu olsa hakkında bilmiyorum, bu yüzden bu konuda yorum yapamam.
göz kapağısızlığı

80

__autoload() (class-) tarafından desteklenen dosyalar set_include_path() .

PHP5'te artık iyi OOP yaparken "include_once" ifadelerinin uzun listelerini belirtmek gereksizdir.

Sınıf kitaplığı dosyalarının sağlıklı bir şekilde yapılandırıldığı küçük bir dizin kümesi tanımlayın ve otomatik ekleme yolunu ayarlayın:

set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`

Şimdi __autoload()rutin:

function __autoload($classname) {
    // every class is stored in a file "libs/classname.class.php"

    // note: temporary alter error_reporting to prevent WARNINGS
    // Do not suppress errors with a @ - syntax errors will fail silently!

    include_once($classname . '.class.php');
}

Şimdi PHP otomatik olarak talep üzerine gerekli dosyaları otomatik olarak içerecek ve ayrıştırma zamanını ve belleğini koruyacaktır.


spl_autoload_register () kullanımı daha iyi mi?
alex

19
Elbette! __autoload () PHP4'tür, ancak spl_autoload_register () otomatik yükleme yöntemlerinin tahribatsız "papatya dizimi" dir.
Willem

3
Kullanışlı bir özellik, ancak bir uyarı, belirli bir sınıfın bir örneğini bulduğunuzda, bir sınıf dosyasının konumunu bulmayı biraz daha zorlaştırır. Üst kısımdaki açık bir şekilde tanımlamak, ilgili sınıfların ve bunların tam konumlarının sonlu bir listesini verir.
Cory House

Bu güzel bir özellik, ancak kodun önceden derlenmemesi durumunu aşmak için, bu yüzden sınıfın nerede olacağını bilmiyor. Bunun büyük dezavantajı, farklı ad alanlarında olsalar bile, aynı ada sahip 2 sınıfınız olamaz.
Kibbee

3
Lütfen otomatik yükleme uygularken PHP Standartları Çalışma Grubu'nun (ZF, Symfony, Doctrine, CakePHP, Solar vb. Geliştiricilerini içeren) PSR-0 desteğine bir göz atın: groups.google.com/group/php-standards/web / psr-0-son teklif
Philippe Gerber

76

kolaylık . En büyük özellik, yeni geliştiricilerin oturup "çalışan" komut dosyaları yazmasının ve kodu anlamalarının ne kadar kolay olduğudur.

En kötü özelliği, yeni geliştiricilerin oturup "çalışan" komut dosyaları yazmasının ve kodu anladıklarını düşünmesinin ne kadar kolay olduğudur.

Toplumun açıklık PHP ve açık kaynak olarak kullanılabilir PHP projeler büyük miktarda çevredeki çok daha az gelişme dünyaya girmek birisi için korkutucu ve sizin gibi dilleri olgun daha içine bir atlama taşı olabiliyor.

Teknik şeyleri benden önce tartışmayacağım, ancak PHP'ye bir web dili yerine bir topluluk olarak, gelişmeye başladığınızda sizi kucaklayan bir topluluk olarak bakarsanız, faydalar gerçekten kendileri için konuşur.


3
Kesinlikle iyi bir yorum. Python benim ilk dilimdi ve harikaydı, ama anlayabildiğimi hissettiğim projelerin eksikliği bir engel oluşturdu. PHP ile belgeler üzerinde hemen hemen her şeyi arayabilir ve anlayabilirim ... web üzerinde mevcut kaynaklar şaşırtıcı.
dscher

76

Şüphesiz değişken değişkenler ve fonksiyonlar !

$foo = 'bar';
$bar = 'foobar';
echo $$foo;    //This outputs foobar

function bar() {
    echo 'Hello world!';
}

function foobar() {
    echo 'What a wonderful world!';
}
$foo();    //This outputs Hello world!
$$foo();    //This outputs What a wonderful world!

Aynı kavram nesne parametreleri için de geçerlidir ($ some_object -> $ some_variable);

Çok çok güzel. Döngüler ve desenlerle kodlamayı çok kolay hale getirin ve eval'den (Thanx @Ross & @Joshi Spawnbrood!) Daha hızlı ve daha kontrol altında. T


111
değişken değişkenler aslında kodu daha az okunabilir ve hatalara daha açık hale getirir.
Elzo Valugi

8
Ve insanlar bunu gerçekten kullanıyor mu? Adamım bu kaynakları okumaktan nefret ederim.
Gary Willoughby

27
Değişken değişkenler PHP'nin sunduğu en kötü özelliklerden biridir.
davidtbernal

10
9 Değişken değişkenlerin 10 katından daha fazlası dizilerle değiştirilir, böylece tüm veriler tek bir yerde bulunur, üzerinde yineleme yapabilirsiniz. Sadece bazı çok özel durumlarda faydalı olabilirler.
Jasper Bekkers

7
Lütfen yenileri bu "özelliği" kullanmayın.
whiskysierra

68

Sen kullanabilirsiniz bağımsız değişkenler tanımsız numarası ile fonksiyonlarını kullanarak func_get_args().

<?php

function test() {

    $args = func_get_args();
    echo $args[2]; // will print 'd'
    echo $args[1]; // will print 3
}

test(1,3,'d',4);

?>

1
Bunu göndermek üzereydi. JS işlevlerindeki arguments özelliğine benzer sıralama.
alex

67

Uzak dosyaları seviyorum . Web geliştirme için bu tür özellikler son derece kullanışlıdır.

Bir web sayfasının içeriğiyle çalışmanız mı gerekiyor? Basit

$fp = fopen('http://example.com');

ve diğer normal dosyalarda olduğu gibi kullanıma hazır bir dosya tanıtıcısı var.

Veya uzak bir dosyayı veya web sayfasını doğrudan bir dizeye okumaya ne dersiniz?

$str = file_get_contents('http://example.com/file');

Bu özel yöntemin yararlılığını abartmak zordur.

Uzak bir görüntüyü analiz etmek mi istiyorsunuz? FTP üzerinden yapmaya ne dersiniz?

$imageInfo = getimagesize('ftp://user:password@ftp.example.com/image/name.jpg');

Dosyalarla çalışan hemen hemen her PHP işlevi uzak bir dosyayla çalışabilir. Sen eşitlemek edebilir include()veya require()uzaktan kod dosyaları bu şekilde.


2
Bu çok hoş! Örneğin Java'da bunu yapmak için bir gazillion jar dosyası eklemeniz ve çok sayıda kazan plakası kodu yazmanız gerekir.
Kimble

16
"Kod dosyalarını uzaktan bu şekilde dahil edebilir () veya zorunludur ()." Tabii ki, kontrol etmediğiniz bir sunucuya dosya eklemek () korkunç ve korkunç bir fikirdir.
Frank Farmer

4
@Frank - evet, biri , kontrol ettiğiniz bir sunucudan kod ekleyeceğinizi varsayar .
zombat

1
Uzak dosya eklenmesi yaygın bir PHP güvenlik sorunudur: en.wikipedia.org/wiki/Remote_File_Inclusion#PHP .
Frank Farmer

63

strtr ()

Son derece hızlı, o kadar çok şaşıracaksınız. Dahili olarak, maçlarınızı ortak öneklerine göre düzenlemek için muhtemelen bazı çılgın b-ağaç türü yapı kullanır. 200'den fazla bul ve değiştir dizeleri ile kullanıyorum ve hala 100ms'den daha az 1MB geçiyor. Önemsiz olarak küçük dizeler hariç tümü için strtr (), aynı şeyi yapmada strtolower () 'dan bile daha hızlıdır, hatta karakter kümesini hesaba katar. Muhtemelen art arda gelen strtr çağrılarını kullanarak tüm ayrıştırıcıyı yazabilirsiniz ve normal normal ifade eşleşmesinden daha hızlı olurdu, jeton türünü anlayın, bunu veya bu çıktıyı, bir sonraki normal ifade türünden bir şey.

Metni kelimelere bölmek, altyazı çıkarmak, noktalama işaretlerini kaldırmak vb. İçin bir metin normalleştirici yazıyordum ve strtr benim İsviçre çakısıydı, pantolonları düzenli ifadelerden, hatta str_replace () bile yendi.


1
Muhtemelen daha hızlıdır, çünkü tek karakter yerine geçer.
staticsan

10
strtr () yalnızca tek karakterlik değişiklikler yapmaz. Rasgele uzunluktaki alt dizeleri diğer rasgele uzunluktaki alt dizelerle değiştirebilir ve yine de gerçekten hızlı görünüyor.
thomasrutter

1
Bazı durumlarda strtolower'dan daha hızlı olduğunu söylemiştiniz, ispatlayabilir misiniz? Küçük bir kıyaslama yaptım ve yanlış buldum.
Pixel Developer

1
80 karakterlik küçük dizelerde strtolower'dan daha yavaş olduğunu ve 1MB'lik büyük dizelerde daha hızlı olduğunu fark ettim. Muhtemelen her çağrıldığında sabit bir maliyet türü yükü vardır. Ben sadece strtr kullanıyordum ($ this-> string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); Üzerinde çalıştığım dize bazı tipik İngilizce metinlerdi ("Hızlı kahverengi tilki", bu tür bir şey).
thomasrutter

Bu yazıyı yeni okudum ve sonra Google'da arama yaptım ve buldum: simplemachines.org/community/index.php?topic=175031.0 Hangisinin doğru olduğu hakkında bir fikriniz var mı?
Flipper

61

PHP'nin çok iyi bilinmeyen bir özelliği, extract()ilişkilendirilebilir bir diziyi yerel ad alanına açan bir işlevdir. Bu muhtemelen otoglobal kürtaj için vardır, ancak templasyon için çok yararlıdır:

function render_template($template_name, $context, $as_string=false)
{
    extract($context);
    if ($as_string)
        ob_start();
    include TEMPLATE_DIR . '/' . $template_name;
    if ($as_string)
        return ob_get_clean();
}

Artık kullanabilirsiniz render_template('index.html', array('foo' => 'bar'))ve yalnızca $foodeğer "bar"şablonda görünür.


15
Özü () herhangi bir şekilde iyi bir özellik olduğunu önerdiğim için size kızacaktım. Ama sanırım kullanımı oldukça kullanışlı. Sanırım iyi bir fikir olduğu yerde kullanıldığını gördüm!
thomasrutter

5
extract (), kendi son derece hafif şablonlama sisteminizi yuvarlamanızı kolaylaştırır. +1
Dinah

14
Ters, compact () de güzel: $ a = 1; $ b = 2; kompakt ('a', 'b'); // == dizi ('a' => $ a, 'b' => $ b)
Annika Backstrom

2
Evet, muhtemelen ekstrenin () tek gerçekten iyi kullanımı.
staticsan

4
Bu durumda, işlev bağımsız değişken adları olarak ortak sözcükleri kullanmamanızı öneririm, çünkü ayıkladığınız () $ bağlamı 'as_string' veya 'template_name' dizinlerinde değerler içerebilir. EXTR_SKIP kullanımı kabul edilebilir, ancak sorunu yalnızca başka bir yere taşır (yani şablon bir $ as_string bekliyorsa bunun için yanlış değer elde eder.)
Michał Tatarynowicz

52

Range () kendi başına gizli değil, ancak yine de birçok kişi ile yineleniyor:

for ($i=0; $i < $x; $i++) { 
    // code...
}

ne zaman kullanıyor olabilirler:

foreach (range(0, 12) as $number) {
    // ...
}

Ve basit şeyler yapabilirsiniz

foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t<option value=\"{$i}\">{$i}</option>\n";
}

3
foreach ($ dizi olarak $ key => $ value) {} yapabilirsiniz.
SilentGhost

15
Bir mikro optimizasyon olabilir, ancak foreach'den çok daha hızlı ve daha az bellek yoğun olduğunu belirtmek gerekir.
JAL

3
Python'u denemelisin. "(12) aralığında i için" kadar basit veya daha verimli xrange'i kullanabilirsiniz.
Ponkadoodle

2
@SilentGhost: Başlamak için hala bir diziye ihtiyacınız vardır, bu her zaman böyle değildir. @Newbie: lütfen detaylandırın?
Alec

1
@flexxy, görünüşe göre, DEĞİL. Şunu düşünün: phpbench.com aşağı kaydırın Read Loop.
Buddy

44

PHP etkin web alanı genellikle (asp) .net olan bir şeyden daha ucuzdur. Sen belki bir özellik olduğunu diyoruz ;-)


3
Ayrıca, her birinde Windows Server için ödeme yapmanız gerekmiyorsa, birden çok sunucu kurmak çok daha ucuzdur.
MiffTheFox

4
Windows'un uygun maliyetli olduğunu bildiğim tek yer, sunucu yazılımında STEEEEP indirimleri alan bir üniversitede, bölümümün 100 kopyasını satın almamın yanı sıra linux'daki yöneticilerimizi eğitmekten daha ucuz. beni üzüyor ama windows kurulumu temiz ve iyi kurulum).
dcousineau

4
Şimdilik, ancak geçişi sadece bir kez yapmanız gerekiyor, er ya da geç yeni lisans satın almanız gerekecek ...
e-satis

42

staticAnahtar kelime bir cepten açısından yararlı dışındadır. 'Not' özelliğini hızlı ve kolay bir şekilde uygulayabilir veya önbelleğe almayı aşağıdaki kadar basit bir şeyle yapabilirsiniz:

<?php
function foo($arg1)
{
    static $cache;

    if( !isset($cache[md5($arg1)]) )
    {
        // Do the work here
        $cache[md5($arg1)] = $results;
    }

    return $cache[md5($arg1)];
}
?>

staticAnahtar kelime sadece yürütme geçmiş bu işlevin kapsamında devam bir değişken oluşturur. Bu teknik, veritabanına çarpan get_all_books_by_id(...)veya get_all_categories(...)bir sayfa yüklemesi sırasında bir kereden fazla arayacağınız işlevler için mükemmeldir .

Uyarı: Karma için bir anahtar yapmanın en iyi yolunu bulduğunuzdan emin olun, hemen hemen her durumda, md5(...)yukarıdaki iyi bir karar DEĞİLDİR (hız ve çıkış uzunluğu sorunları), açıklama amaçlı kullandım. sprintf('%u', crc32(...))veya spl_object_hash(...)bağlama göre çok daha iyi olabilir.


7
C / C ++ 'dan kopyalanan bir özellik
12'de GetFree

2
@GetFree Kimsenin PHP'nin neredeyse tümünün C, C ++, Perl, vb.'den kopyalandığını inkar edeceğini sanmıyorum
Frank Farmer

1
Kopyalama yapılabilecek en iyi şeydir.
NikiC

1
Kötü PHP. Her zaman diğerlerinden özellikler kopyalar. Bunun yerine her şeyi sıfırdan yazmalıdır! (Bunun en ufak bir ihtimalinin ciddiye alınması durumunda: Şaka yapıyorum)
Halil Özgür

42

PHP'nin güzel bir özelliği de CLI . Belgelerde o kadar "terfi" değil ama rutin komut dosyalarına / konsol uygulamalarına ihtiyacınız varsa, cron + php cli kullanmak gerçekten hızlı!


Gerçekten içine bakmak gerekir, ben bir PHP komut dosyası getirme birkaç cron işleri varwget http://example.com...
DisgruntledGoat

CLI, hata raporlama tercihlerinizi değiştirmek zorunda kalmadan uyarılar / hatalar göstereceğinden, spot hata ayıklamanın mükemmel bir yoludur.
Buzullar

40

Sonra "ve yazdır" hilesi

<?php $flag and print "Blah" ?>

$ Flag doğruysa Blah'ı yankılayacak. ECHO İLE ÇALIŞMAZ.

Bu şablonda çok kullanışlı ve? : okunması gerçekten kolay değil.


24
Ben kendim üçlü operatörün mantıklı ve kısa değerlendirme sürecinden faydalanmaktan çok daha açık olduğunu düşünüyorum.
Vicent Marti

26
Aslında ($ flag) "Blah" yazdıysa <? Php ile aynı karakter sayısı
çok fazla php

3
Parantez, özellikle kanlı fransız
klavyemde

7
@all comments - Bu, ne kadar kısa sürede alabileceğinizle ilgili değil! Bazen programcı bile olmayan şablon insanlar için okunabilirlik ve kullanım kolaylığı ile ilgilidir.
Tor Valamo

6
İf () ifadesinin daha kolay ve daha okunaklı olduğunu söyleyebilirim. Kafamı bulmak benim için kesinlikle bir hata yapmanın kolay olduğu PHP'deki 've' operatörünün bir yan etkisinden faydalanmaktan daha kolaydır (veya kodu daha sonra okuduğunuzda bir hata gibi görünüyor). Örneğin, belirtildiği gibi, bu 'echo' ile istediğiniz şekilde çalışmaz. İf () ile böyle bir şey yok.
thomasrutter

37

Eksi karakteri aşağıdaki gibi değişken adlarında kullanabilirsiniz :

class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

Neden kullanmalıyım? Bilmiyorum: Belki bir CSS modeli için? Veya çıkmanız gereken bazı garip JSON'lar. Garip bir özellik :)


2
Bu yöntem yöntem adlarıyla çalışır mı? Bir yönlendirici kullanan çerçeveler için yararlı olabilir ve domain.com/something-with-minuses/view/ adresini ziyaret edin
alex

6
Kıvrımlı parantez, tire, nokta ve diğer alfasayısal olmayan varlıklara sahip nesne özelliklerine erişmenizi sağlar. Bunu kullanmanın bir nedeni, varlık adlarının NITF / NewsML <body.content> 'de olduğu gibi noktalı olabileceği xml ile uğraşırken. SimpleXML kullanırsanız, buna böyle erişirsiniz $item->DataContent->body->{'body.content'}.
Jesse Kochis

2
PHP değişkenleri bu şekilde kullanıldığında herhangi bir karakter alabilir, boşluklar ve satırsonları bile.
Acemi

Bu SimpleXML'de kullanıldığında çok yararlı olur ... harika. Paylaşım için teşekkürler.
KyleFarris

34

HEREDOC sözdizimi en sevdiğim gizli özellik. Her zaman zor bulmak için <<< için Google olamaz ama büyük HTML parçaları kaçmak zorunda durur ve yine de değişkenleri akışa bırakmanıza izin verir.

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;

2
HEREDOC, SQL ifadeleri oluşturmanın ve kullanmanın en sevdiğim yoludur.
bdl

11
Not: kapanış EOM; girintili olamaz.
micahwittman

İyi, ama şablonlar kullanıyorsanız anlamsız. Ayrıca uygun girinti yoluna girer.
Manos Dilaverakis

7
Sevgili tanrı, bu gördüğüm en çirkin kod parçası. HEREDOC'ları kullanıyorsanız, sunumu mantıktan ayırmadınız.
Lotus Notes

@Byron: Sunum için kullanmak zorunda değilsiniz, herhangi bir dize için kullanılabilir. Bdl.
Tom Pažourek

34

Muhtemelen pek çoğu, işlev parametreleri için varsayılan değerler olarak sabit "değişkenler" belirtmenin mümkün olduğunu bilmemektedir:

function myFunc($param1, $param2 = MY_CONST)
{
//code...
}

Dizeler kullanılabilir olarak onlar olsaydı diziler :

$str = 'hell o World';
echo $str; //outputs: "hell o World"

$str[0] = 'H';
echo $str; //outputs: "Hell o World"

$str[4] = null;
echo $str; //outputs: "Hello World"

3
Bu sonuncusu şık. Ne zaman bir karakteri kaldırmak için başka bir yöntemden daha iyi olacağı hakkında hiçbir fikrim yok. +1 yine de
George Mauer

3
Muhtemelen bunu yapmak için bir işlev çağırmaktan daha verimlidir. Dizeler normalde bitişik olarak bellekte saklanır, bu nedenle $ str [4] 'e ulaşmak önemsizdir. Dizeleri karakter dizisi olarak saklamak, C'den türeyen çoğu dil için ortaktır
sjobe

1
Tanımlı bir sabiti varsayılan değer olarak kullanmanız gerekmez. Aşağıdakiler de mükemmel şekilde geçerlidir: işlev ayağı ($ param1, $ default = dizi ('anahtar' => 'değer'), $ default_s = 'Dize', $ default_i = 10, $ default_b = false). Ancak, bir değişkeni varsayılan bağımsız değişken olarak kullanamayacağınızı belirtmekte haklısınız.
dcousineau

@dcousineau Dizi () bir işlev değil, bir dil yapısı olduğu için örneğin mükemmel bir şekilde geçerlidir. İşlev çağrılarına bağımsız değişkenler için varsayılan değerler olarak izin verilmez.
Jamol

4
Çok baytlı dizeleriniz (yabancı diller vb.) Varsa dizeleri diziler olarak işlemeye dikkat edin
philfreo

33

PHP koduyla ilgili en yararlı şey, gördüğüm bir işlevi tam olarak anlamadığımda, bir tarayıcı kullanarak ve yazarak bakabileceğimdir:

http://php.net/function

Geçen ay bazı kodlarda "aralık" işlevini gördüm. Asla kullanamadığım ama gerçekten kullanışlı olduğu yüzlerce fonksiyondan biri:

http://php.net/range

Bu url, http://us2.php.net/manual/en/function.range.php için bir takma addır . Bu basit fikir, işlevleri ve anahtar kelimeleri URL'lerle eşleme harika.

Keşke diğer diller, çerçeveler, veritabanları, işletim sistemleri de belgelere bakmak için basit bir mekanizmaya sahip.


5
range()için yararlı olabilirforeach( range(1, 10) as $i) { };
alex

FireFox'unuz varsa; sadece PHP functionadres çubuğuna bir Google 'şanslı hissediyorum' arama yapacak yazın ve neredeyse her zaman doğru php dokümantasyon sayfasında sona erer.
Kolky

30

Hızlı blok yorumları

/*
    die('You shall not pass!');
//*/


//*
    die('You shall not pass!');
//*/

Bu yorumlar, bir kod bloğunun bir karakterle yorumlanması durumunda geçiş yapmanızı sağlar.


14
Bu PHP'ye özgü değildir. Bu, // ...satır yorumlarını destekleyen ve /* ... */yorumları engelleyen herhangi bir dilde çalışır .
Jordan Ryan Moore

Herhangi bir kod temizleme yardımcı programı bunu kullanmak için nefret ediyor ...;)
Talvi Watia

3
Ben de /** /önce ve /**/sonra kullandım. İlkinde boşluk kaldırarak ve ekleyerek bloğu değiştirebilirsiniz. Bunun, CSS (ve // ... yorumları desteklemeyen diğer diller) ile çalışmanın ek bir yararı vardır .
kingjeffrey

FWIW, orijinal makaleye bağlantı aleembawany.com/2009/01/27/lazy-block-comment-trick
aleemb

@aleemb, bu soruda başka düzenlemeler yapmaktan kaçının.
Sam152

29

Listem .. çoğu "gizli özellikleri" altında "favori özellikleri" (umarım!) Daha fazla düşer ve hepsi yararlı değil, ama .. evet.

// swap values. any number of vars works, obviously  
list($a, $b) = array($b, $a);

// nested list() calls "fill" variables from multidim arrays:  
$arr = array(  
  array('aaaa', 'bbb'),  
  array('cc', 'd')  
);  
list(list($a, $b), list($c, $d)) = $arr;  
echo "$a $b $c $d"; // -> aaaa bbb cc d  

// list() values to arrays  
while (list($arr1[], $arr2[], $arr3[]) = mysql_fetch_row($res)) { .. }  
// or get columns from a matrix  
foreach($data as $row) list($col_1[], $col_2[], $col_3[]) = $row;

// abusing the ternary operator to set other variables as a side effect:  
$foo = $condition ? 'Yes' . (($bar = 'right') && false) : 'No' . (($bar = 'left') && false);  
// boolean False cast to string for concatenation becomes an empty string ''.  
// you can also use list() but that's so boring ;-)  
list($foo, $bar) = $condition ? array('Yes', 'right') : array('No', 'left');

Üçlü operatörleri de yuvalayabilirsiniz, bazen kullanışlı olur.

// the strings' "Complex syntax" allows for *weird* stuff.  
// given $i = 3, if $custom is true, set $foo to $P['size3'], else to $C['size3']:  
$foo = ${$custom?'P':'C'}['size'.$i];  
$foo = $custom?$P['size'.$i]:$C['size'.$i]; // does the same, but it's too long ;-)  
// similarly, splitting an array $all_rows into two arrays $data0 and $data1 based  
// on some field 'active' in the sub-arrays:  
foreach ($all_rows as $row) ${'data'.($row['active']?1:0)}[] = $row;

// slight adaption from another answer here, I had to try out what else you could  
// abuse as variable names.. turns out, way too much...  
$string = 'f.> <!-? o+';  
${$string} = 'asdfasf';  
echo ${$string}; // -> 'asdfasf'  
echo $GLOBALS['f.> <!-? o+']; // -> 'asdfasf'  
// (don't do this. srsly.)

${''} = 456;  
echo ${''}; // -> 456  
echo $GLOBALS['']; // -> 456  
// I have no idea.  

Tamam, şimdilik duracağım :-)


Hmm, bir süre oldu ..

// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;

Bu nedenle, kıvırcık parantez içine alırsanız, herhangi bir dizeyi yöntem adı olarak geçirebileceğinizi keşfettiniz. Herhangi bir dizeyi ne yazık ki yöntem olarak tanımlayamazsınız, ancak __call () ile yakalayabilir ve gerektiğinde daha fazla işleyebilirsiniz. Hmmm ....

class foo {
  function __call($func, $args) {
    eval ($func);
  }
}

$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."\n";}'}();

Reddit yorumlarında bu küçük gem bulundu:

$foo = 'abcde';
$strlen = 'strlen';
echo "$foo is {$strlen($foo)} characters long."; // "abcde is 5 characters long."

Doğrudan böyle} {içindeki işlevleri çağırmak değil, ancak olabilir değişkenleri tutma-fonksiyonlu-name kullanmak ve bu çağrı! (* ve * üzerinde değişken değişkenler de kullanabilirsiniz)


2
Lütfen üçlü karşılaştırma operatörünü aşırı kullanmayın; bu kod gizlemeye yol açar.
staticsan

Vay. Bu, $ GLOBALS listenizi tamamen doldurabilir. Kötü uygulama. Ciddi anlamda.
Talvi Watia

Henüz gizlenmiş bir PHP yarışması var mı?
Lotus Notes

Takas ile hile - etkileyici ve kullanışlı, teşekkürler.
OZ_

1
${''} = 456;hahaha .... taciz oldukça.
Skurmedel

26

Dizi manipülasyonu.
Dizilerle çalışmak ve değiştirmek için tonlarca araç. PHP'ye özgü olmayabilir, ancak bu kadar kolay bir dil ile hiç çalışmadım.


örneğin ne gibi? Bana öyle geliyor ki, işlevlerin hepsi garip bir şekilde adlandırılmış ve küresel ad alanında konumlandırılmış. Artı ben belki $ arr [] = $ newvalue dışında değer eklemek için başka bir dilde bu kadar kolay bir şey düşünemiyorum - bu harika
George Mauer

8
PHP dizisi, yığın, kuyruk, deque, liste, hashtable, vb. Olarak kolayca kullanılabilen bir veri yapısıdır. Array_ * işlevlerinden başka bir şeye başvurmadan, en yaygın ihtiyaçlar için gerçekten oldukça esnektir.
Camilo Díaz Repka

6
Python, dizileri (listeler ve tuplesler gibi) PHP'den çok daha iyi yapar.
Çok fazla php

26

Biraz senin gibiyim, 8 yılı aşkın süredir PHP kodladım. Yaklaşık bir yıl önce bir .NET / C # dersi almak zorunda kaldım ve C # dilinden (ASP.NET'ten nefret ettim) gerçekten zevk aldım ama bana daha iyi bir PHP geliştiricisi yaptı.

PHP bir dil olarak oldukça zayıf, ama, ben son derece hızlı ve LAMP yığını harika. Nihai ürün parçaların toplamından daha ağır basmaktadır.

Bununla birlikte, sorunuza cevap olarak:

http://uk.php.net/SPL

SPL'yi seviyorum C #'daki koleksiyon sınıfı, başlar başlamaz sevdiğim bir şeydi. Şimdi kekimi alabilir ve yiyebilirim.

Andrew


24

Kimsenin henüz bahsetmediğinden biraz şaşırdım, ancak dizilerle en sevdiğim hilelerden biri artı operatörünü kullanıyor. Biraz benziyor array_merge()ama biraz daha basit. Genellikle istediğimi buldum. Aslında, RHS'deki tüm girişleri alır ve gerektiğinde üzerine yazarak LHS'nin bir kopyasında görünmesini sağlar (yani değişmeli değildir). Sağlanmayan değerler için varsayılan değerleri yerinde bırakırken, bir "varsayılan" dizi ile başlamak ve bir vuruşta bazı gerçek değerler eklemek için çok yararlıdır.

Kod örneği istendi:

// Set the normal defaults.
$control_defaults = array( 'type' => 'text', 'size' => 30 );

// ... many lines later ...

$control_5 = $control_defaults + array( 'name' => 'surname', 'size' => 40 );
// This is the same as:
// $control_5 = array( 'type' => 'text', 'name' => 'surname', 'size' => 40 );

$defaultsgerekir$control_defaults
diEcho

3
Ben korumak için kod çok var dizi_merge kadar net olmadığını düşünüyorum. En azından, dizi_merge işlevini kullandığınızda, dizilerle uğraştığınız açıktır.
Sylvain

Ve yaptığınız gerçeği bunu ... + array( ...belirtmek için yeterli değil mi? :-)
staticsan

Bunun için hangi PHP sürümüne ihtiyacınız var?
Lotus Notes

Bu harika bir özelliktir ve "+" nın "sağ" tarafındaki dizinin, dizinin mevcut anahtarlarını "+" nın "sol" tarafına aşırı yazmayacağına dikkat edilmelidir.
Wil Moore III

21

İşte bir, ben sağlanmayan fonksiyon parametreleri üzerinde varsayılan değerleri ayarlamak çok daha kolay gibi:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }

4
Ne yazık ki geçen hafta Google Reader'da bu "gizli özelliği" gördüm. Bu konuda gizli olanı anlamıyorum - temel sözdizimi. Örneğin ($ var = true) değerini deneyin.
Ross

8
Ne daha kolay? Çoğu dil bu özelliğe sahiptir.
Christian Davén

10
C # daha kolay (ve sanırım C ++ ve Java)
George Mauer

8
C ++ varsayılan parametre değerlerini desteklemez.
08:45

2
c # varsayılan değerleri desteklemez. aşırı yüklenmiş bir işlev yazmak ve her zaman sadece hantal bir değer beyan etmek zorunda
DeveloperChris

21

Hızlı ve kirli varsayılan ayardır.
Dil yararlı kısayollarla doludur, bu da PHP'yi piyasaya sunma süresi kısa olan (küçük) projeler için mükemmel bir aday yapar. Temiz PHP kodu imkansız değil, sadece ekstra çaba ve deneyim gerektiriyor.

Ama PHP'yi seviyorum çünkü bir deneme yazmadan istediğimi ifade etmeme izin veriyor.

PHP:

if (preg_match("/cat/","one cat")) {
   // do something
}

JAVA:

import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
  // do something
}

Ve evet, bu Int yazmamayı içerir .


4
bunun yerine strpos kullanmalısınız: if (false! == strpos ("bir kedi", "kedi")) {
OIS

17
@OIS örneğinin amacı, "tek bir kedi" de "kedi" dizesini nasıl bulacağınızı değil, hızlı bir normal ifade eşleşmesinin çalışmasını göstermek ve karşılaştırmaktı.
dcousineau

19
Java: if (Pattern.matches ("cat", "one cat")) {// bir şeyler yapın} Bilmiyorsanız java hakkında şikayet etmeyi bırakın.
whiskysierra

3
+1 Willi nasıl yapılır preg_replace ('/ ([<[]! - \ s *) (\ S *?) (\ S * - [>]]?) / Se', "\ $ this- > ('\\ 1', '\\ 2', '\\ 3', \ $ veri) ", $ metin) öğesini seçin; Java? Bu, giriş metninde bir yorum bulur ve ardından eşleşen öğelerle bir işlevi çağırır; bu durumda $ this-> select (...), eşleşmenin neyle değiştirileceğine karar verir ve sonuçları döndürür.
DeveloperChris

1
Regex PHP oldukça berbat ... Ben çok //dil yerine yerleşik Perl veya JavaScript tarzı Regex olurdu .
cdmckay
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.