PHP'de hangi özelliklere sahip olmak istersiniz? [kapalı]


88

Şimdi tatil mevsimi olduğu ve herkesin dilek tuttuğu için merak ediyorum - PHP'nin hangi dil özelliklerini eklemesini isterdiniz? Dil için bazı pratik öneri / dileklerimle ilgileniyorum. Pratik olarak demek istediğim:

  1. Pratik olarak yapılabilecek bir şey (değil: "PHP kodumun ne anlama geldiğini ve benim için hataları düzeltmesini diliyorum" veya "5ms altında herhangi bir kodun çalışmasını diliyorum")
  2. PHP'yi başka bir dile çevirmeyi gerektirmeyen bir şey (değil: "$ işaretlerini bırakıp ayraç yerine yer kullanabilsinler" ya da "PHP derlendiyse, statik olarak yazılmışsa ve isminde # olsaydı")
  3. Mevcut tüm kodu kırmayı gerektirmeyen bir şey (değil: "500 işlevi yeniden adlandıralım ve parametre sırasını değiştirelim")
  4. Bir şey yapar (: ya da "Ben 12345 nihayet düzeltildi hata # diliyorum" "Orada XYZ protokolü için destekleme uzantısı olsaydı" değil) dil veya bazı ilginç bunun yönünü değiştirmek
  5. Bir ranttan daha fazlası olan bir şey (değil: "PHP'nin çok kötü emmemesini diliyorum")

Herhangi bir iyi dileği olan var mı?

Mod düzenleme: Stanislav Malyshev çekirdek bir PHP geliştiricisidir.


9
@Stan: Bu tür yorumlardan kaçınmak istediğiniz kadarıyla yine de alacaksınız. Sorunlar insanlar var PHP ile büyük ölçüde yayınınızda ekarte ettiğimiz şeylerden kategorilerde. [...]
Fishtoaster

24
[...] “Gerçekten yüzüne çarpmadan yüzüne vurulma deneyimini nasıl artırabiliriz?” Diyorsunuz. Demek istediğim, evet, yüzümüze çarptığımızda bedava kahve almak güzel olabilir, yüzüne vurulmak gibi temel sorunların birçoğunu ele almaz. Bu yüzden, umarım burada bazı yararlı cevaplar alırsınız (halihazırda göründüğü gibi), verimsiz olanlardan şaşırmayın.
Fishtoaster

5
@Fishtoaster: Eğer PHP senin için yüzüne vurulmakla ilişkilendirilirse, elbette ondan uzak dur. Kesinlikle onu geliştirmekle ilgilenmiyorsunuz. Öyle insanlar olsa da öyle oluyor. Bu konu onlar için, sizin için değil. Eminim bu site sizin için de pek çok konu içeriyor, bu onlardan biri değil.
StasM

5
Örnek olarak yüzüme vurulmayı kullanıyorum - yüzeysel iyileştirmelerin bu kadar önemli olmadığı bir durum; çoğu insanın sorunları altta yatan şeylerle olduğunda. Bu yüzeysel gelişmeler için öneri alma girişimlerinizi bile kınamadım. Durumdan dolayı neden birkaç yararsız cevap alacağınıza dikkat çekiyorum.
Fishtoaster

6
@Fishtoaster: Herkes değil, şaşırtıcı bir şekilde , PHP'den nefret ediyor - Her zaman hoşuma gitti. Çok esnek ve hızlı (kodlamak için).
Orbling

Yanıtlar:


119

Adlandırılmış parametreleri umursamıyorum.

getData(0, 10, filter => NULL, cache => true, removeDups => true);
// instead of:
getData(0, 10, NULL, true, true);

// or how about:
img(src => 'blah.jpg', alt => 'an albino platypus', title => 'Yowza!');

Ne yazık ki PHP devs zaten bu fikri vurdu .


1
2005’in listesi. Pek çok fikir kapatıldı ve sonra yeniden doğdu. Aslında, eğer iyi bir uygulama gelirse, kabul edilmesi uygun bir ihtimaldir.
StasM

21
Bu benim en sevdiğim piton özelliği. Kodu çok kendi kendine belgelendirir.
Keyo

7
@Josh K: Tamam olabilir, ancak 'dizi' çağrısı yararsız çöp. Sadece gerçekten ne yapmaya çalıştığınızı gizler. Başka bir seçenek diziler için kısa bir sözdizimi olacaktır: make_img (['src' => 'blah.jpg', ...]);
Erik van Brakel

2
@Erik: Bu da kötü bir seçenek değil, neden zaten küçük bir dizi sarmalayıcı ile bunu yapabiliyorsanız bu dağınıklığı bir dile ekledim diyorum.
Josh K

4
@Erik: Diziler için daha rahat bir sözdizimi (JavaScript'in []operatörü gibi ) çok iyi bir özellik olurdu.
Josh K,

93

Daha fazla başvuru:

echo something_that_returns_array()[4];

Diğerleri, adlandırılmış parametrelerden ve daha kısa bir dizi sözdiziminden bahsetti. Daha kısa nesne sözdizimini de umursamıyorum.

$a1 = array(1, 2, 3, 4);
$a2 = [1, 2, 3, 4];

$b1 = (object)array('name' => 'foo');
$b2 = {'name' => 'foo'}; // or something?

18
() [] sözdizimi zaten bagajda. Ne yazık ki, dizi kısayolları reddedildi, ancak diriliş için umarım.
StasM,

2
Bu özelliği çok isterim. Neden bir şeylere sahip olabiliriz?
Bala Clark

4
Dizi ve nesne notasyonları gibi Javascript sallanır. Bir ön uç geliştiricisi olarak bu beni php kodunda en çok rahatsız eden şey.
Bleep Bloop

1
@DisgruntledGoat Yapar, bakınız:function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom

2
@DisgruntledGoat: ()->Sözdizimi ile ilgili sorun , yalnızca bir nesne geri döndüğü zaman, işleri daha kötü hale getirmek için işe yaraması , nesnenin bile istenen ismin ne yaptığını belirten bir özellik / metoda sahip olması gerektiğidir. , verdiğiniz parametreleri kabul ederken ve daha fazlası gerektirmemesi için dua ederken ... vb.
phant0m

72

PHP ile yaklaşık 13 yıl çalıştıktan ve yoğun olarak JS ile 4 yıl çalıştıktan sonra, PHP'nin JS'den ödünç almanın iyi olacağını düşündüğüm birkaç şey var:

1) Diziler ve Nesneler için kestirme notasyon. Bunun Internals'ta tartışıldığı ve düşürüldüğüne inanıyorum (bu nedenle duyuyorum - sosisin nasıl yapıldığını görmek istemiyorum), ama gerçekten, gerçekten JS'deki diziler ve nesneler için hazırlamanın çok büyük olduğunu düşünüyorum verimlilik kazanır.

Örneğin:

$arr     = [1,2,3,4];
$assoc   = [foo=>'bar', baz=>'boo'];
$stdobj  = {foo->'bar', baz->'boo'};

(IMHO) yazmaktan daha kolay ve temiz mi?

$arr     = array(1,2,3,4); // not too bad
$assoc   = array("foo"=>'bar', baz=>'boo'); // not too bad either
$stdobj  = new stdClass; // this gets pretty rough
$stdobj->foo = 'bar';
$stdobj->baz = 'boo';

Potansiyel karışıklık ile ilgili bazı endişelerin ortaya çıktığını duydum, ama gerçekte, bu heredoc notation'dan daha kafa karıştırıcı mı? En azından PHP'de bir stdClass nesnesi yapmak, uygulamanın cesaretini kırmaya yetecek kadar ayrıntılı.

2) Önceden tanımlanmış işlevleri ve yöntemleri yeniden tanımlayabilmek gerçekten yararlı olacaktır. Bir sınıfı genişleten ve yeni sınıfı başlatmak, aşırı karmaşık ya da pratik olmayan durumları basitleştirir. Yine de, çekirdek / kullanıcı olmayan fonksiyonların ve yöntemlerin yeniden tanımlanmasından kaçınmamız gerektiğini düşünüyorum.


Bu ikisine ek olarak, PHP'nin şeffaf bir şekilde unicode'u desteklemesi gerektiğini düşünüyorum . Bu, geliştiriciler için giderek daha fazla bir sorun haline geliyor ve PHP'de şu anda sunulan çözümler kafa karıştırıcı ve sıklıkla performans göstermiyor. Tüm standart string işlevlerini kutudan unicode uyumlu hale getirmek PHP programcıları için büyük bir kazanç olacaktır.

Sorduğunuz için teşekkürler!


(2) runkit'e bakın. (3) unicode, özellikle dış dünyanın çoğu unicode olmadığı için zordur. Ya performansı düşürmek zorundayız ya da insanların çok fazladan fazla iş yapmalarını istiyoruz (Java gibi). Bu yüzden php6 unicode çaba işe yaramadı.
StasM

8
Unicode'a gelince: zor olabilir, ancak çok yararlı olabilir (kesinlikle PHP'yi geliştirmek zor, ancak büyük faydalar sağlıyor, evet?) Belki de bir çözüm anlaşılan perf tradeoff ile bir uzantı yoluyla şeffaf unicode'u sağlamak olabilir. XHP'ye çok benziyor mu? Tekrar teşekkürler.
Funkatron

5
$ object = (object) array ("foo" => 'bar', baz => 'boo');
mercutio

3
"Dış dünyanın çoğu unicode değil" diye nasıl görebildiğinizi anlamıyorum? İnsanlardan mı bahsediyorsun? Veya başka bir şey? Çünkü dünyadaki insanların büyük çoğunluğu (çok büyük bir farkla), Unicode tarafından en iyi şekilde temsil edilen dilleri konuşuyor.
Dean Harding,

1
Kesinlikle unicode desteği. Küresel olarak kullanılan uygulamaların herhangi bir türünün gönderilmesi, onsuz bir başlangıç ​​değildir. PHP devs in iyi unicode desteğinde mühendislik düşünmek kolay ya da değil noktasıdır. İnsanların buna ihtiyacı var ve platformun bunu yapmadaki başarısızlıklarını engelliyorlar. Delphi, başka bir dize türü ekleyerek ve varsayılan davranışı, örtük döküm ve eski davranışı geri almak için genel bir anahtar kullanarak gerçekleştirdi. PHP neden aynı şekilde yapamıyor?
Joeri Sebrechts,

48

Eski bir uzun zamandır PHP özürlüsü olarak, istediğim şeyler:

  1. Diziler için daha kısa sözdizimi. PHP dizileri esnekliklerinden dolayı dilin en kötü özelliklerinden biridir, ancak yazmak çok zor some_array_method($argity, array('key' => $value));. Bu teklifin maalesef PHP posta listesinde zaten var olduğuna inanıyorum.
  2. finally destek
  3. / Ek açıklamalar Özellikleri. Bunlar, bir yönteme kod kullanımına izin verecek şekilde özel davranış eklemenizi sağlar. Örneğin, bir MVC çerçevesinde, AuthorizeAttributebir denetleyicinin veya eylem yönteminin kullanıcının yetkilendirilmesini gerektirdiğini gösteren bir tanımlanabilir . Çerçevenin kendisi niteliklerin aranmasından ve bunlara göre hareket etmekten sorumlu olacaktır. PHPUnit'in zaten yansıma kullanarak okunabilen docblock yorumlarına koyarak bir tür özellik kullandığına inanıyorum, ancak docblock yorumlarına gerçek işlevsellik koymak kesinlikle bir hack.
  4. Daha kısa lambda sözdizimi. Yazmak zorunda kalmak yerine function($x){ return $x*2;}belki yazabilirim $x => return $x*2ya da başka bir şey. Bu yine bir çeşit şey bu özelliği kullanmak için bir sürükle yapar. Mesela, $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):vs $results = array_filter(array(1,2,3), $a => return $a % 2 );Birincisi, başarmaya çalıştığınız asıl işle temelde alakasız olan çok daha fazla tesisat tesisine sahip.
  5. DecimalNormal operatörler üzerinden matematik işlemlerini destekleyen yerleşik bir matematik (sabit nokta matematik), operatörün aşırı yüklenmesine sahip olmadığımız için iyi olurdu.
  6. MOAR MAGIC YÖNTEMLERİ. Büyü yöntemleri harika. PHP'nin operatöre sihirli yöntemler kullanarak aşırı yüklendiğini görebiliyordum (bunun temelde asla olmayacağını biliyorum.) Fakat genel olarak, diline bağlanmak ve harika şeyler yapmak için gerçekten harika yollar sunarlar.

48

PHP'yi gerçekten nesne yönelimli yapın. slap on another global functionPHP evrimi bitirmek gerekiyor.

array_merge(array_filter(array_intersect_key($arr1, $arr2), "is_int"), $arr3);

Bu benim okumam için zor. Kendi zihinsel yığınımı oluşturmalı ve onu kendim derlemeliyim. Temelde tersten okumalısınız. $dog->wakeup()->bark();karşılaştırıldığında okumak kolaydırbark(wakeup($dog))

$arr1->array_intersect_key($arr2)->array_filter("is_int")->array_merge($arr3);

Nesne / yöntem desteğini etkinleştirme yolunda adım attınız, lütfen bunu şimdi asıl PHP işlevlerinde kullanın.

500 fonksiyonun ismini değiştirelim ve parametre sırasını değiştirelim.

Bu işlevselliği yöntemlere kaydırmak, bazılarını tutarlı bir şekilde kullanarak yeniden adlandırılmalarını sağlar. Dizelerin ve dizilerin kendi metotları olsaydı, geriye dönük uyumluluğu kırabilir miydi?


3
Dizinin bir nesne türü olmamak PHP'de büyük bir hata olduğunu düşünüyorum. Her türlü soruna yol açar. Ne yazık ki, bu evrimsel bir şey. Burada ne istersen istediğin şeyi uzatma veya kullanıcı alanıyla yapabilirsin. Muhtemelen SPL'ye iyi uyuyordu.
StasM

3
Aynı argüman dizeler için de geçerlidir. Sadece genel olarak yöntemlerin yokluğundan bahsediyorum. Java, Python, C # etc gibi dillerin hepsinin çok daha okunabilir kodu vardır. Sanırım özellikler arıyorsun, ama IMO’nun ne durumda olduğunu düzeltmek daha iyi bir sonuç verir.
Keyo

6
Hayır, saçmalama. Olabilirdog_wake_up($dog); bark_dog($dog);
Matchu

2
IMHO, herhangi bir yeni dize yöntemi UTF-8'i beklemeli ve yaymalı ve giriş geçerli UTF-8 değilse, istisnalar atmalıdır. Bu, büyük ölçüde bir unicode desteğinin yeniden çalışmasına duyulan ihtiyacı büyük ölçüde azaltacaktır.
rjmunro

1
@luiscubal No. Ekstra bir parametre, işleve eklenecek yeni şeyler icat ettiğimizde daha sonra ekleyemeyeceğimiz anlamına gelir. Örneğin, $ string => trim () yalnızca boşluk bıraksa (4.1.0'dan önceki gibi), sisteminizde ISO-8859-1 dizelerinden $ string => trim ('ISO-8859-1') kırpılmış boşluk . Daha sonra boşluk olmayan şeyleri kırpmak istiyorsak, ilk önce insanları kodlamayı belirtmedikçe, bunun için parametre ekleyemeyiz. İnsanları UTF-8 olmayan herhangi bir metnin yanlış olduğuna inanmaya teşvik etmeliyiz .
rjmunro

40

Dil entegre bir sorgu motoru çok iyi olurdu. .NET'te bulunan ve LINQ adındakilere benzer. Büyük veri dizileri yoluyla sıralama yapmaya ve veritabanı erişimini standart hale getirmeye yardımcı olacak, böylece daha az SQL-enjeksiyon saldırısı başarılı olacaktı.


2
Parametreli sorguları kolaylaştıran her şey oyumu alır!
Dean Harding

1
Bence standartlaştırılmış veritabanı erişimi LINQ gibi bir şeyin çok önemli bir yararı olduğunu düşünüyorum çünkü bence veritabanı nesnelerinizin
alayları

Böyle bir şeyin çekirdeğe girmesi gerektiğini sanmıyorum. bir pecl uzantısına sığması daha iyi olur
11:17

38

Ah. İlkeller için ipucu yazın. İyi olur.


1
Her ne kadar PHP'nin KISS prensibini sevsem de (uzatmak için), şiddetle ikinci olarak. Bunun nedeni, gerçekten savunmacı olmak istiyorsanız, her bir ayarlayıcı yönteminde aynı tip kontrol kodunu kullanmanızdır. Eğer dil doğal olarak desteklenirse, bunu kolayca bırakabiliriz.
MicE

4
"Yazma ipucu" çok talihsiz bir addı, "ipucu" olmadığından, katı bir yazı. İlkel katı yazmanın PHP gibi dinamik bir dilde olacağını düşünüyorum. Zorlayıcı yazarak (dahili işlevlerin yaptığı aynı şey - strlen (123) deneyin) Tamam olabilir.
StasM

6
Bunun için +1. İşlev bildirimlerinde yazım ipucu (veya tam yazarak), EACH AND EVERY yönteminde (! İs_int ()) saçmalıyorsa, son derece yararlı olur ve çok fazla kesilir.
Phil Sturgeon

5
@StasM katılmıyorum. Kullanıcının dili statik olarak yazılmış bir şekilde kullanmayı seçmesine izin vermek dinamik bir dil kapsamındadır. Ve daha iyi hata yakalama için izin verir. İstemediyseniz kullanmak zorunda kalmazsınız, ama şahsen ben intikam istediğim dizgileri geçmekten bıktım ve aptal dizginin nerelere girdiğini bulmak için kod aramak zorunda kaldım Veya her zaman her şeyi kontrol etmeyi yazın.
Daniel Bingham,

2
@StasM Tamamen statik olarak yazılan değişkenleri tanıtmanızın hiçbir nedeni yoktur. Evet, kodunuzdaki hataları değiştirirsiniz. Tüm mesele bu olurdu. Hata, işlev çağrısı yerine işlev çağrısı sırasında ortaya çıkar - bu da hatanın nerede gerçekleştiği hakkında hiçbir fikrinizi bırakmaz. Tip dönüştürme hataları gelince, hata - fonksiyon çalışma çağrısında - çalışma zamanında evet meydana gelir. Buradaki sorunu doğru tipe dönüştürerek sorunu düzeltin. Bir dize sahip olmaktan çok daha iyi bir int bekleyen ve nereden bilmediğiniz bir işlevde görünür.
Daniel Bingham,

34

Kutudan daha iyi unicode desteği almak istiyorum. Dillerin çoğu bu yönde hareket eder, ancak PHP'nin her yerinde hala garip komutları vardır.

PHP dizeleri sadece düz bayt dizileridir. İçeriği, geçerli varsayılan kodlamaya bağlı olduğundan taşınabilir değildir.

Aynısı, serileştirme tarafından oluşturulan gösterimler için de geçerlidir. Herhangi bir kodlama bilgisini saklamadan, dizenin uzunluk-ön ekli bayt temsilini içerir.

Çoğu PHP (string) fonksiyonunun Unicode hakkında hiçbir fikri yoktur. Her bir fonksiyonun risk seviyesini içeren ayrıntılı bir liste için bakınız: http://www.phpwact.org/php/i18n/utf-8

http://blog.ginkel.com/2010/03/php-unicode-support-or-the-lack-thereof/


Unicode desteği, düşünceden çok daha zor oldu. Bu yüzden php6 çaba durdu. Şimdilik utf-8'e sahibiz ve bence gidilecek en iyi yol string dizeleri için utf-8 desteği eklemek olabilir, belki de intl eklentisinin bir parçası.
StasM,

3
Btw, alıntı yanlıştır. PHP dizeleri bayt dizileridir, ancak içerikleri sizin yaptığınız kadar taşınabilir ve "varsayılan kodlamaya" bağlı değildir - bu sadece bayt dizisidir, utf8'de, utf8'de, utf16'da olmasını ister - utf16'yı istersiniz. phpwact.org link ölü gibi görünüyor.
StasM

1
Gerçekten intl uzantısının varsayılan olarak etkinleştirileceğini umuyorum, bu nedenle UTF-8'e ihtiyaç duyan insanlar (herkes değil mi?) String işlevlerinin beklendiği gibi davranmasını sağlamak için ana bilgisayarlarıyla savaşmak zorunda kalmayacaklardı.
Emil Stenström

Ayrıca, iplerdeki açıklama için teşekkürler. Bir süredir PHP'den uzaktayım, bu yüzden biraz paslandım. Bunun yerine, PHP ile benzer problemleri olan Python ile unicode savaşı yaptım, ama onları Python 3'te
çözdüm. İsminde

Bu kesinlikle bir gelişme görmek istediğim bir alan.
Nathan Osman

32

Tutarsız olarak adlandırılmış ve değiştirilmiş nesne olmayanları değiştirmek için yerleşik yöntemlerle dizge nesnesi yapın. Örneğin

$subject->replace($search,$replace);
$string->split($separator);
$string->trim();

vb.

Düzenleme: bir şey daha: Bu yöntemler, özellikle kodlamalarla uğraşmayı amaçlayanlar dışında, her zaman UTF-8'i beklemeli ve yaymalıdır. Giriş geçersizse UTF-8, fonksiyonun çıkışı kodlamadan etkilenmese bile, bir istisna atılmalıdır.


Yukarı, tam olarak istediğim şey bu.
Kemo

1
subject->verb(object), parametre sırasının hatırlanmasını kolaylaştırır.
Ming-Tang,

+1 Böyle bir şeyi yapmak için kendi string sınıfımı yaratırken oynadım, kodlamayı çok kolaylaştırıyor ve parametre sıralamasını asla unutmuyorsunuz.
DisgruntledGoat

2
Peki ne geri is_object($string)dönecekti? Bu, ya uyumluluk zamanını geriye çeker ya da neredeyse sezgisel olmayan ama neredeyse hiç nesnelerin kullanılmamasına neden olur.
Tgr,

@Tgr: is_object () kullanımdan kaldırılmalıdır - "nesne değil" diye bir şey olmamalıdır. Kısa vadede, herhangi bir nesneyi kapatabileceğiniz bir özellik olmalı ve varsayılan dize yapıcıları onu kapatacaktı.
rjmunro

24

1) Yeni başlatılan nesnelerin "$ this" döndürmesini çok isterdim, böylece metod zincirini yapabilirim, $ user = new User ('john') -> setLastName ('Doe') -> save ();

2) Yakut ve en son kullanılan düğümleri kullandıysanız, etkileşimli bir kabuğu (IRB) vardır. PHP'nin gerçekten faydalı bir tanesine sahip olmasını çok isterdim.

3) Özellikler / Mixins, ama bunların yolda olduğunu duydum.

4) Kısa diziyi ikinci yapmak istiyorum $ myArray = ['my', 'array'];

5) Tutarlı adlandırma / sıralama (yani iğne samanlığı)


create()Sadece # 1 etrafında çalışmak için özel bir şey yapmaz bir yöntem oluşturmak zorunda nefret ediyorum !
Alan Pearce

Aynısını yapıyorum, ancak geç statik bağlama ve bir nesne üst sınıfı kullanarak, üst sınıfımı genişleten her sınıfın yöntemi var; örneğin: SomceClass, SuperObject {}; SomeClass ::) (oluşturun -> birYöntem ();
Aralık'ta

Github.com/philsturgeon/php-ps ' a bir göz atın . Bu sadece bir başlangıç ​​ama biraz yardımla oldukça faydalı olabilir.
Phil Sturgeon,

1
PHP'de hızlı deneyler yapmak için etkileşimli bir kabuk sunan bir PEAR paketi de var
pear.php.net/package/PHP_Shell

(yeni Foo ()) -> bar () 5.4'ün bir parçasıdır. 3) ve 4) de öyle.
StasM

20

1) içerir () kurtulun. Diğer dosyalara yapılan referanslar referans olmalı ve aslında bir kaynak kod dosyasının içeriğini bir başkasına yerleştirmemelidir. Çok fazla sayıda PHP programcısı, () bir kütüphane başvurusu yerine bir tür işlev çağrısı olarak kullanır. Bu, değişken durumdaki ve kararsız koddaki her türlü belirsizliğe yol açar. Bunu Perl benzeri 'use' komutuyla değiştirin.

2) PHP uygulamalarını tek bir dağıtılabilir bytecode dosyasına veya çalıştırılabilir dosyaya derlemek için lütfen bir kutu dışı yöntem verin. Bu, PHP'nin ticari bir geliştirme dili olarak cazibesini büyük ölçüde artıracaktır. Bu dilin temel bir bileşeni olmalıdır. Bir uygulamanın GUI'si için kullanılan html dosyaları için endişelenmeyin çünkü ...

3) PHP etiketlerini HTML'e gömme olanağından kurtulun. Ya da en azından bir 'embed yok' modu sağlayın. Bu mutlak bir karmaşadır ve uygulama mantığını ve sunumu bir araya getirerek kötü tasarımı teşvik eder. Geliştiriciler göstermek için şablonlar kullanmalı ve PHP dosyalarını birleştirmemeli ve en iyisini ummalılar.

İmza,

GrandmasterB

ps: burada başkalarının söylediklerini dinlemeyin, tüm yıl boyunca iyiydim


37
1). Kapsar harika. Her şey içeriyor. 2). Bu iyi. 3) Templating, PHP'nin en güçlü özelliğidir . Sizi başka bir baştan çıkarıcı saçmalık kullanmaya zorlamak çok kötü bir hareket olacaktır.
Josh K,

8
(1) ve (2) 'yi severim, fakat (3) geriye dönük bir adım gibi görünüyor. PHP size cazip güç verir, akıllıca kullanıp kullanmamanız size bağlıdır.
geekbrit

11
3 anlam ifade etmiyor - etiketleri gömmek MVC çerçevelerinde herhangi bir V için gereklidir.
Alex,

9
Bu cevabı "Sevgili Noel Baba, lütfen PHP'yi PHP yapmayın" olarak okudum.
Stephen,

1
PHP bir cazip dil olduğu için 3 haklı .
Andrew

18

E_ERRORTanımlanamayan sabitler için bir ini yönergesi , bunun bir dize olduğunu varsaymak yerine E_NOTICE.


1
Sınıf sabitleri bunu yapar, btw.
StasM

4
Cidden neden onların PHP'nin alıntı olmayan dizeleri varsaydığını iddia ettim. Bu şimdiye kadarki en aptalca şey. Ya E_ERRORda seçerdim E_PARSE.
BoltClock

14

Yeni gelenlere mantıklı gelen iyi düşünülmüş bir adlandırma kuralıyla küresel ad alanını normalleştirin!

Sevgili Jeff Atwood'dan alıntı yapmak için: PHP berbat ama önemli değil !


1
Prensipte aynı fikirdeyim ama pratikte nasıl yapılacağı hakkında hiçbir fikrim yok :)
StasM

3
@StasM: İlk adımın, kitaplıkların yeni sürümlerini ad alanını doldurmak ve programcıların (ini ayarları aracılığıyla) şu anki global kitaplıkları devre dışı bırakmasına izin vermek olacağını düşünüyorum. Bir uyumluluk paketinin eski sürümler için uygun olacağını, ancak yazması çok zor olmamalı olacağını düşünüyorum.
Michał T


13

1) Daha kısa bir dizi / nesne sözdizimi, bir la JavaScript (daha önce belirtildiği gibi)

2) constDeğişkenlere izin ver gibi bir hesaplamanın sonucuna izin verir define().

3) Doğrudan kurucudan zincirleme: new User()->name('Ryan');

4) Dizi yeniden düzenleme: something_that_returns_array()[4];

5) Genişletilmiş SPL desteği. SPL, dize ve dizi işlevlerini (diğer şeylerin yanı sıra) nesneler olarak yeniden tanımlamak için iyi bir iş yapar. SPL'yi genişletmek, dilin bu kadar titiz olmasıyla ilgili birçok zorluğu çözebilir.

6) Kullanım ArrayObject(), kullanmak kadar şeffaf olmalıdır array(). Sen gibi şeyler yapmak mümkün olmalıdır array_filter($array_object_instance)yapmadan array_filter($array_object_instance->getArrayCopy()). Daha da iyisi elbette olur $array_object_instance->filter().

7) Tam-Unicode tam güzel olurdu.

8) Tuhaf otomatik dönüşümler yapmayı bırakın. Örneğin, echoönce açıkça bir dize olarak yazmadan , bir SimpleXMLElement nesnesine erişememeniz gerekir. Ya da en azından, gerçekleştiğinde bir şey atmak (örneğin, katı modda veya her neyse error_reporting(-1)).

9) Birden fazla iş parçacığı ya da bir tür olay / asenkron geri çağırma desteği. Bu, cURL aracılığıyla büyük dosyaları yüklemeye çalışırken en önemli şeydir. Eski skool iplikleri yerine, Apple'ın Grand Central Dispatch gibi bir şey iyi olurdu. Ya da eşzamansız isteklerde bulunabileceğiniz ve geri aramaları tanımlayabileceğiniz JavaScript benzeri bir şey.

10) Tutarlı adlandırma / sıralama (yani iğne samanlığı) iyi olurdu, ama bunun SPL ile daha iyi çözülebileceğini düşünüyorum.

11) IRB gibi resmi olarak desteklenen etkileşimli bir PHP kabuğu. Facebook'ta phpshPython ile yazılmış bir tane var , ama görmek istediğim ciladan yoksun.

12) Reflection API için, (a) sabitler hakkındaki docblock yorumları (global ve sınıf) ve (b) PHPDoc benzeri yorumları mantıklı bir veri yapısına ayrıştırma desteği ekleyin. Bunu yapmaya çalışan "docblock" adlı bir PECL paketi var, ancak yazarın çok ileride olduğu ortaya çıkmadı.

EDIT: 13) Ayrıca kullanabilme yeteneğini !ve ?fonksiyon adlarında Ruby'yi yapabildiği gibi görmek isterim.


katılıyorum, bu arrayobject array_ * işlevleri için desteklenmesi gerektiğini. fakat arrayobject öğesinin alt sınıflarını düşünüyorsanız, "array_merge" gibi bir sonuç için beklenen sonuç ne olurdu. sadece aynı sınıfın örneklerini birleştirmenize izin verilir mi ve array_merge ne döndürürdü? Bir php dizisi veya arrayobject örneği (sırasıyla alt sınıfıdır)?
haberi

Veriler dahili olarak bir dizi olduğundan ve ArrayObject'in işlevselliği sağladığından, ArrayObject'in alt sınıflarının bile dizilerle dahili olarak çalışacağını iddia ediyorum. Başka bir standart dizi veya ArrayObject (veya alt sınıfı) birleştirmeyi beklerdim. Ne döndüğü kadarıyla, aynı zamanda yeni bir ArrayObject döndürmesi gerektiğini savunuyorum, ancak sonucun bir örneği olması gereken sınıfın adını belirleyebileceğiniz simplexml_load_string () kümesinin emsalini takip edin.
Ryan Parman

12

1) Python listesi anlama tarzında dizi anlama:

$newlist = array($x->something for $x in $oldlist);

//with short array syntax:
$newlist = [$x->something for $x in $oldlist];

2) Kısa dizi sözdizimi

$newlist = [1,2,3,4,...];

3) Boşaltın () '0' stringini true olarak düşünmeyin


2
(1) yineleyici pişmiş bir şey için & kapatma daha iyi olacağını düşünüyorum.
StasM,

+1 IMHO, iteratörlerin yanı sıra tüm dillere dahil edilmelidir. Olmaması için sadece yararlı bir yol.
Evan Plaice

empty()bunun mantıksal zıddıdır if ($x), yani doğru, mantıklıdır empty('0'), çünkü if ('0')yanlıştır. empty()Değişken ayarlanmamışsa tek fark, bir uyarı vermemektir.
Andrew

12

CONSTANT dizileri oluşturmanın / tanımlamanın yasal bir yöntemini görmek isterim. Bu tür bir işlevselliği simüle etmenin birkaç kesin yolu var ancak PHP'nin doğrudan bir özelliği olsaydı iyi olurdu. Java'nın "son" bildirgesine benzer bir şekilde bir dizi oluşturabilirseniz iyi olurdu.

Kurulumu çok hızlı bir giriş sistemi oluşturdum. Tek yapmanız gereken, kullanıcı bilgileri için istediğiniz alanları belirtmek için bir metin dosyasındaki bir dizinin içeriğini değiştirmek. Döngüler için bir alanın kullanılması, form oluşturma ve girdi hassaslaştırmasından veritabanı aramalarına kadar her şeyi idare eder, ancak hepsi bu orijinal diziye bağlıdır.

Diziyi içeren dosya izinlerle kilitlenir, ancak dizi eter içinde hareket ettiğinde değişkendir. Sistemin oldukça güvenli olduğunu hissetmeme rağmen, hiçbir şeyi şansa bırakmaktan hoşlanmıyorum. Dizileri sonlandırma yöntemi böyle bir durum için iyi olurdu.

Yeni fikir!!

Ohhh, gerçekten php'de gerçekten seveceğim başka bir şey düşündüm. Php dosya işlemlerini ve .htaccess çalışmalarına benzer dizin işlemlerini kontrol etmek için bir tür sistem istiyorum.

.Phpaccess dosyası aynı tür etki alanı / aynı köken politikasını tetiklemelidir.

Örneğin, sanal ana bilgisayarlara sahip birçok siteyi barındırıyor olsaydım, bir dizinde php'yi korumalı dizimde çalışmayı deneyen herhangi bir komut dosyasının düzenini kontrol etmesini söyleyen bir .phpaccess dosyası alabilirdim. Komut dosyası bu dizinden veya alt dizinlerinden gelmediyse, dosya işlemleri / veya yuva işlemleri reddedilir.

Bunun gibi bir sistemin sanal bir ortamı daha güvenli bir ortam haline getireceğini düşünüyorum. Bunlardan birini her sanal sunucunun en üstüne yerleştirebiliyorsanız, birisinin komşu sanal bir ana bilgisayardan gizlice girmesinin bir yolunu bulma şansını azaltır.

Ayrıca, onu bu şekilde tersine sabitleme yöntemine sahip olmak iyi olurdu. yani, betiklerin erişimini tek bir dizinde bu dizine sınırlamak.

Onun yin ve yang ya biliyor!


İçin +1 final. Açıklığa kavuşturmak için: finalbir değişkenin değerinin çalışma zamanında (sabit ifadelerin aksine, sabit ifadelerin aksine) ayarlanabileceği ancak yalnızca bir kez ayarlanabileceği anlamına gelir. Ayrıca bakınız C # readonly.
davidtbernal

1
alıcılar / alıcılar için sandıkla üst üste binecek vb. bir teklif var. Takas edilemez diziler muhtemelen zor olsa gerek.
StasM

Yeniden phpaccess, PHP zaten açıkladığınız şeyi yapan bir "güvenli mod" var.
DisgruntledGoat

11

Sert bir PHP programcısı olarak en büyük iki dileğim:

  1. Sonunda destek ver. Bayraklar veya benzeri yollarla kurgusal olarak bunun üstesinden gelmek büyük bir karmaşa.
  2. Alıcılar ve ayarlayıcılar için C # 'ın sözdiziminde desteği görmeyi çok isterim. Birçok alıcıya ve ayarlayıcıya sahip olduğunuzda, C # gibi basit bir sözdizimi, Java yolunu yapmak yerine alıcı ve ayarlayıcı yöntemleri yazmak yerine mükemmel bir performans artırıcısıdır. Sihirli yöntemler, dinamik olarak üyeler oluşturmak istediğiniz durumlarda (örneğin, bir şablon oluşturucuya bazı değişkenler kullanmak istiyorsanız), ancak IDE'nin otomatik olarak tamamlamasını istediğiniz normal özellikler için iyi değillerdir. türleri, vb. Bu, kodu daha küçük ve yine de okunabilir ve kullanımı kolay hale getirmeye yardımcı olur.

1
1. ne yazık ki, yapmak zor, ama kesinlikle iyi bir yapılacaklar öğesi 2. wiki.php.net/rfc/propertygetsetsyntax
StasM

@StasM: anotrasyonlarla yapmaya ne dersiniz? Satırları boyunca bir şeyler: / ** @get getFoo; @set setFoo; * / özel $ foo;
Michał T

9

Dil sözdizimi : bazı iyi ipucu vardır pihipi ve phpreboot geliştiricileri (phpreboot gider gerçi çok uzak JS olma) ilgilenen ne.

Geliştirme metodolojisi : Bu tür anketler gerçekten dikkate alınmışsa, PHP.net'in ömrünü büyük ölçüde artıracaktır. Daha willy-nilly öğleden sonra IRC oturumu sözdizimi kararları vermeyin.

Bireysel özellikler : Bazıları daha önce de belirtilmişti, ama burada ekstra kör olmak için mutlu bir şekilde biraz karma yakacağım:

  • Unicode dize türü.
  • Bigint (bkz. Python).
  • Runkit, her zaman bu kadar iyi tasarlanmayan yerleşik işlevleri ve sınıfları kaldırmak / yeniden adlandırmak / geçersiz kılmak için yerleşik.
  • Modern OOP
    • çoklu kalıtım (nadiren sakar özelliklere sahip sözdizimi vakalarını desteklemek için karmaşıklık yerine)
    • skalarlar nesne olarak iki katına çıkabilir (bkz. Python), örneğin array () ArrayObject olarak çalışır veya SplString olarak dizeler (kullanılabilir yöntemler gerekir, tüm dize işlevlerinin mevcut olması gerekir str::toupper())
  • Bok bok \isim alanı sözdizimini reddet, çözümleyiciyi düzelt ve ::alternatif olarak kabul et . Bilirsin, gerçek bir dil gibi.
  • LINQ'in herhangi bir çeşitlemesi (size güvenmeme rağmen, mantıklı bir sözdizimi geliştirirsiniz)
  • veya XML değişmezleri.
  • Php.ini çalışma zamanı davranışından ve anlamsal anahtarlardan kurtulun. Gerçek, heyecan bazılarını alır, ancak geliştiricilere ve kullanıcı tabanına fayda sağlayacaktır.
  • Evet, magic_quotes henüz gitmedi.
  • Zend Engine bayt kodunu PBC'ye dönüştürün

Yine de, eğer bu açık değilse, ikincisini yapmak için herkese memnuniyetle fon veririm ve ana uygulama olarak php.net'i öldürürüm. :P
Oh, farkettim, bu topluluk wiki. Yani aslında karma için burada değil, gerçek ilgi için burada bir şans var. Öyleyse, dili ciddi şekilde inciten <b> sayısına </b> bakın.


5
\ Namespace sözdiziminden nefret ediyorum ama neden bu kadar uzun ve üzücü bir hikaye oldu ve muhtemelen değişmeyecek ... Muhtemelen PHP'de birincil adayım olacak tek bir şeyi değiştirebilseydim. Ama olan bu.
StasM

@StasM: Geri bildiriminiz için teşekkürler ve bazı PHP konularında kaba davrandığınız için üzgünüm, fakat PHP'yi önemsiyorum; bu nedenle çok fikirli. - Sebep hakkında biraz okudum. Ters eğik çizgi ikilemi henüz çok büyük bir sorun değil, ancak kütüphanelerin yayılmasıyla gelecek yıl olacak. Bu yüzden umarım birileri \ cargo \ cult \ class \ names yazan alt çizgi programlarına geri dönen bir çözümleyici yazar.
mario

Belki de aptalım ama isim alanları için '::' veya '\' kullanmamızın farkı nedir?
Michał T

@Pies: ::Herhangi bir C / C ++ sözdizimi yakın dil için daha doğal olurdu. Ve `\`, tüm programlama dilleri arasında yalnızca anormal değildir , ancak denenmemiş çağrışımlara sahiptir. Daha önceki bazı tartışmalar: stackoverflow.com/questions/238550/… veya developers.slashdot.org/article.pl?sid=08/10/26/1610259 ve reddit.com/r/programming/comments/79cut/… - Ancak Özellikle geri bildirimde bulunmaksızın karar vermek ve geliştirici topluluğunu emmek için sinyal vermek çok hoş bir hareket değildi.
mario

1
Çoklu kalıtım için + 1000000.
ts01

8

Hatalar ve İstisnalar'ın tek bir konsepte (İstisnalar) birleştirilmesini görmek isterdim. Böcekleri bu şekilde bulmak ve düzeltmek için istisnaları yakalamak ve bunları bir günlüğe yazmak mümkün. Ancak, çok nadir karşılaşılan bir codepath'ta temel olarak yanlış bir şey varsa (okuma: PHP Hatası), bu bilgiyi aynı sorun veritabanına aktarmanın iyi bir yolu yoktur.

Lütfen, Santa, php.ini’de tüm hataları istisnalar haline getirecek bir anahtar ekleyin - ideal olarak, kodumda yakalayabileceğim istisnalar.


1
Motorda bunun için zaten bir destek var ve birçok uzantı kullanıyor. Ayrıca set_error_handler () ve ErrorException ile kolayca yapabilirsiniz. Ancak E_STRICT / E_NOTICE / E_DEPRECATED dikkat edin ...
StasM

Bu yöntemlerin farkındayım ve onlar gerçekten hack. Birleşik bir yolu çok isterim - E_STRICT / E_NOTICE ve benzeri.
Alex

7

PHP küçük ve orta büyüklükteki web sitelerini yıkamak için gayet uygun; Biraz düşüncesiz olmalıyım, bu sorunun cevabı olarak düşünebildiğim tek şey, trafiği yoğun olan siteler için daha iyi ölçeklendiren bir şey olabilir.

Başka bir süreçte çıktı sayfasını yaratırken süreçleri başka bir çekirdeğe atma, örneğin bir işlemde veritabanını güncelleme gibi düşünüyorum. Hızlı bir google araması bunun simüle edilebileceğini, ancak şu anda doğrudan php'de desteklenmediğini gösterir.


1
Aslında, daha fazla düşünmek, veritabanını boşaltmak ilginç bir senaryo gibi gözüküyor, bu yüzden +1 :)
StasM

1
@Stasm, ayrı taleplerin ayrı işlemler olarak çalıştığını kastettiğinizi varsayıyorum. Sayfa oluşturma ve arka plan hesaplama gerektiren karmaşık bir sayfadan bahsediyorum. Yanılıyor olabilirim, ancak veritabanı güncelleme işlemlerini ayrı bir süreçte ortaya çıkarmanın bir yolu olduğunu sanmıyorum. Bunu yapmanın nedeni, sayfanın seri olarak tamamlanmasını sağlamakla doğrudan ilgili olmayan tüm işlemleri beklemekten ziyade, sayfanın istek sahibine daha erken gönderilmesini sağlamaktır. PS .. Güncelleme için teşekkürler!
geekbrit

7

Skaler tiplerin nesne olarak değerlendirilmediğini ve gerçek nesnelerin başka herhangi bir tip veya nesne gibi davranamayacağını gerçekten çok özledim (__toString () nedeniyle dize hariç).


Evet, tipik tahmin için sihirli yöntemler lütfen.
Michał T

7
  • numaralandırma desteği (Java 1.5+ gibi)
  • Arayüzlerde ve sınıflarda yöntem geri dönüş türlerini tanımlayabilir
  • özellikler ve yöntemler hakkında ek açıklamalar / meta veri tanımı için destek.
  • yöntem skalar argümanları için katı tip ipucu yapabilir.

+1 Bunların hepsini PHP'de görmek isterdim.
Jeremy,


5

PHP'de oldukça iyi bir dizi dizi işlevi var, liste işleme kapasitesi, geri çağrılar ve create_function()temel lambda hesaplamaları sağlıyor.

Bununla ilgili asıl sorun, PHP'de çok ayrıntılı olması, özellikle harita / azalt komutları söz konusu olduğunda, kestirme bir sistem mükemmel olurdu.

Daha da önemlisi, liste işlevleri tam olarak tamamlanmadı:

  • foldrişlev yok , array_reduce()sağlarfoldl
  • array_map()olarak, İkinci değişken bir anahtar geçmesi gerekir array_walk()yapar
  • bir array_map_keys()anahtar değişikliği için faydalı olabilir
  • Liste anlama, çok aksak range(), array_fill()ve array_fill_keys()sadece bu kadar çok davalarını ve array_filter()ayrıdır

PHP'yi Haskell'e getirmeyi hedeflemiyorum, ancak PHP genellikle liste tipi veri yapısı manipülasyonu için kullanılır ve bu konuda eksiksiz bir araç setinin kullanılması yararlı olacaktır.


1
Bir meslektaşım, aynı zamanda, dizilim ile ilgili fonksiyonlarda başka ilaveler olabileceğini / olması gerektiğini düşünüyor; github hesabında belirtildiği gibi: bunlar bir geriçağırımla temsil edilen bir koşulun bir dizideki öğelerin tümü veya herhangi biri için geçerli olup olmadığını kontrol eden array_all () ve array_any () eksikliğidir. gist.github.com/44350
kguest

5

Operatör aşırı yüklenmesi:

$result = $MatrixA + $MatrixB * $MatrixC;

1
Bunun dinamik olarak yazılmış bir dil olması PHP ile ne kadar iyi sonuçlanacağından emin değil.
BoltClock

5
Belki de __add ($ obj), __times ($ obj) vb. Gibi sihirli yöntemlerle yapılmalıdır.
Michał T

zaten bir PECL uzantısı olarak var: pecl.php.net/package/operator . Ana kaynakla birleştirmek için çok fazla iş olmamalı
Xananax

4

E_WARNING üretmek yerine İstisnalar ekleyin ... Böyle bir şeyi kullanamam çok can sıkıcı:

try{
   $f = fopen('asd', 'r');
   flock($f, LOCK_SH);

   while(!feof($f)){
       echo fread($f, 512);
   }

   fclose($f);

}catch(IOException $ex){
   echo 'Oops, something wrong: '.$ex->getCode();
}

Tabii ki, şu anda çok pratik değil ama almak çok can sıkıcı:

UYARI

UYARI

UYARI

ve kendi istisnamı yazmadan kod akışını kontrol edemiyorum ve hangi hatanın üretildiğini koklayan string (izin, yanlış dosya adı veya başka bir şey; burada diğer hata kaynakları ile ilgilenmiyorum) doğru istisna atabilmek için kontrol edemiyorum .

Umarım neden önemli olduğunu açıklamamışımdır.

PHP bir süre önce Nesne Yönelimli oldu ve biz, PHP'yi kullanan programcılar, OO özelliklerini dört gözle bekliyoruz, "goto" yu tanıtmıyorlar ... Gerçekten de olduğunu öğrendiğimde, bunun bir April Fool günü olduğunu düşündüm.


Yakalanmadıkça, istisna senaryoyu öldürür. Bir üretim sunucusundaki uyarı günlüğe kaydedilir ve kullanıcıya gösterilmez. Bu işlevselliği değiştirmek artık pek çok komut dosyasını kırabilir çünkü onu yakalamak için tasarlanmamıştır. (Not, kendime istisnalar atmak için hata işleyicileri yazdığımı unutmayın). Şimdi, PDO şeyler uyarılar veya istisnalar atabilir: programcı çalışma zamanında karar verir. Bu işlevsellik muhtemelen modüllerin çoğuna eklenecek olandır.
Reece45,

4
  1. Nesne modelini birleştirin - tüm nesnelerin temel Object sınıfını genişletmesini sağlayın. Nesne sınıfı (diğer şeylerin yanı sıra) tüm sihir yöntemlerini uygular (böylece artık sihir olmaz!)

  2. Uzantıları kendi ad alanlarına taşı - genel ad alanını temizle $conn = new \MySQLi\Connection();

  3. spl_autoload()İşlevi sakatla ! Cidden, bu muhtemelen PHP'nin en büyük özelliklerinden biri ve aynı zamanda en yararsızı. spl_autoloadad alanlarını ve çoklu dosya uzantılarını destekleyen varsayılan otomatik yükleyicidir, ancak bilinmeyen bir nedenle dosya adlarının küçük harfli olmasını gerektirir. Bunun için doldurulmuş bir hata raporu var , ancak personel geriye dönük uyumluluk nedeniyle düzeltmeyeceklerini söyledi. Doğru ... varsayılan olanı sakat bıraktığından, her çerçevenin kendi otomatik yükleyicisiyle geldiği gibi değil!



4

Renk tonu desteğini en son sürüme getirin ve standart yapılara ekleyin, tercihen http://wiki.php.net/rfc/taint varsayılan yapılandırmasında açın

Bu, insanların kodlarını doğru bir şekilde yaparak XSS ve SQL enjeksiyon saldırılarını önler.

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.