คุณต้องการมีฟีเจอร์อะไรใน PHP? [ปิด]


88

เนื่องจากเป็นช่วงเทศกาลวันหยุดและทุกคนต้องการสิ่งนี้ฉันสงสัย - ฟีเจอร์ภาษาที่คุณต้องการจะเพิ่มใน PHP คืออะไร? ฉันสนใจคำแนะนำ / ความปรารถนาที่เป็นประโยชน์สำหรับภาษานี้ โดยการปฏิบัติฉันหมายถึง:

  1. สิ่งที่สามารถทำได้ในทางปฏิบัติ (ไม่ใช่: "ฉันหวังว่า PHP จะเดาว่ารหัสของฉันหมายถึงอะไรและแก้ไขข้อบกพร่องสำหรับฉัน" หรือ "ฉันหวังว่าโค้ดใด ๆ จะทำงานภายใต้ 5ms")
  2. บางสิ่งที่ไม่ต้องการเปลี่ยน PHP เป็นภาษาอื่น (ไม่ใช่: "ฉันหวังว่าพวกเขาจะลบเครื่องหมาย $ และใช้พื้นที่แทนวงเล็บปีกกา" หรือ "ฉันหวังว่า PHP ถูกคอมไพล์พิมพ์แบบสแตติกและมี # อยู่ในชื่อ")
  3. สิ่งที่ไม่ต้องการทำลายรหัสที่มีอยู่ทั้งหมด (ไม่ใช่: "ลองเปลี่ยนชื่อ 500 ฟังก์ชั่นและเปลี่ยนลำดับพารามิเตอร์สำหรับพวกเขา")
  4. สิ่งที่ไม่เปลี่ยนภาษาหรือบางแง่มุมที่น่าสนใจของมัน (ไม่ได้ "ผมต้องการมีส่วนขยายเพื่อรองรับการ XYZ โปรโตคอล" หรือ "ฉันหวังว่าข้อผิดพลาด # 12345 ได้รับการแก้ไขในที่สุด")
  5. บางสิ่งที่มากกว่าคำพูดโวยวาย (ไม่ใช่: "ฉันหวังว่า PHP จะไม่แย่ขนาดนั้น")

ใครมีความปรารถนาดีบ้างไหม?

Mod แก้ไข: Stanislav Malyshevเป็นผู้พัฒนา PHP หลัก


9
@Stan: เท่าที่คุณต้องการหลีกเลี่ยงความคิดเห็นแบบนั้นคุณจะได้รับมันต่อไป ปัญหา คน มีกับ PHP เป็นส่วนใหญ่ในประเภทของสิ่งที่คุณกำลังพิจารณาคดีออกไปในโพสต์ของคุณ [... ]
Fishtoaster

24
[... ] คุณกำลังพูดว่า "เราจะปรับปรุงประสบการณ์ในการตีใบหน้าได้อย่างไรโดยที่ไม่กระทบหน้าคุณจริง ๆ " ฉันหมายถึงใช่รับกาแฟฟรีในขณะที่เราถูกตีที่หน้าอาจจะดีมันไม่ได้จริง ๆ ปัญหาพื้นฐานมากมายด้วยดีถูกตีหน้า ดังนั้นในขณะที่ฉันหวังว่าคุณจะได้คำตอบที่เป็นประโยชน์ที่นี่
Fishtoaster

5
@ Fishtoaster: ถ้าผู้ที่เกี่ยวข้องกับ PHP ถูกตีเข้ามาหาคุณโดยทั้งหมดก็หลีกเลี่ยงมัน คุณไม่สนใจที่จะปรับปรุงมันอย่างแน่นอน มันจะเกิดขึ้นแม้ว่าจะมีคนที่เป็น หัวข้อนี้มีไว้สำหรับพวกเขาไม่ใช่สำหรับคุณ ฉันแน่ใจว่าเว็บไซต์นี้มีหัวข้อมากมายสำหรับคุณเช่นกันนี่ไม่ใช่เพียงหนึ่งในนั้น
StasM

5
ฉันกำลังใช้การโดนหน้าเป็นตัวอย่าง - สถานการณ์ที่การปรับปรุงผิวเผินไม่สำคัญ เมื่อคนส่วนใหญ่มีปัญหากับสิ่งที่อยู่ข้างใต้ ฉันไม่ได้แม้แต่เคาะความพยายามของคุณเพื่อรับข้อเสนอแนะสำหรับการปรับปรุงผิวเผินเหล่านั้น - ฉันแค่ชี้ให้เห็นว่าทำไมคุณถึงได้รับคำตอบที่ไม่ช่วยเหลือไม่กี่สถานการณ์
Fishtoaster

6
@ Fishtoaster: ไม่ใช่ทุกคนที่น่าแปลกใจเกลียด PHP - ฉันชอบมันมาตลอด ยืดหยุ่นและรวดเร็วมาก (เป็นรหัส)
Orbling

คำตอบ:


119

ฉันจะไม่รังเกียจพารามิเตอร์ชื่อ

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

น่าเสียดายที่ผู้พัฒนา PHP ใช้ความคิดนั้นลงไปแล้ว


1
เป็นรายการจากปี 2005 ความคิดมากมายถูกปิดตัวลงแล้วเกิดใหม่ ที่จริงแล้วหากมีการนำไปปฏิบัติที่ดีมามีโอกาสที่ดีที่จะได้รับการยอมรับ
StasM

21
เป็นคุณสมบัติหลามที่ฉันชอบ ทำให้รหัสเป็นเอกสารด้วยตัวเองอย่างมาก
Keyo

7
@ Josh K: เป็นไปได้นะ แต่การเรียก 'array' นั้นเป็นเรื่องไร้ประโยชน์ถ้าคุณต้องการ มันทำให้สับสนในสิ่งที่คุณพยายามทำ ตัวเลือกอื่นจะเป็นรูปแบบย่อของอาร์เรย์: make_img (['src' => 'blah.jpg', ... ]);
Erik van Brakel

2
@ เอริค: นั่นไม่ใช่ตัวเลือกที่ไม่ดีเช่นกันฉันกำลังบอกว่าทำไมเพิ่มความยุ่งเหยิงนี้ไปยังภาษาเมื่อคุณสามารถทำมันได้แล้วด้วย wrapper ของอาเรย์ย่อย
Josh K

4
@Erik: ไวยากรณ์ที่ผ่อนคลายมากขึ้นสำหรับอาร์เรย์ (เช่น[]ตัวดำเนินการของ JavaScript ) จะเป็นคุณลักษณะที่น่าชื่นชม
Josh K

93

การอ้างอิงเพิ่มเติม:

echo something_that_returns_array()[4];

อื่น ๆ ได้กล่าวถึงพารามิเตอร์ที่มีชื่อและไวยากรณ์ของอาร์เรย์ที่สั้นกว่า ฉันจะไม่สนใจไวยากรณ์วัตถุที่สั้นกว่าเช่นกัน

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

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

18
() [] ไวยากรณ์อยู่ในลำตัวแล้ว น่าเสียดายที่ทางลัดอาร์เรย์ถูกปฏิเสธ แต่ฉันหวังว่าจะคืนชีพ
StasM

2
ฉันจะรักคุณสมบัตินี้ ทำไมเราถึงมีบางอย่าง __atat_returns_object () -> 4 แต่ไม่ใช่อาร์เรย์?
Bala Clark

4
จาวาสคริปต์เช่นเดียวกับสัญลักษณ์ของอาร์เรย์และวัตถุจะสั่นคลอน ในฐานะนักพัฒนาส่วนหน้านั้นเป็นสิ่งที่รบกวนฉันมากที่สุดในรหัส PHP
Bleep Bloop

1
@DisgruntledGoat ทำอะไรได้โปรดดู:function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom

2
@DisgruntledGoat: ปัญหาเกี่ยวกับ()->ไวยากรณ์คือมันจะทำงานเฉพาะเมื่อวัตถุถูกส่งกลับเพื่อทำให้เรื่องแย่ลงวัตถุที่ต้องการแม้จะมีคุณสมบัติ / วิธีการของชื่อที่ระบุซึ่งอย่างดีที่สุดทำในสิ่งที่คุณหวังว่ามันจะทำ ในขณะที่ยอมรับพารามิเตอร์ที่คุณให้ไว้และอธิษฐานว่าไม่ต้องการอะไรอีกแล้ว ... ฯลฯ
phant0m

72

หลังจากทำงานกับ PHP ประมาณ 13 ปีและอย่างหนักกับ JS ประมาณ 4 มีสองสิ่งที่ฉันคิดว่า PHP จะกู้ได้ดีจาก JS:

1) การจดชวเลขสำหรับอาร์เรย์และวัตถุ ฉันเชื่อว่าสิ่งนี้อาจมีการพูดคุยและยิงลงบน Internals (ดังนั้นฉันได้ยิน - ฉันไม่ชอบที่จะดูว่าไส้กรอกทำอย่างไร) แต่ฉันจริง ๆ แล้วพบว่าสัญกรณ์แท้จริงของอาร์เรย์และวัตถุใน JS นั้นใหญ่มาก ผลิตผลชนะ

ตัวอย่างเช่น:

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

คือ (IMHO) ง่ายกว่ามากในการเขียนและทำความสะอาดกว่า

$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';

ฉันได้ยินมาว่ามีความกังวลบางอย่างเกี่ยวกับความสับสนที่อาจเกิดขึ้น แต่จริงๆแล้วมันสับสนกว่านี้ไหม อย่างน้อยที่สุดการสร้างวัตถุ stdClass ใน PHP นั้นเพียงพอที่จะกีดกันการปฏิบัติฉันคิดว่า

2) ความสามารถในการกำหนดฟังก์ชันและวิธีการที่กำหนดไว้ก่อนหน้านี้จะมีประโยชน์จริง ๆ มันจะลดความซับซ้อนของสถานการณ์โดยเฉพาะอย่างยิ่งการขยายชั้นเรียนและการยกระดับชั้นเรียนใหม่นั้นซับซ้อนหรือทำไม่ได้มากเกินไป ฉันคิดว่าเราควรหลีกเลี่ยงการกำหนดฟังก์ชันและวิธีการของ core / non-userspace ใหม่


นอกเหนือไปจากที่สองผมคิดว่าPHP ต้องโปร่งใสสนับสนุน Unicode นี่เป็นปัญหาสำหรับนักพัฒนามากขึ้นเรื่อย ๆ และการแก้ปัญหาที่มีอยู่ใน PHP ในปัจจุบันทำให้เกิดความสับสนและบ่อยครั้งที่ผู้ใช้ไม่มีประสิทธิภาพ การทำให้ฟังก์ชั่นสตริงมาตรฐานทั้งหมดเป็นมิตรกับผู้ใช้งานจะต้องเป็นสิ่งที่ดีสำหรับนักเขียนโปรแกรม PHP

ขอบคุณที่ถาม!


(2) ดูที่ runkit (3) unicode นั้นยากโดยเฉพาะอย่างยิ่งเนื่องจากโลกภายนอกส่วนใหญ่ไม่ได้เป็น unicode เราต้องฆ่าประสิทธิภาพหรือต้องการให้ผู้คนทำงานพิเศษมากมาย (เช่น Java) นั่นเป็นเหตุผลที่ php6 unicode ไม่ได้ผล
StasM

8
สำหรับยูนิโค้ด: มันอาจจะยาก แต่มันจะมีประโยชน์อย่างมากมาย (แน่นอนว่าการพัฒนา PHP นั้นยาก แต่ก็ให้ประโยชน์อย่างมากใช่มั้ย) บางทีทางออกอาจจะทำให้ยูนิโค้ดโปร่งใสผ่านส่วนขยายที่มีการแลกเปลี่ยนที่เข้าใจได้ เหมือน XHP เหรอ? ขอบคุณอีกครั้ง.
Funkatron

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

3
ฉันไม่เห็นว่าคุณจะเห็น "โลกภายนอกส่วนใหญ่ไม่ใช่ Unicode" ได้อย่างไร คุณกำลังพูดถึงคน? หรืออย่างอื่น? เพราะคนส่วนใหญ่ในโลกนี้ ( พูดน้อยมาก ) พูดภาษาที่ Unicode แสดงออกได้ดีที่สุด
Dean Harding

1
รองรับ Unicode อย่างแน่นอน การจัดส่งแอพที่ใช้ทั่วโลกไม่ว่าจะเป็นการเริ่มโดยไม่มีมัน การที่ PHP devs คิดว่าวิศวกรรมในการสนับสนุนยูนิโค้ดที่ดีนั้นง่ายหรือไม่นั้นอยู่ข้างจุด ผู้คนต้องการใช้งานและพวกเขากำลังเจาะระบบของพวกเขาเพื่อหลีกเลี่ยงความล้มเหลวของแพลตฟอร์ม Delphi ทำได้โดยการเพิ่มประเภทสตริงอื่นและทำให้มันเป็นค่าเริ่มต้นด้วยการคัดเลือกโดยปริยายและสลับระดับโลกเพื่อรับพฤติกรรมเดิมกลับมา ทำไม PHP ถึงทำไม่ได้เหมือนกัน?
Joeri Sebrechts

48

สิ่งที่ฉันต้องการในฐานะที่เป็นอดีต apologist PHP เป็นเวลานาน:

  1. ไวยากรณ์ที่สั้นกว่าสำหรับอาร์เรย์ อาร์เรย์ PHP เป็นหนึ่งในคุณสมบัติที่ awesomest ของภาษาเพราะความยืดหยุ่นของพวกเขา some_array_method($argity, array('key' => $value));แต่มันลากไปเขียน ฉันเชื่อว่าข้อเสนอนี้ถูกตรวจสอบแล้วในรายชื่อผู้รับจดหมาย PHP แต่น่าเสียดายที่
  2. finally สนับสนุน
  3. แอตทริบิวต์ / คำอธิบายประกอบ สิ่งเหล่านี้ช่วยให้คุณสามารถเพิ่มพฤติกรรมที่กำหนดเองให้กับวิธีการในวิธีที่อนุญาตให้ใช้รหัสซ้ำ ตัวอย่างเช่นในกรอบ MVC เราสามารถกำหนดAuthorizeAttributeว่าจะระบุว่าตัวควบคุมหรือวิธีการดำเนินการต้องให้ผู้ใช้ได้รับอนุญาต เฟรมเวิร์กจะรับผิดชอบในการค้นหาคุณลักษณะและดำเนินการตามนั้น ฉันเชื่อว่า PHPUnit ใช้คุณลักษณะประเภทหนึ่งอยู่แล้วโดยใส่ไว้ในความคิดเห็น docblock ซึ่งสามารถอ่านได้โดยใช้การสะท้อนกลับ
  4. ไวยากรณ์แลมบ์ดาที่สั้นกว่า แทนที่จะต้องเขียนfunction($x){ return $x*2;}ฉันอาจจะเขียน$x => return $x*2หรืออะไรก็ได้ นี่คือสิ่งที่เพิ่งจัดเรียงทำให้การใช้คุณสมบัตินี้เป็นเรื่องง่าย ตัวอย่างเช่น$results = array_filter(array(1,2,3), function($a) { return $a % 2; }):vs $results = array_filter(array(1,2,3), $a => return $a % 2 );อดีตมีเพียงการประปามากขึ้นซึ่งโดยทั่วไปไม่เกี่ยวข้องกับงานจริงที่คุณกำลังพยายามทำให้สำเร็จ
  5. บิวด์อินDecimal(คณิตศาสตร์คงที่) ที่สนับสนุนการดำเนินการทางคณิตศาสตร์ผ่านตัวดำเนินการปกติน่าจะดีเพราะเราไม่มีโอเปอเรเตอร์ที่บรรทุกเกินพิกัด
  6. วิธีการทางเวทมนตร์ของดวงจันทร์ วิธีการเวทมนต์นั้นยอดเยี่ยม ฉันเห็น PHP เพิ่มโอเปอร์เรเตอร์การโอเวอร์โหลดด้วยวิธีเวทย์มนตร์ (ฉันรู้ว่าสิ่งนี้จะไม่เกิดขึ้นโดยทั่วไป) แต่โดยทั่วไปแล้วพวกเขามีวิธีที่ยอดเยี่ยมในการใช้ภาษาและทำสิ่งดีๆ

48

ทำให้ PHP เป็นวัตถุที่มุ่งเน้นอย่างแท้จริง slap on another global functionวิวัฒนาการของ PHP ต้องการที่จะจบ

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

นี่เป็นเรื่องยากสำหรับฉันที่จะอ่าน ฉันต้องสร้างกองจิตของตัวเองและรวบรวมมันเอง โดยทั่วไปควรอ่านในสิ่งที่ตรงกันข้าม $dog->wakeup()->bark();อ่านง่ายเทียบกับbark(wakeup($dog))

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

คุณได้ทำตามขั้นตอนเพื่อเปิดใช้งานการสนับสนุนวัตถุ / วิธีตอนนี้โปรดใช้มันในฟังก์ชั่นหลักของ PHP ที่แท้จริง

ลองเปลี่ยนชื่อ 500 ฟังก์ชั่นและเปลี่ยนลำดับพารามิเตอร์

การเปลี่ยนการใช้งานฟังก์ชั่นนี้เป็นวิธีการจะทำให้สามารถเปลี่ยนชื่อได้โดยใช้วิธีการบางอย่างสม่ำเสมอ มันจะทำลายความเข้ากันได้ย้อนหลังหรือไม่ถ้าสตริงและอาร์เรย์มีวิธีการของตัวเอง?


3
ฉันคิดว่าอาเรย์ที่ไม่ใช่วัตถุประเภทนั้นเป็นความผิดพลาดครั้งใหญ่ใน PHP นำไปสู่ปัญหาทุกชนิด น่าเสียดายที่มันเป็นวิวัฒนาการ คุณสามารถทำสิ่งที่คุณต้องการที่นี่ด้วยส่วนขยายหรือพื้นที่ผู้ใช้ อาจจะเหมาะกับ SPL ได้ดี
StasM

3
อาร์กิวเมนต์เดียวกันนี้ใช้กับสตริง ฉันแค่หมายถึงการขาดวิธีการทั่วไป ภาษาเช่น Java, Python, C # และอื่น ๆ ทั้งหมดมีโค้ดที่อ่านได้มากขึ้น ฉันเดาว่าคุณกำลังมองหาคุณสมบัติ แต่การแก้ไขสิ่งที่ IMO เสียจะเป็นการจ่ายที่ดีกว่า
Keyo

6
ไม่ไม่โง่ มันจะเป็นdog_wake_up($dog); bark_dog($dog);
Matchu

2
IMHO เมธอดสตริงใหม่ใด ๆ ควรคาดหวังและปล่อย UTF-8 และโยนข้อยกเว้นหากอินพุตไม่ถูกต้อง UTF-8 สิ่งนี้จะลดความจำเป็นในการ reworking ที่สำคัญของการสนับสนุน unicode
rjmunro

1
@luiscubal ไม่พารามิเตอร์พิเศษจะหมายความว่าเราไม่สามารถเพิ่มพารามิเตอร์ได้ในภายหลังหากเราคิดค้นสิ่งใหม่เพื่อเพิ่มไปยังฟังก์ชัน ตัวอย่างเช่นถ้า $ string => trim () ทำแค่ช่องว่าง (เช่นก่อนหน้า 4.1.0) ระบบของคุณจะพูดว่า $ string => trim ('ISO-8859-1') ตัดช่องว่างจาก ISO-8859-1 . ถ้าเราต้องการที่จะตัดแต่งสิ่งที่ไม่ใช่ช่องว่างเราไม่สามารถเพิ่มพารามิเตอร์สำหรับสิ่งนั้นได้เว้นแต่ว่าเราจะทำให้ผู้คนระบุการเข้ารหัสก่อน เราควรจะส่งเสริมให้คนที่จะเชื่อว่าข้อความใด ๆ ที่ใดก็ได้ที่ไม่ได้เป็น UTF-8 เป็นที่ไม่ถูกต้อง
rjmunro

40

เครื่องมือสืบค้นข้อมูลทางภาษานั้นยอดเยี่ยม ประเภทของสิ่งที่มีอยู่ใน. NET เรียกว่า LINQ มันจะช่วยเรียงลำดับข้อมูลจำนวนมหาศาลและสร้างมาตรฐานการเข้าถึงฐานข้อมูลเพื่อให้การโจมตี SQL-injection น้อยลง


2
อะไรก็ตามที่ทำให้ข้อความค้นหาที่กำหนดพารามิเตอร์ง่ายขึ้นจะได้รับคะแนนของฉัน!
Dean Harding

1
ผมคิดว่าการเข้าถึงฐานข้อมูลมาตรฐานเป็นจริงผลประโยชน์ที่สำคัญมากของสิ่งที่ต้องการ LINQ เพราะผมคิดว่ามันทำให้การทดสอบหน่วยที่มี mocks ของวัตถุฐานข้อมูลของคุณได้ง่ายขึ้น (ตั้งแต่คุณกำลังเยาะเย้ยโค้ด PHP แทนแบบสอบถาม SQL.)
davidtbernal

ฉันไม่คิดว่าสิ่งนี้ควรเป็นหลัก มันจะดีกว่าแบบที่เป็นส่วนขยาย PECL
แฮรัลด์

38

โอ้ พิมพ์คำใบ้สำหรับดั้งเดิม นั่นคงจะดีนะ


1
แม้ว่าฉันจะชอบหลักการ KISS ของ PHP (สำหรับการขยาย) แต่ฉันก็ขออย่างที่สอง เหตุผลก็คือถ้าคุณต้องการที่จะป้องกันจริง ๆ คุณท้ายด้วยรหัสการตรวจสอบชนิดเดียวกันในแต่ละวิธี setter เราสามารถดรอปได้อย่างง่ายดายหากภาษานั้นรองรับโดยกำเนิด
MicE

4
"การบอกใบ้ประเภท" เป็นชื่อที่โชคร้ายมากเพราะไม่ใช่ "การบอกใบ้" มันเป็นการพิมพ์ที่เข้มงวด ฉันคิดว่าการพิมพ์ที่เข้มงวดดั้งเดิมจะไม่เกิดขึ้นในภาษาแบบไดนามิกเช่น PHP บีบบังคับพิมพ์ (สิ่งเดียวกันกับที่ฟังก์ชั่นภายในทำ - ลอง strlen (123)) อาจจะโอเค
StasM

6
+1 สำหรับสิ่งนี้ พิมพ์คำใบ้ (หรือการพิมพ์ที่เข้มงวด) ในการประกาศฟังก์ชั่นจะมีประโยชน์อย่างไม่น่าเชื่อและลดลงมากถ้า (! is_int ()) อึในวิธี EACH และทุก ๆ
Phil Sturgeon

5
@StasM ฉันไม่เห็นด้วย มันสมบูรณ์แบบในขอบเขตของภาษาแบบไดนามิกเพื่อให้ผู้ใช้สามารถเลือกใช้ภาษาในลักษณะที่พิมพ์แบบคงที่ และมันจะช่วยให้จับข้อผิดพลาดได้ดีขึ้นมาก คุณไม่จำเป็นต้องใช้มันหากคุณไม่ต้องการ แต่โดยส่วนตัวแล้วฉันเบื่อที่จะมีสายอักขระที่ฉันต้องการ int แล้วต้องค้นหารหัสเพื่อหาว่าสตริงโง่กำลังถูกส่งผ่าน หรือมิฉะนั้นให้พิมพ์การตรวจสอบทุกอย่างตลอดเวลา
Daniel Bingham

2
@StasM ไม่มีเหตุผลที่คุณจะต้องแนะนำตัวแปรที่พิมพ์แบบสแตติกทั้งหมด ใช่คุณจะเปลี่ยนข้อผิดพลาดในรหัสของคุณ นั่นจะเป็นประเด็นทั้งหมด ข้อผิดพลาดจะเกิดขึ้นที่เวลาเรียกใช้ฟังก์ชันแทนที่จะอยู่ภายในฟังก์ชั่นซึ่งจะทำให้คุณไม่รู้ว่าเกิดข้อผิดพลาดขึ้นจริง สำหรับข้อผิดพลาดในการแปลงประเภทข้อผิดพลาดจะเกิดขึ้น - ใช่ในขณะดำเนินการ - ที่การเรียกใช้ฟังก์ชัน แก้ไขปัญหาโดยแปลงเป็นประเภทที่ถูกต้อง ดีกว่าการมีสตริงปรากฏในฟังก์ชั่นที่คาดหวัง int และไม่รู้จากที่
Daniel Bingham

34

ฉันหวังว่าจะได้รับการสนับสนุน Unicode ที่ดีกว่านอกกรอบ ภาษาส่วนใหญ่เคลื่อนไปในทิศทางนั้น แต่ PHP ยังมีคำสั่งแปลก ๆ ที่เกลื่อนไปหมด

สตริง PHP เป็นเพียงอาร์เรย์ไบต์ธรรมดา เนื้อหาไม่สามารถเคลื่อนย้ายได้เนื่องจากขึ้นอยู่กับการเข้ารหัสเริ่มต้นปัจจุบัน

เช่นเดียวกับการเป็นตัวแทนที่สร้างขึ้นโดยทำให้เป็นอันดับ มันมีการแสดงไบต์ยาวของคำนำหน้าโดยไม่ต้องเก็บข้อมูลการเข้ารหัสใด ๆ

ฟังก์ชัน PHP (สตริง) ส่วนใหญ่ไม่มีเงื่อนงำเกี่ยวกับ Unicode สำหรับรายการโดยละเอียดรวมถึงระดับความเสี่ยงของแต่ละฟังก์ชั่นโปรดดูที่: http://www.phpwact.org/php/i18n/utf-8

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


การสนับสนุน Unicode พิสูจน์ได้ยากกว่าที่คิด นั่นเป็นเหตุผลที่ php6 พยายามจนตรอก สำหรับตอนนี้เรามี utf-8 และฉันคิดว่าวิธีที่ดีที่สุดที่จะไปคือการเพิ่มการสนับสนุน utf-8 สำหรับฟังก์ชั่นสตริงซึ่งอาจเป็นส่วนหนึ่งของส่วนขยาย intl
StasM

3
BTW คำพูดไม่ถูกต้อง สตริง PHP เป็นอาร์เรย์ไบต์ แต่เนื้อหาเป็นแบบพกพาเท่าที่คุณทำและไม่ได้ขึ้นอยู่กับ "การเข้ารหัสเริ่มต้น" - มันเป็นเพียงอาร์เรย์ไบต์คุณต้องการใน utf8, ใส่ utf8, ต้องการ utf16 - ใส่ utf16 ดูเหมือนว่าลิงก์ phpwact.org จะตาย
StasM

1
ฉันหวังว่าส่วนขยาย intl จะเปิดใช้งานโดยค่าเริ่มต้นดังนั้นผู้ที่ต้องการ UTF-8 (ไม่ใช่ทุกคนหรือไม่) ไม่ต้องต่อสู้กับโฮสต์ของพวกเขาเพื่อให้ฟังก์ชันสตริงทำงานเหมือนที่คาดไว้
Emil Stenström

นอกจากนี้ขอขอบคุณสำหรับการชี้แจงเกี่ยวกับสตริง ฉันอยู่ห่างจาก PHP มาระยะหนึ่งแล้วดังนั้นฉันจึงเป็นสนิมเล็กน้อย ฉันได้ต่อสู้กับยูนิโคดสงครามกับ Python ซึ่งมีปัญหาคล้าย ๆ กับที่เป็นของ PHP แต่ได้แก้ไขพวกมันใน Python 3 การมีสวีเดน "ö" ในชื่อของคุณเป็นเรื่องยุ่ง :)
Emil Stenström

นี่เป็นหนึ่งในพื้นที่ที่ฉันอยากจะเห็นการปรับปรุงใน
นาธานออสมัน

32

ทำให้วัตถุสตริงเช่นกับวิธีการในตัวเพื่อแทนที่ชื่อที่ไม่สอดคล้องกันและพารามิเตอร์ที่ไม่ใช่วัตถุ เช่น

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

เป็นต้น

แก้ไข:อีกหนึ่งสิ่ง: วิธีการเหล่านี้ควรคาดหวังและปล่อย UTF-8 เสมอยกเว้นวิธีที่ตั้งใจไว้เฉพาะเพื่อจัดการกับการเข้ารหัส หากอินพุตไม่ถูกต้อง UTF-8 ข้อยกเว้นควรถูกโยนแม้ว่าเอาต์พุตของฟังก์ชันจะไม่ได้รับผลกระทบจากการเข้ารหัส


นั่นคือสิ่งที่ฉันตั้งใจจะทำ
Kemo

1
subject->verb(object)ทำให้การสั่งซื้อพารามิเตอร์ง่ายต่อการจดจำ
Ming-Tang

+1 ฉันเล่นด้วยการสร้างคลาสสตริงของตัวเองเพื่อทำสิ่งนี้มันทำให้การเขียนโค้ดง่ายขึ้นมากและคุณจะไม่มีวันลืมพารามิเตอร์การสั่งซื้อ
DisgruntledGoat

2
แล้วอะไรจะis_object($string)กลับมา สิ่งนี้อาจทำลายความเข้ากันได้ย้อนหลังครั้งใหญ่หรือส่งผลให้เกิดการแนะนำวัตถุที่แทบไม่ได้ใช้งานจริง ๆ
Tgr

@Tgr: is_object () ควรเลิกใช้ - ไม่ควรมีสิ่งใด ๆ เช่น "ไม่ใช่วัตถุ" ในระยะสั้นมันจะต้องเป็นคุณสมบัติที่คุณสามารถปิดวัตถุใด ๆ และตัวสร้างสตริงเริ่มต้นจะปิด
rjmunro

24

1) ฉันชอบที่จะสร้างอินสแตนซ์ของวัตถุใหม่เพื่อคืนค่า "$ this" ดังนั้นฉันสามารถใช้เมธอด chain, $ user = new User ('john') -> setLastName ('Doe') -> save ();

2) หากคุณเคยใช้ ruby ​​และล่าสุด node พวกเขามีเปลือกโต้ตอบที่ยอดเยี่ยม (IRB) ฉันชอบ PHP ที่มีประโยชน์จริง ๆ

3) ลักษณะ / มิกซ์อิน แต่ฉันได้ยินว่ามันกำลังมา

4) ฉันต้องการวินาทีที่มีอาร์เรย์แบบสั้น $ myArray = ['my', 'array'];

5) การตั้งชื่อที่สอดคล้อง / คำสั่งซื้อ (เช่นเข็มฟาง)


ฉันเกลียดที่จะต้องสร้างcreate()วิธีการที่ไม่ทำอะไรเป็นพิเศษเพื่อหลีกเลี่ยง # 1!
Alan Pearce

ฉันทำเช่นเดียวกัน แต่ใช้การเชื่อมโยงคงที่ในช่วงปลายและวัตถุ superclass วิธีที่ทุกชั้นเรียนที่ขยาย superclass ของฉันมีวิธีการเช่น: SomceClass ขยาย SuperObject {}; SomeClass :: สร้าง () -> SomeMethod ();
dukeofgaming

ลองดูที่github.com/philsturgeon/php-psเป็นเพียงการเริ่มต้น แต่ด้วยความช่วยเหลือบางอย่างมันอาจมีประโยชน์ทีเดียว
Phil Sturgeon

1
นอกจากนี้ยังมีแพคเกจลูกแพร์ที่มีเปลือกโต้ตอบสำหรับการเข้ารหัสการทดลองอย่างรวดเร็วใน PHP - ใช้ได้ที่pear.php.net/package/PHP_Shell
kguest

(ใหม่ Foo ()) -> bar () เป็นส่วนหนึ่งของ 5.4 3) และ 4) ก็เช่นกัน
StasM

20

1) โปรดกำจัดการรวม () การอ้างอิงไปยังไฟล์อื่นควรเป็นการอ้างอิงไม่ใช่การวางเนื้อหาของไฟล์ซอร์สโค้ดหนึ่งไปยังไฟล์อื่น นักเขียนโปรแกรม PHP ใช้งานมากเกินไปรวมถึง () เป็นประเภทของการเรียกใช้ฟังก์ชันแทนที่จะเป็นวิธีการอ้างอิงไลบรารี สิ่งนี้นำไปสู่ความคลุมเครือทุกประเภทในสถานะตัวแปรและรหัสที่ไม่เสถียร แทนที่สิ่งนี้ด้วยคำสั่ง 'ใช้' ที่เหมือน Perl

2) โปรดระบุ นอกกรอบในการรวบรวมแอปพลิเคชั่น PHP เป็นไฟล์ bytecode ที่สามารถแจกจ่ายต่อได้หรือเอ็กซีคิวต์ สิ่งนี้จะช่วยเพิ่มความน่าดึงดูดใจของ PHP ในฐานะภาษาการพัฒนาเชิงพาณิชย์ นี่ควรเป็นองค์ประกอบพื้นฐานของภาษา อย่ากังวลเกี่ยวกับไฟล์ html ที่ใช้สำหรับ GUI ของแอปพลิเคชันเพราะ ...

3) โปรดกำจัดความสามารถในการฝังแท็ก PHP ลงใน HTML หรืออย่างน้อยก็ให้โหมด 'ไม่มีการฝัง' นี่เป็นความยุ่งเหยิงอย่างแน่นอนและกระตุ้นให้เกิดการออกแบบที่ไม่ดีโดยการผสมตรรกะแอปพลิเคชันและการนำเสนอเข้าด้วยกัน นักพัฒนาควรใช้เทมเพลตสำหรับแสดงและไม่ตบไฟล์ PHP ด้วยกันและหวังว่าจะดีที่สุด

ลงนาม

GrandmasterB

ps: อย่าฟังสิ่งที่คนอื่นพูดที่นี่ฉันสบายดีทั้งปี


37
1) รวมถึงที่ดี ทุกอย่างรวมถึง 2) ดีจัง. 3) Templating เป็นของ PHP คุณลักษณะที่แข็งแกร่ง การบังคับให้คุณใช้พล่ามเทมเพลตอื่น ๆ น่าจะเป็นการเคลื่อนไหวที่แย่มาก
Josh K

8
ฉันชอบ (1) และ (2) แต่ (3) ดูเหมือนว่าจะเป็นถอยหลังเข้าคลอง PHP ให้พลังเทมเพลตแก่คุณขึ้นอยู่กับคุณว่าคุณจะใช้อย่างชาญฉลาดหรือไม่ก็ตาม
geekbrit

11
3 ไม่มีเหตุผล - แท็กการฝังจำเป็นสำหรับ V ใด ๆ ในกรอบ MVC
Alex

9
ฉันอ่านคำตอบนี้เป็น "เรียนซานต้าโปรดทำให้ PHP ไม่ใช่ PHP"
Stephen

1
3 ไม่ถูกต้องเนื่องจาก PHP เป็นภาษาที่สร้างเทมเพลท
แอนดรู

18

คำสั่ง INI ไปในที่ไม่ได้กำหนดค่าคงที่มากกว่าถือว่าเป็นสตริงกับE_ERRORE_NOTICE


1
ค่าคงที่คลาสทำเช่นนั้น btw
StasM

4
อย่างจริงจังฉันไม่เข้าใจว่าทำไมพวกเขาทำให้ PHP ถือว่าสตริงไม่ได้พูดถึง มันเป็นสิ่งที่โง่ที่สุดที่เคยมีมา ผมจะเลือกอย่างใดอย่างหนึ่งหรือE_ERROR E_PARSE
BoltClock

14

ทำให้เนมสเปซทั่วโลกเป็นแบบปกติด้วยหลักการตั้งชื่อที่คิดมาอย่างดีซึ่งเหมาะสมกับผู้มาใหม่!

เพื่ออ้างอิง Jeff Atwood ที่รักของเรา: PHP sucks แต่มันไม่สำคัญ !


1
ฉันเห็นด้วยในหลักการ แต่ไม่มีความคิดว่าจะทำอย่างไรในทางปฏิบัติ :)
StasM

3
@StasM: ฉันคิดว่าขั้นตอนแรกคือการสร้าง namespaced ไลบรารี่รุ่นใหม่และอนุญาตให้โปรแกรมเมอร์ (ผ่านการตั้งค่า ini) ปิดการใช้งานไลบรารี่ทั่วโลกในปัจจุบัน ฉันคิดว่า pack ที่ใช้งานร่วมกันได้จะเป็นเวอร์ชั่นเก่า แต่ไม่ควรเขียนยาก
Michał T


13

1) Shorter array / syntax a la JavaScript (ดังที่ได้กล่าวไว้ก่อนหน้านี้)

2) อนุญาตให้constตัวแปรเพื่อให้ผลลัพธ์ของการคำนวณเหมือนdefine()กัน

3) การเชื่อมโยงโดยตรงจากตัวสร้าง: new User()->name('Ryan');

4) การยกเลิกการลงทะเบียนอาร์เรย์: something_that_returns_array()[4];

5) การสนับสนุน SPL แบบขยาย SPL ทำงานได้ดีในการคำนวณฟังก์ชั่นสตริงและอาร์เรย์ (เหนือสิ่งอื่นใด) เป็นวัตถุ การขยาย SPL สามารถแก้ปัญหาได้อย่างมากมายเกี่ยวกับภาษาที่ไม่มั่นคง

6) การใช้ควรจะเป็นความโปร่งใสการใช้ArrayObject() array()คุณควรจะสามารถทำสิ่งที่ต้องการโดยไม่ต้องทำarray_filter($array_object_instance) array_filter($array_object_instance->getArrayCopy())แน่นอนยิ่งกว่านั้นก็$array_object_instance->filter()คือ

7) Unicode แบบเต็มจะดี

8) หยุดทำการแปลงประเภทอัตโนมัติแปลก ๆ ตัวอย่างเช่นคุณไม่ควรechoวัตถุ SimpleXMLElement โดยไม่ต้องพิมพ์เป็นสตริงก่อน หรืออย่างน้อยก็โยนอะไรบางอย่างเมื่อมันเกิดขึ้น (เช่นในโหมดเข้มงวดหรือโหมดอะไรก็ตามerror_reporting(-1))

9) รองรับหลายเธรดหรือการโทรกลับที่มีเหตุการณ์ / แบบอะซิงโครนัสบางประเภท สิ่งนี้สำคัญที่สุดเมื่อพยายามอัปโหลดไฟล์ขนาดใหญ่ผ่านทาง cURL แทนที่จะเป็นหัวข้อแบบเก่า ๆ สิ่งที่คล้ายกับ Grand Central Dispatch น่าจะดี หรือแม้กระทั่งบางสิ่งที่เหมือน JavaScript ที่คุณสามารถร้องขอ async และกำหนด callback

10) การตั้งชื่อ / คำสั่งที่สอดคล้องกัน (เช่นเข็มฟาง) จะดี แต่ฉันคิดว่านี่น่าจะแก้ไขได้ดีกว่าด้วย SPL

11) เชลล์ PHP เชิงโต้ตอบที่สนับสนุนอย่างเป็นทางการเช่น IRB Facebook มีหนึ่งชื่อphpshที่เขียนขึ้นใน Python แต่ไม่มีภาษาโปแลนด์ที่ฉันอยากเห็น

12) สำหรับ Reflection API ให้เพิ่มการสนับสนุนสำหรับ (a) ความคิดเห็น docblock เกี่ยวกับค่าคงที่ (ระดับโลก & คลาส) และ (b) การสนับสนุนสำหรับการแยกวิเคราะห์ความคิดเห็น PHPDoc เหมือนในโครงสร้างข้อมูลที่สมเหตุสมผล มีแพ็กเกจ PECL ชื่อ "docblock" ที่พยายามทำเช่นนี้ แต่ไม่ปรากฏว่าผู้เขียนมาไกลเกินไป

แก้ไข: 13) ฉันยังชอบที่จะเห็นความสามารถในการใช้!และ?ในชื่อฟังก์ชั่น - เช่นทับทิมสามารถ


ฉันยอมรับ arrayobject ที่ควรได้รับการสนับสนุนสำหรับฟังก์ชั่น array_ * แต่สิ่งที่จะเป็นผลลัพธ์ที่คาดหวังสำหรับบางอย่างเช่น "array_merge" ถ้าคุณพิจารณา subclasses ของ arrayobject คุณจะได้รับอนุญาตให้รวมอินสแตนซ์ของคลาสเดียวกันเท่านั้นและ array_merge จะส่งคืนอะไรบ้าง อาร์เรย์ php หรือตัวอย่างของ arrayobject (ตามลำดับเป็น subclass)?
แฮรัลด์

ฉันจะโต้แย้งว่าเนื่องจากข้อมูลภายในเป็นอาร์เรย์และ ArrayObject ล้อมรอบด้วยฟังก์ชันดังนั้นแม้แต่ subclasses ของ ArrayObject ก็ยังคงทำงานกับอาร์เรย์ภายในได้ ฉันคาดว่าจะสามารถรวมอาร์เรย์มาตรฐานอื่นหรือ ArrayObject (หรือคลาสย่อย) เท่าที่มันจะกลับมาฉันจะยืนยันว่ามันควรจะกลับ ArrayObject ใหม่ แต่ทำตามก่อนหน้านี้ที่ simplexml_load_string () ชุดที่คุณสามารถระบุชื่อของคลาสที่ผลควรเป็นตัวอย่างของ
Ryan Parman

12

1) Array comprehension ในรูปแบบของ Python list comprehension:

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

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

2) ไวยากรณ์ของอาร์เรย์แบบสั้น

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

3) ทำให้ empty () ไม่ถือว่าสตริง '0' เป็นจริง


2
ฉันคิดว่า (1) บางอย่างที่ปรุงจากตัววนซ้ำ & การปิดจะดีกว่า
StasM

+1 IMHO ซึ่งควรรวมอยู่ในทุกภาษาเช่นเดียวกับตัววนซ้ำ พวกมันเป็นเพียงวิธีที่มีประโยชน์ที่จะไม่มี
Evan Plaice

empty()เป็นสิ่งที่ตรงกันข้ามกับเหตุผลif ($x)ดังนั้นมันจึงสมเหตุสมผลว่าempty('0')เป็นความจริงเพราะif ('0')เป็นเท็จ ข้อแตกต่างเพียงอย่างเดียวคือempty()ไม่ต้องแจ้งให้ทราบหากไม่ได้ตั้งค่าตัวแปร
Andrew

12

ฉันต้องการดูวิธีการที่ถูกต้องในการสร้าง / กำหนดค่าคงที่ของอาร์เรย์ มีวิธีการแฮ็กบางอย่างเพื่อจำลองฟังก์ชันการทำงานชนิดนี้ แต่มันจะดีถ้ามันเป็นคุณสมบัติตรงของ PHP มันจะดีถ้าคุณสามารถสร้างอาร์เรย์ในลักษณะที่คล้ายกับการประกาศ "สุดท้าย" ของ Java

ฉันสร้างระบบเข้าสู่ระบบที่รวดเร็วในการติดตั้ง สิ่งที่คุณต้องทำคือเปลี่ยนเนื้อหาของอาเรย์ในไฟล์ข้อความเพื่อระบุฟิลด์ที่คุณต้องการข้อมูลผู้ใช้ การใช้คำสั่งวนรอบสำหรับลูปจะจัดการทุกอย่างตั้งแต่การสร้างแบบฟอร์มและการรับสัญญาณอินพุตไปจนถึงการโทรไปยังฐานข้อมูล แต่ทุกอย่างขึ้นอยู่กับอาร์เรย์ดั้งเดิมนี้

ไฟล์ที่มีอาเรย์ถูกล็อคไว้ด้วยสิทธิ์ แต่เมื่ออาเรย์เคลื่อนไปรอบ ๆ ในอีเธอร์มันจะไม่แน่นอน แม้ว่าฉันจะรู้สึกว่าระบบมีความปลอดภัย แต่ฉันไม่ชอบที่จะปล่อยให้สิ่งใดเกิดขึ้น วิธีการในการสรุปอาร์เรย์จะดีสำหรับสถานการณ์เช่นนี้

ความคิดใหม่ !!

โอ้ฉันคิดว่าอย่างอื่นฉันจะชอบ php จริงๆ ฉันต้องการให้ระบบควบคุมการทำงานของไฟล์ php และการทำงานของไดเรกทอรีคล้ายกับวิธีการ. htaccess

ไฟล์. phpaccess ควรทริกเกอร์โดเมนเดียวกัน / นโยบายกำเนิดเดียวกัน

ตัวอย่างเช่นหากฉันโฮสต์หลายไซต์ที่มีโฮสต์เสมือนฉันอาจมีไฟล์. phpaccess ในไดเรกทอรีที่จะบอก php เพื่อตรวจสอบ orgin ของสคริปต์ใด ๆ ที่กำลังดำเนินการซึ่งกำลังพยายามใช้งานในไดเรกทอรีที่ป้องกันของฉัน หากสคริปต์ไม่ได้มาจากไดเรกทอรีนั้นหรือไดเรกทอรีย่อยการดำเนินงานของไฟล์ / หรือซ็อกเก็ตจะถูกปฏิเสธ

ฉันคิดว่าระบบเช่นนี้จะทำให้การโฮสต์เสมือนในสภาพแวดล้อมที่ปลอดภัยยิ่งขึ้น หากคุณสามารถวางหนึ่งในสิ่งเหล่านี้ที่ด้านบนของแต่ละโฮสต์เสมือนมันจะช่วยลดโอกาสที่บางคนหาวิธีที่จะแอบเข้ามาจากโฮสต์เสมือนที่อยู่ใกล้เคียง

นอกจากนี้ถ้ามันจะดีที่มีวิธีการรักษาความปลอดภัยในการผกผันของลักษณะนี้ เช่น จำกัด การเข้าถึงสคริปต์ในไดเรกทอรีเดียวกับไดเรกทอรีนั้น

มันเป็นหยินและหยาง ya รู้!


+1 finalสำหรับ ในการชี้แจง: finalหมายความว่าค่าของตัวแปรสามารถตั้งค่าได้ที่รันไทม์ (ไม่เหมือนค่าคงที่ซึ่งต้องเป็นนิพจน์คงที่) แต่สามารถตั้งค่าได้เพียงครั้งเดียวเท่านั้น ดูเพิ่มเติม C # readonly's
davidtbernal

1
มีข้อเสนอสำหรับผู้ได้รับ / setters สำหรับลำตัวที่จะยิ่งอ่านอย่างเดียว ฯลฯ อาร์เรย์ที่ไม่เปลี่ยนรูปแม้ว่าอาจจะยากที่จะทำ
StasM

อีกครั้ง phpaccess, PHP มี "เซฟโหมด" ที่ทำในสิ่งที่คุณอธิบาย
DisgruntledGoat

11

ความปรารถนาที่ยิ่งใหญ่ที่สุดสองประการของฉันในฐานะโปรแกรมเมอร์ PHP ไม่ยอมใครง่ายๆ:

  1. สนับสนุนในที่สุด มันเป็นความยุ่งเหยิงครั้งใหญ่ที่จะอ่านเรื่องนี้ผ่านทางธงหรือวิธีการที่คล้ายกัน
  2. ฉันชอบที่จะเห็นการสนับสนุนในไวยากรณ์ของ C # สำหรับ getters และ setters เมื่อคุณมีจำนวนมากของ getters และ setters ไวยากรณ์อย่างง่ายเช่น C # คืออุปกรณ์เพิ่มประสิทธิภาพที่ยอดเยี่ยมแทนที่จะทำด้วยวิธี Java และเขียนวิธี getter และ setter เมธอด Magic นั้นยอดเยี่ยมในกรณีที่คุณต้องการสร้างสมาชิกแบบไดนามิก (ตัวอย่างเช่นถ้าคุณต้องการให้เท็มเพลตตัวแปรบางตัวใช้) แต่ไม่ดีสำหรับคุณสมบัติปกติที่คุณต้องการให้ IDE ทำการเติมข้อความอัตโนมัติ ประเภทและอื่น ๆ สิ่งนี้จะช่วยทำให้โค้ดมีขนาดเล็กลงและยังสามารถอ่านได้และใช้งานง่าย

1
1. ขออภัยมันยากที่จะทำ แต่แน่นอนสิ่งที่ต้องทำรายการ 2. wiki.php.net/rfc/propertygetsetsyntax
StasM

@StasM: วิธีการเกี่ยวกับการทำมันผ่านทางบันทึกย่อ? บางสิ่งบางอย่างตาม: / @ @ รับ getFoo; @set setFoo; * / ส่วนตัว $ foo;
Michał T

9

ไวยากรณ์ภาษา : มีเงื่อนงำที่ดีในpihipiและphprebootของสิ่งที่นักพัฒนาสนใจ (แม้ว่า phpreboot จะกลายเป็น JS มากเกินไป)

วิธีการพัฒนา : มันจะช่วยเพิ่มอายุการใช้งานของ PHP.net ได้อย่างมากหากมีการพิจารณาแบบสำรวจดังกล่าวจริง อย่าทำการตัดสินใจเกี่ยวกับไวยากรณ์เซสชัน IRC ในช่วงบ่ายโดยไม่สนใจอีกต่อไป

คุณสมบัติส่วนบุคคล : บางคนได้รับการกล่าวถึงก่อนหน้านี้ แต่ฉันจะเผากรรมอย่างมีความสุขเพื่อเป็นทู่ที่นี่:

  • ประเภทสตริง Unicode
  • Bigint (ดู Python)
  • Runkit builtin เพื่อลบ / เปลี่ยนชื่อ / แทนที่ builtin ฟังก์ชันและคลาสซึ่งไม่ได้ออกแบบมาอย่างดีเสมอไป
  • Modern OOP
    • หลายการสืบทอด (แทนความซับซ้อนเพื่อสนับสนุนกรณีขอบที่ไม่ค่อยมีไวยากรณ์ซุ่มซ่ามลักษณะ)
    • scalars สามารถเพิ่มเป็นสองเท่าของวัตถุ (ดู Python), เช่น array () ทำงานเป็น ArrayObject หรือสตริงเป็น SplString (ต้องการวิธีการที่ใช้งานได้, funcs สตริงทั้งหมดควรมีให้str::toupper())
  • เลิกใช้\ไวยากรณ์เนมสเปซshitty shitแก้ไข parser และปรับใช้::เป็นทางเลือก คุณก็รู้เหมือนภาษาจริง
  • การเปลี่ยนแปลงใด ๆ ของ LINQ (แม้ว่าฉันจะไม่เชื่อใจพวกคุณเลยว่าจะสร้างไวยากรณ์ที่สมเหตุสมผล)
  • หรือตัวอักษร XML
  • กำจัดพฤติกรรม runtime php.ini และสวิตช์ความหมาย มันต้องใช้ความตื่นเต้นความจริง แต่จะเป็นประโยชน์ต่อนักพัฒนาและฐานผู้ใช้
  • ใช่แล้ว magic_quotes ยังไม่หายไป
  • แปลง Zend Engine เป็นรหัส PBC

แม้ว่านี่จะไม่ชัดเจนก็ตามฉันก็ยินดีให้เงินกับคนอื่นเพื่อทำสิ่งหลังและฆ่า php.net เป็นหลักในการใช้งาน :P
โอ้เพิ่งสังเกตุเห็นว่าเป็นชุมชนของวิกิ ดังนั้นจึงมีโอกาสที่คุณจะไม่ได้อยู่ที่นี่เพื่อกรรม แต่เป็นความสนใจที่แท้จริง หากเป็นเช่นนั้นให้ดูที่ <b> ปัญหา </b> ซึ่งสร้างความเสียหายอย่างรุนแรงต่อภาษา (Directoritis)


5
ฉันเกลียดไวยากรณ์ของเนมสเปซ แต่เป็นเรื่องที่ยาวและน่าเศร้าว่าทำไมมันถึงเป็นเช่นนั้นและมันอาจจะไม่เปลี่ยนแปลง ... อาจเป็นไปได้ว่าถ้าฉันสามารถเปลี่ยนแปลงเพียงสิ่งเดียวใน PHP ที่จะเป็นผู้สมัครหลักของฉัน แต่มันคือสิ่งที่มันเป็น
StasM

@StasM: ขอบคุณสำหรับข้อเสนอแนะและขอโทษที่หยาบคายเกี่ยวกับบางสิ่ง PHP แต่ฉันสนใจ PHP; ดื้อดึงมาก - ฉันได้อ่านเกี่ยวกับเหตุผล แบ็คสแลชภาวะที่กลืนไม่เข้าคายไม่ออกยังไม่เป็นปัญหาใหญ่มากนัก แต่มันจะกลายเป็นปีหน้าเมื่อห้องสมุดแพร่กระจาย ดังนั้นฉันหวังว่าจะมีบางคนเขียนโปรแกรมแยกวิเคราะห์ที่เขียน \ cargo \ cult \ class \ ชื่อกลับไปที่รูปแบบการขีดเส้นใต้
มาริโอ

บางทีฉันอาจบ้าคลั่ง แต่อะไรคือความแตกต่างที่เราใช้ '::' หรือ '\' สำหรับเนมสเปซ
Michał T

@Pies: ::จะเป็นเรื่องธรรมดามากขึ้นสำหรับภาษา C / C ++ ใด ๆ และ `` `ไม่เพียง แต่ผิดปกติในทุกภาษาโปรแกรม แต่มีความหมายที่ยังไม่ทดลอง การสนทนาก่อนหน้านี้บางส่วน: stackoverflow.com/questions/238550/ … or developers.slashdot.org/article.pl?sid=08/10/26/1610259และreddit.com/r/programming/comments/79cut/ ...... - แต่ใน โดยเฉพาะอย่างยิ่งการตัดสินใจว่าไม่มีความคิดเห็นและส่งสัญญาณให้ชุมชนนักพัฒนาเพื่อดูดมันไม่ได้เป็นการต้อนรับที่ดีนัก
มาริโอ

1
+ 1000000 สำหรับการสืบทอดหลายรายการ
ts01

8

ฉันชอบที่จะเห็นการรวมกันของข้อผิดพลาดและข้อยกเว้นเป็นแนวคิดเดียว (ข้อยกเว้น) มันยอดเยี่ยมมากที่สามารถดักจับข้อยกเว้นและเขียนลงในบันทึกเพื่อค้นหาและแก้ไขข้อบกพร่องได้ แต่ถ้ามีบางสิ่งผิดปกติ (อ่าน: PHP Error) ใน codepath ที่ไม่ค่อยได้รับความนิยมมากนักไม่มีช่องทางที่ดีที่จะใส่ข้อมูลลงในฐานข้อมูลเดียวกันของปัญหา

ได้โปรดซานต้าแนะนำสวิตช์ใน php.ini ที่จะทำให้เกิดข้อผิดพลาดทั้งหมดเป็นข้อยกเว้น - โดยเฉพาะอย่างยิ่งข้อยกเว้นที่ฉันสามารถตรวจจับได้ในรหัสของฉัน


1
มีการสนับสนุนในเอ็นจินสำหรับสิ่งนั้นและส่วนขยายจำนวนมากใช้งาน คุณสามารถทำได้อย่างง่ายดายด้วย set_error_handler () และ ErrorException ระวัง E_STRICT / E_NOTICE / E_DEPRECATED แม้ว่า ...
StasM

ฉันตระหนักดีถึงวิธีการเหล่านี้และพวกมันก็แฮ็คจริงๆ ฉันชอบวิธีการแบบรวมศูนย์ - ซึ่งรวมถึง E_STRICT / E_NOTICE และอื่น ๆ
อเล็กซ์

7

PHP เหมาะกับฉันดีเพราะมันทำให้เว็บไซต์เล็ก ๆ ฉันต้องไม่คิดมากสักหน่อยสิ่งเดียวที่ฉันคิดได้ว่าการตอบคำถามนี้จะเป็นสิ่งที่ทำให้ขนาดของเว็บไซต์ดีขึ้น

ฉันกำลังคิดในแง่ของการวางไข่นอกกระบวนการไปที่แกนอื่น ๆ เช่นการปรับปรุงฐานข้อมูลในกระบวนการหนึ่งในขณะที่สร้างหน้าผลลัพธ์ในกระบวนการอื่น การค้นหา google อย่างรวดเร็วระบุว่าสิ่งนี้สามารถจำลองได้ แต่ไม่ได้รับการสนับสนุนใน php โดยตรงในปัจจุบัน


1
ที่จริงแล้วการคิดเกี่ยวกับมันมากขึ้นฐานข้อมูลที่ถ่ายออกมาน่าจะเป็นสถานการณ์ที่น่าสนใจดังนั้น +1 ในนั้น :)
StasM

1
@Stasm ฉันถือว่าคุณหมายความว่าการร้องขอที่แยกกันทำงานเป็นกระบวนการแยกกัน ฉันกำลังพูดถึงหน้าซับซ้อนที่ต้องมีการสร้างหน้าและการคำนวณพื้นหลัง ฉันอาจจะผิด แต่ฉันไม่คิดว่าจะมีวิธีการวางการดำเนินการปรับปรุงฐานข้อมูล (ตัวอย่าง) ในกระบวนการแยกต่างหาก เหตุผลในการทำเช่นนี้คือเพื่อให้หน้าถูกส่งไปยังผู้ร้องขอโดยเร็วแทนที่จะต้องรอการประมวลผลทั้งหมดที่ไม่เกี่ยวข้องโดยตรงกับการสร้างหน้าให้เสร็จสมบูรณ์ตามลำดับ ป.ล. ขอขอบคุณสำหรับการอัปเดต!
geekbrit

7

ฉันพลาดจริง ๆ ว่าประเภทเซนต์คิตส์และเนวิสไม่ได้รับการปฏิบัติเหมือนเป็นวัตถุและวัตถุจริงไม่สามารถกระทำได้เหมือนกับวัตถุหรือวัตถุชนิดอื่น (ยกเว้นสตริงเนื่องจาก __toString ())


ใช่วิธีการเวทย์มนตร์สำหรับ typecasting โปรด
Michał T

7
  • รองรับการแจกแจง (เช่น java 1.5+)
  • สามารถกำหนดชนิดการคืนค่าเมธอดในอินเตอร์เฟสและคลาส
  • สนับสนุนคำอธิบายประกอบ / คำอธิบายเมตาดาต้าที่คุณสมบัติและเมธอด
  • สามารถทำการบอกกล่าวชนิดที่เข้มงวดสำหรับอาร์กิวเมนต์สเกลาร์เมธอด

+1 ตามที่ฉันต้องการเห็นทุกสิ่งใน PHP
Jeremy

6

ทำความสะอาด "ผู้ใช้หมายเหตุทำ" ในhttp://php.net พวกเขาเป็นระเบียบจริงบางครั้งในขณะที่เป็นค่าที่ดีโดยทั่วไป


1
ฟังก์ชั่นโหวตขึ้น / ลงบางประเภทและความสามารถในการเชื่อมโยงไปยังความคิดเห็นดั้งเดิมในการตอบกลับจะเป็นสิ่งที่ดีอย่างแน่นอน
Tgr

5

มีฟังก์ชั่นอาเรย์ที่ค่อนข้างดีใน PHP ให้ความสามารถในการประมวลผลรายการพร้อมกับเรียกกลับและcreate_function()จัดทำแคลคูลัสแลมบ์ดาพื้นฐาน

ปัญหาหลักของมันคือมันอยู่ไกลเกินไปใน PHP ระบบชวเลขจะยอดเยี่ยมโดยเฉพาะอย่างยิ่งเมื่อคำสั่ง map / ลดเกี่ยวข้อง

ที่สำคัญกว่าฟังก์ชั่นรายการยังไม่สมบูรณ์:

  • ไม่มีfoldrฟังก์ชั่นarray_reduce()ให้foldl
  • array_map()ควรผ่านสำคัญในอาร์กิวเมนต์ที่สองในขณะที่array_walk()ไม่
  • array_map_keys()อาจจะมีประโยชน์สำหรับการปรับเปลี่ยนที่สำคัญ
  • รายการความเข้าใจเป็น clunky มากrange(), array_fill()และarray_fill_keys()เพียงจัดการหลายกรณีและarray_filter()จะแยก

ฉันไม่ได้ตั้งเป้าหมายที่จะสร้าง PHP ไว้ใน Haskell แต่ PHP มักจะใช้สำหรับการจัดการโครงสร้างรายการข้อมูลและการมีเครื่องมือครบชุดในเรื่องนี้จะมีประโยชน์


1
เพื่อนร่วมงานของฉันยังคิดว่าอาจมี / ควรจะมีฟังก์ชั่นอื่น ๆ ที่เกี่ยวข้องกับอาร์เรย์เพิ่มเติม; ที่กล่าวถึงในบัญชี Github ของเขา: สิ่งเหล่านี้คือการขาด array_all () และ array_any () ซึ่งตรวจสอบว่า * เงื่อนไขแสดงโดยโทรกลับถือสำหรับองค์ประกอบทั้งหมดหรือใด ๆ ในอาร์เรย์ gist.github.com/44350
kguest

5

ผู้ประกอบการมากไป:

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

1
ไม่แน่ใจว่าสิ่งนี้จะดีเพียงใดเมื่อคลิกด้วย PHP ซึ่งเป็นภาษาที่พิมพ์แบบไดนามิก
BoltClock

5
อาจจะทำได้ด้วยวิธีการทางเวทย์มนตร์เช่น __add ($ obj), __times ($ obj) เป็นต้น
Michał T

มันมีอยู่แล้วเป็นต่อ PECL: pecl.php.net/package/operator ไม่ควรทำงานมากเกินไปเพื่อรวมเข้ากับแหล่งข้อมูลหลัก
Xananax

4

เพิ่มข้อยกเว้นแทนการผลิต E_WARNING ... มันน่ารำคาญมากที่ฉันไม่สามารถใช้บางอย่างเช่น:

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

แน่นอนว่าในปัจจุบันไม่ได้ใช้งานได้จริง แต่มันน่ารำคาญมากที่จะได้รับ:

คำเตือน

คำเตือน

คำเตือน

และฉันไม่สามารถควบคุมการไหลของรหัสโดยไม่ต้องเขียน error_handler และ string sniffing ของตัวเองซึ่งเกิดข้อผิดพลาด (ได้รับอนุญาตชื่อไฟล์ไม่ถูกต้องหรือสิ่งอื่นใดฉันไม่สนใจแหล่งที่มาของข้อผิดพลาดอื่น ๆ ) เพื่อโยนข้อยกเว้นที่ถูกต้อง .

ฉันหวังว่าฉันจะไม่อธิบายว่าทำไมมันถึงสำคัญ

PHP กลายเป็น Object-Oriented ไปนานแล้วและพวกเราผู้เขียนโปรแกรมที่ใช้ PHP กำลังรอคอยคุณสมบัติของ OO ไม่แนะนำ "goto" ... เมื่อฉันรู้ว่ามันเกิดขึ้นจริงฉันคิดว่ามันเป็นวัน April Fool


ยกเว้นว่าจับได้ข้อยกเว้นจะฆ่าสคริปต์ คำเตือนบนเซิร์ฟเวอร์ที่ใช้งานจริงจะถูกบันทึกและจะไม่ปรากฏต่อผู้ใช้ ตอนนี้การเปลี่ยนฟังก์ชั่นนี้จะทำให้สคริปต์เสียหายมากเพราะไม่ได้ออกแบบมาเพื่อใช้งาน (หมายเหตุว่าฉันเขียนตัวจัดการข้อผิดพลาดเพื่อโยนข้อยกเว้นตัวเอง) ตอนนี้สิ่งที่ PDO สามารถส่งคำเตือนหรือข้อยกเว้น: โปรแกรมเมอร์ตัดสินใจที่รันไทม์ ฟังก์ชั่นนั้นน่าจะเป็นสิ่งที่ควรเพิ่มเข้าไปในโมดูลมากขึ้น
Reece45

4
  1. รวมโมเดลวัตถุ - ทำให้วัตถุทั้งหมดขยายคลาสอ็อบเจ็กต์พื้นฐาน คลาส Object จะ (เหนือสิ่งอื่นใด) ใช้วิธีการทางเวทย์มนตร์ทั้งหมด (ดังนั้นพวกเขาจะไม่เป็นเวทย์มนตร์อีกต่อไป!)

  2. ย้ายส่วนขยายไปยังเนมสเปซของพวกเขาเอง - แยกส่วนพื้นที่ส่วนกลางออก $conn = new \MySQLi\Connection();

  3. เลิกspl_autoload()ฟังก์ชั่น! อย่างจริงจังนี่อาจเป็นหนึ่งในคุณสมบัติที่ยิ่งใหญ่ที่สุดของ PHP และยังไร้ประโยชน์มากที่สุดในเวลาเดียวกัน spl_autoloadเป็นออโต้โหลดเริ่มต้นที่รองรับเนมสเปซและนามสกุลไฟล์หลายไฟล์ แต่ด้วยเหตุผลที่ไม่ทราบสาเหตุบางอย่างทำให้ชื่อไฟล์ต้องถูกลดระดับลง มีรายงานข้อผิดพลาดเต็มไปสำหรับเรื่องนี้แต่พนักงานตอบว่าพวกเขาจะไม่แก้ไขเพราะความเข้ากันได้ย้อนหลัง ใช่ ... มันไม่เหมือนกับทุกเฟรมเวิร์กที่มีออโต้โหลดส่วนตัวของมันเองเนื่องจากค่าเริ่มต้นถูกทำลาย!



4

เพิ่มการรองรับ taint ให้เป็นเวอร์ชันล่าสุดและรวมไว้ในบิลด์มาตรฐานเปิดโดยเฉพาะอย่างยิ่งในการกำหนดค่าเริ่มต้นhttp://wiki.php.net/rfc/taint

สิ่งนี้จะช่วยป้องกันการโจมตีการฉีด XSS และ SQL โดยการสร้างรหัสบุคคลให้เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.