Những tính năng nào bạn muốn có trong PHP? [đóng cửa]


88

Vì bây giờ là mùa lễ và mọi người đều thực hiện mong muốn, tôi tự hỏi - những tính năng ngôn ngữ nào bạn muốn PHP sẽ thêm vào? Tôi quan tâm đến một số gợi ý / mong muốn thiết thực cho ngôn ngữ. Ý tôi là:

  1. Một cái gì đó có thể được thực hiện trên thực tế (không phải: "Tôi ước PHP sẽ đoán được mã của tôi có nghĩa là gì và sửa lỗi cho tôi" hoặc "Tôi ước bất kỳ mã nào sẽ thực thi dưới 5ms")
  2. Một cái gì đó không yêu cầu thay đổi PHP sang ngôn ngữ khác (không phải: "Tôi ước họ bỏ dấu $ và sử dụng khoảng trắng thay vì dấu ngoặc nhọn" hoặc "Tôi ước PHP được biên dịch, gõ tĩnh và có # trong tên của nó")
  3. Một cái gì đó sẽ không yêu cầu phá vỡ tất cả các mã hiện có (không phải: "Hãy đổi tên 500 hàm và thay đổi thứ tự tham số cho chúng")
  4. Cái gì mà không thay đổi ngôn ngữ hoặc một số khía cạnh thú vị của nó (không: "Tôi muốn có phần mở rộng để hỗ trợ cho giao thức XYZ" hay "Tôi muốn bug # 12345 cuối cùng đã được cố định")
  5. Một cái gì đó còn hơn cả một lời ca tụng (không phải: "Tôi ước PHP sẽ không tệ đến thế")

Bất cứ ai có bất kỳ lời chúc tốt đẹp?

Chỉnh sửa bản sửa đổi: Stanislav Malyshev là một nhà phát triển PHP cốt lõi.


9
@Stan: Nhiều như bạn muốn tránh loại bình luận đó, dù sao bạn cũng sẽ nhận được nó. Các vấn đề mà mọi người gặp phải với PHP phần lớn nằm trong danh mục những điều bạn loại trừ trong bài viết của mình. [...]
Fishtoaster

24
[...] Bạn đang nói "Làm thế nào chúng ta có thể cải thiện trải nghiệm bị đánh vào mặt mà không thực sự không đánh vào mặt bạn?" Ý tôi là, vâng, nhận cà phê miễn phí trong khi chúng ta bị đánh vào mặt có thể tốt, nó thực sự không giải quyết được nhiều vấn đề tiềm ẩn với, tốt, bị đánh vào mặt. Vì vậy, trong khi tôi hy vọng bạn nhận được một số câu trả lời hữu ích ở đây (như đã xuất hiện), đừng ngạc nhiên bởi những câu trả lời không hiệu quả.
Fishtoaster

5
@Fishtoaster: nếu PHP liên kết với việc bị bạn đánh vào mặt, bằng mọi cách hãy tránh xa nó. Bạn chắc chắn không quan tâm đến việc cải thiện nó. Nó xảy ra mặc dù có những người. Chủ đề này là dành cho họ, không phải cho bạn. Tôi chắc rằng trang web này cũng có rất nhiều chủ đề cho bạn, đây không chỉ là một trong số đó.
StasM

5
Tôi đang sử dụng việc bị đánh vào mặt như một ví dụ - một tình huống mà những cải tiến hời hợt không quan trọng; khi hầu hết các vấn đề của mọi người là với những điều cơ bản. Tôi thậm chí còn không cố gắng để nhận được đề xuất cho những cải tiến hời hợt đó - Tôi chỉ nêu ra lý do tại sao bạn có thể nhận được một vài câu trả lời không có ích, đưa ra tình huống.
Fishtoaster

6
@Fishtoaster: Không phải ai cũng ngạc nhiên khi ghét PHP - Tôi luôn thích nó. Rất linh hoạt và nhanh chóng (để mã).
Orble

Câu trả lời:


119

Tôi sẽ không nhớ các tham số được đặt tên.

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

Thật không may, các nhà phát triển PHP đã bắn hạ ý tưởng đó.


1
Đó là danh sách từ năm 2005. Nhiều ý tưởng đã bị đóng cửa và sau đó tái sinh. Trên thực tế, nếu một triển khai tốt đến, có một cơ hội tốt nó sẽ được chấp nhận.
StasM

21
Đó là tính năng trăn yêu thích của tôi. Làm cho mã rất tự ghi lại.
Keyo

7
@Josh K: Không thể nào, nhưng cuộc gọi 'mảng' là rác vô dụng nếu bạn muốn. Nó chỉ làm xáo trộn những gì bạn đang THỰC SỰ cố gắng làm. Một tùy chọn khác sẽ là cú pháp tốc ký cho mảng: make_img (['src' => 'blah.jpg', ...]);
Erik van Brakel

2
@Erik: Đó cũng không phải là một lựa chọn tồi, tôi đang nói tại sao lại thêm sự lộn xộn này vào một ngôn ngữ khi bạn có thể thực hiện nó với một trình bao bọc mảng nhỏ.
Josh K

4
@Erik: Cú pháp thoải mái hơn cho các mảng (như []toán tử của JavaScript ) sẽ là một tính năng được đánh giá cao.
Josh K

93

Thêm hội nghị:

echo something_that_returns_array()[4];

Những người khác đã đề cập đến các tham số được đặt tên, và cú pháp mảng ngắn hơn. Tôi sẽ không nhớ cú pháp đối tượng ngắn hơn là tốt.

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

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

18
() [] Cú pháp đã có trong thân cây. Thật không may, các phím tắt mảng đã bị từ chối, nhưng tôi hy vọng sẽ hồi sinh.
StasM

2
Tôi rất thích tính năng này. Tại sao chúng ta có thể có một cái gì đó_that_returns_object () -> 4, nhưng không có mảng?
Bala Clark

4
Javascript như các ký hiệu mảng và đối tượng sẽ rung chuyển. Là một nhà phát triển giao diện người dùng, điều làm phiền tôi nhất trong mã php.
Bleep Bloop

1
@DisgruntledGoat Nó có, xem:function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom

2
@DisgruntledGoat: Vấn đề với ()->cú pháp là, nó chỉ hoạt động khi một đối tượng được trả về, để làm cho vấn đề tồi tệ hơn, đối tượng thậm chí được yêu cầu có một thuộc tính / phương thức của tên được chỉ định, một cách tối ưu, làm những gì bạn hy vọng nó làm , trong khi chấp nhận các tham số bạn đã cung cấp và cầu nguyện rằng nó không yêu cầu thêm nữa ... v.v.
phant0m

72

Sau khi làm việc với PHP khoảng 13 năm và rất nhiều với JS khoảng 4 năm, có một vài điều tôi nghĩ rằng PHP sẽ làm tốt khi mượn từ JS:

1) ký hiệu viết tắt cho Mảng và Đối tượng. Tôi tin rằng điều này có thể đã được thảo luận và bắn hạ trên Quốc tế (vì vậy tôi nghe thấy - tôi không muốn xem xúc xích được tạo ra như thế nào), nhưng tôi thực sự, thực sự thấy rằng ký hiệu theo nghĩa đen cho mảng và đối tượng trong JS là rất lớn năng suất chiến thắng.

Ví dụ:

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

Là (IMHO) chỉ dễ viết và sạch hơn nhiều

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

Tôi đã nghe nói rằng một số lo ngại về sự nhầm lẫn tiềm ẩn đã được nêu ra, nhưng thực sự, điều này có khó hiểu hơn so với, ký hiệu di truyền không? Ít nhất, việc tạo một đối tượng stdClass trong PHP đủ dài để ngăn cản việc thực hành, tôi nghĩ vậy.

2) Có thể xác định lại các chức năng và phương thức được xác định trước đó sẽ thực sự hữu ích. Nó đặc biệt đơn giản hóa các tình huống mở rộng một lớp và khởi tạo lớp mới là quá phức tạp hoặc không thực tế. Tuy nhiên, tôi nghĩ rằng chúng ta nên tránh xác định lại các chức năng và phương thức lõi / không sử dụng.


Ngoài hai thứ đó, tôi nghĩ PHP phải hỗ trợ unicode một cách minh bạch . Điều này ngày càng trở thành một vấn đề đối với các nhà phát triển và các giải pháp hiện được cung cấp trong PHP rất khó hiểu và thường không thực hiện được. Làm cho tất cả các chức năng chuỗi tiêu chuẩn trở nên thân thiện với unicode sẽ là một chiến thắng lớn cho các lập trình viên PHP.

Cam ơn vi đa hỏi!


(2) nhìn vào runkit. (3) unicode là khó, đặc biệt là vì hầu hết thế giới bên ngoài không phải là unicode. Chúng ta phải giết hiệu suất hoặc yêu cầu mọi người thực hiện nhiều công việc phụ (như Java làm). Đó là lý do tại sao nỗ lực unicode php6 không thành công.
StasM

8
Đối với unicode: nó có thể khó, nhưng nó sẽ rất hữu ích (chắc chắn việc phát triển PHP là khó, nhưng nó mang lại lợi ích lớn, vâng?) Có lẽ một giải pháp sẽ là kích hoạt unicode trong suốt thông qua một phần mở rộng với sự đánh đổi hoàn hảo rất giống XHP? Cảm ơn một lần nữa.
Funkatron

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

3
Tôi không thấy làm thế nào bạn có thể thấy "hầu hết thế giới bên ngoài không phải là unicode"? Bạn đang nói về mọi người? Hay cái gì khác? Bởi vì đại đa số mọi người trên thế giới (bằng một biên độ lớn ) nói các ngôn ngữ được thể hiện tốt nhất bằng Unicode.
Dean Harding

1
Chắc chắn hỗ trợ unicode. Vận chuyển bất kỳ loại ứng dụng được sử dụng trên toàn cầu là không bắt đầu mà không có nó. Việc các nhà phát triển PHP có nghĩ rằng kỹ thuật hỗ trợ unicode tốt có dễ dàng hay không là vấn đề quan trọng. Mọi người cần nó và họ đang hack theo cách của họ xung quanh những thất bại của nền tảng để làm điều đó. Delphi đã làm điều đó bằng cách thêm một loại chuỗi khác và biến nó thành mặc định, với việc truyền ẩn và chuyển đổi toàn cục để lấy lại hành vi cũ. Tại sao PHP không thể làm theo cách tương tự?
Joeri Sebrechts

48

Những điều tôi muốn, như một người xin lỗi PHP lâu năm:

  1. Cú pháp ngắn hơn cho mảng. Mảng PHP là một trong những tính năng tuyệt vời của ngôn ngữ vì tính linh hoạt của chúng, nhưng đó là một trở ngại để viết some_array_method($argity, array('key' => $value));. Tôi tin rằng đề xuất này đã được đưa vào danh sách gửi thư PHP không may.
  2. finally ủng hộ
  3. Các thuộc tính / chú thích. Những thứ này cho phép bạn thêm hành vi tùy chỉnh vào một phương thức theo cách cho phép tái sử dụng mã. Ví dụ, trong khung MVC, người ta có thể định nghĩa AuthorizeAttributemột bộ điều khiển chỉ ra rằng bộ điều khiển hoặc phương thức hành động yêu cầu người dùng được ủy quyền. Khung chính sẽ chịu trách nhiệm tìm kiếm các thuộc tính và hành động theo chúng. Tôi tin rằng PHPUnit đã sử dụng một loại thuộc tính bằng cách đưa chúng vào các bình luận docblock, có thể được đọc bằng phản xạ, nhưng đưa chức năng thực tế vào các bình luận docblock chắc chắn là một hack.
  4. Cú pháp lambda ngắn hơn. Thay vì phải viết function($x){ return $x*2;}, có lẽ tôi có thể viết $x => return $x*2, hoặc một cái gì đó. Đây lại là một cái gì đó chỉ làm cho nó trở thành một lực cản để sử dụng tính năng này. Ví dụ $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):vs $results = array_filter(array(1,2,3), $a => return $a % 2 );Trước đây chỉ có rất nhiều hệ thống ống nước về cơ bản không liên quan đến công việc thực tế mà bạn đang cố gắng thực hiện.
  5. Một tích hợp Decimal(toán học điểm cố định) hỗ trợ các hoạt động toán học thông qua các toán tử bình thường sẽ rất tốt, vì chúng ta không có quá tải toán tử.
  6. PHƯƠNG PHÁP TẠP CHÍ NHẤT. Phương pháp kỳ diệu là tuyệt vời. Tôi có thể thấy PHP thêm quá tải toán tử thông qua các phương thức ma thuật (tôi biết điều này về cơ bản sẽ không bao giờ xảy ra.) Nhưng nói chung, chúng cung cấp những cách thực sự tuyệt vời để kết nối với ngôn ngữ và làm những điều tuyệt vời.

48

Làm cho PHP thực sự hướng đối tượng. Sự slap on another global functionphát triển của PHP cần kết thúc.

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

Điều này là khó cho tôi để đọc. Tôi phải tạo ra ngăn xếp tinh thần của riêng mình và tự biên dịch nó. Về cơ bản nó nên đọc theo chiều ngược lại. $dog->wakeup()->bark();dễ đọc so vớibark(wakeup($dog))

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

Bây giờ bạn đã thực hiện bước cho phép hỗ trợ đối tượng / phương thức, vui lòng sử dụng nó trong các hàm PHP cốt lõi thực tế.

Hãy đổi tên 500 hàm và thay đổi thứ tự tham số cho chúng.

Chuyển chức năng này sang các phương thức sẽ cho phép chúng được đổi tên bằng cách sử dụng một số nhất quán. Nó sẽ phá vỡ bất kỳ khả năng tương thích ngược nếu chuỗi và mảng có phương thức riêng của họ?


3
Tôi nghĩ rằng mảng không phải là một loại đối tượng là một sai lầm lớn trong PHP. Dẫn đến tất cả các loại rắc rối. Thật không may, đó là một điều tiến hóa. Bạn có thể làm những gì bạn muốn ở đây với phần mở rộng hoặc không gian người dùng. Có lẽ sẽ phù hợp với SPL.
StasM

3
Đối số tương tự áp dụng cho chuỗi. Tôi chỉ nói đến việc thiếu phương pháp nói chung. Các ngôn ngữ như Java, Python, C # vv đều có mã dễ đọc hơn nhiều. Tôi đoán bạn đang tìm kiếm các tính năng, nhưng sửa chữa IMO bị hỏng sẽ là một khoản tiền tốt hơn.
Keyo

6
Không, đừng ngớ ngẩn. Nó sẽ làdog_wake_up($dog); bark_dog($dog);
Matchu

2
IMHO, bất kỳ phương thức chuỗi mới nào cũng sẽ mong đợi và phát ra UTF-8 và ném ngoại lệ nếu đầu vào không hợp lệ UTF-8. Điều này sẽ làm giảm đáng kể nhu cầu làm lại chính của hỗ trợ unicode.
rjmunro

1
@luiscubal Không. Một tham số phụ sẽ có nghĩa là chúng ta không thể thêm tham số sau nếu chúng ta phát minh ra những thứ mới để thêm vào hàm. Ví dụ: nếu $ string => trim () chỉ thực hiện khoảng trắng (như trước 4.1.0), thì hệ thống của bạn sẽ nói $ string => trim ('ISO-8859-1') được cắt bớt khoảng trắng từ các chuỗi ISO-8859-1 . Nếu sau đó chúng tôi muốn có thể cắt bớt những thứ không phải là khoảng trắng, chúng tôi sẽ không thể thêm tham số cho điều đó, trừ khi chúng tôi làm cho mọi người chỉ định mã hóa trước. Chúng ta nên khuyến khích mọi người tin rằng bất kỳ văn bản nào ở bất kỳ nơi nào không phải là UTF-8 đều sai .
rjmunro

40

Một công cụ truy vấn tích hợp ngôn ngữ sẽ là tuyệt vời. Sắp xếp giống như những gì có sẵn trong .NET được gọi là LINQ. Nó sẽ giúp sắp xếp thông qua các mảng dữ liệu khổng lồ và chuẩn hóa truy cập cơ sở dữ liệu, để ít cuộc tấn công SQL-SQL thành công hơn.


2
Bất cứ điều gì làm cho các truy vấn tham số dễ dàng hơn sẽ nhận được phiếu bầu của tôi!
Dean Harding

1
Tôi nghĩ rằng việc truy cập cơ sở dữ liệu được tiêu chuẩn hóa thực sự là một lợi ích rất quan trọng của một thứ như LINQ, bởi vì tôi nghĩ rằng nó giúp cho việc kiểm tra đơn vị với các đối tượng cơ sở dữ liệu của bạn dễ dàng hơn (vì bạn đang chế nhạo mã PHP thay vì truy vấn SQL.)
davidtbernal

Tôi không nghĩ rằng cái gì đó như thế này sẽ đi vào cốt lõi. nó sẽ phù hợp hơn với một phần mở rộng pecl
harald

38

Oh. Gợi ý cho người nguyên thủy. Thế thì tốt quá.


1
Mặc dù tôi thích nguyên tắc KISS của PHP (mở rộng), tôi mạnh mẽ thứ hai. Lý do là nếu bạn muốn thực sự phòng thủ, bạn kết thúc với mã kiểm tra cùng loại trong mỗi phương thức setter. Chúng ta có thể dễ dàng bỏ nó nếu ngôn ngữ hỗ trợ nó nguyên bản.
MicE

4
"Gợi ý kiểu" là cái tên rất đáng tiếc, vì nó không phải là "gợi ý", đó là kiểu gõ nghiêm ngặt. Tôi nghĩ rằng việc gõ nghiêm ngặt nguyên thủy sẽ không phù hợp với ngôn ngữ động như PHP. Gõ cưỡng chế (điều tương tự như các chức năng bên trong làm - thử strlen (123)) có thể ổn.
StasM

6
+1 cho điều này. Gõ gợi ý (hoặc gõ nghiêm ngặt) trong khai báo hàm sẽ vô cùng hữu ích và cắt giảm rất nhiều nếu (! Is_int ()) tào lao trong phương pháp MACHI VÀ MERYI.
Phil Sturgeon

5
@StasM Tôi không đồng ý. Đó là hoàn hảo với trong phạm vi của một ngôn ngữ động để cho phép người dùng chọn sử dụng ngôn ngữ theo cách gõ tĩnh. Và nó sẽ cho phép bắt lỗi tốt hơn nhiều. Bạn sẽ không phải sử dụng nó nếu bạn không muốn, nhưng cá nhân tôi chán ngấy việc có các chuỗi được chuyển đến nơi tôi muốn có một int và sau đó phải tìm kiếm thông qua mã để tìm ra chuỗi ngu ngốc đang đi qua Hoặc nếu không, gõ kiểm tra mọi thứ mọi lúc.
Daniel Bingham

2
@StasM Hoàn toàn không có lý do gì bạn phải giới thiệu các biến được nhập hoàn toàn tĩnh. Có, bạn sẽ thay đổi các lỗi xung quanh trong mã của bạn. Đó sẽ là toàn bộ vấn đề. Lỗi sẽ xảy ra tại thời điểm gọi hàm thay vì bên trong hàm - khiến bạn không biết lỗi thực sự xảy ra ở đâu. Đối với lỗi chuyển đổi loại, lỗi sẽ xảy ra - có trong thời gian chạy - tại lệnh gọi hàm. Khắc phục sự cố bằng cách chuyển đổi ngay sang loại chính xác. Tốt hơn nhiều so với việc một chuỗi xuất hiện trong một hàm mong đợi một int và không biết từ đâu.
Daniel Bingham

34

Tôi thực sự muốn hỗ trợ unicode tốt hơn ra khỏi hộp. Hầu hết các ngôn ngữ di chuyển theo hướng đó nhưng PHP vẫn có các lệnh lạ nằm rải rác khắp nơi.

Chuỗi PHP chỉ là mảng byte đơn giản. Nội dung của chúng không thể mang theo được vì nó phụ thuộc vào mã hóa mặc định hiện tại.

Điều tương tự áp dụng cho các đại diện được xây dựng bằng cách tuần tự hóa. Nó chứa một đại diện byte có tiền tố dài của chuỗi mà không thực sự lưu trữ bất kỳ thông tin mã hóa nào.

Hầu hết các hàm PHP (chuỗi) không có đầu mối về Unicode. Để biết danh sách chi tiết bao gồm mức độ rủi ro của từng chức năng, hãy tham khảo: http://www.phpwact.org/php/i18n/utf-8

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


Hỗ trợ Unicode tỏ ra khó khăn hơn nhiều so với suy nghĩ. Đó là lý do tại sao nỗ lực của php6 bị đình trệ. Hiện tại, chúng tôi có utf-8 và tôi nghĩ cách tốt nhất để đi là thêm hỗ trợ utf-8 cho các hàm chuỗi, có thể là một phần của phần mở rộng intl.
StasM

3
BTW, báo giá không chính xác. Các chuỗi PHP là các mảng byte, nhưng nội dung của chúng có thể di động như bạn tạo ra chúng và không phụ thuộc vào "mã hóa mặc định" - đó chỉ là mảng byte, bạn muốn chúng trong utf8, đặt utf8, muốn utf16 - đặt utf16. Liên kết phpwact.org dường như đã chết.
StasM

1
Tôi thực sự hy vọng rằng tiện ích mở rộng intl sẽ được bật theo mặc định, vì vậy những người cần UTF-8 (không phải tất cả mọi người?) Không phải chiến đấu với máy chủ của họ để có được các chức năng chuỗi hoạt động như mong đợi.
Emil Stenström

Ngoài ra, cảm ơn đã làm rõ về chuỗi. Tôi đã rời xa PHP được một thời gian rồi, vì vậy tôi hơi bất lịch sự. Thay vào đó, tôi đã chiến đấu với cuộc chiến unicode với Python, vấn đề tương tự như PHP, nhưng giải quyết chúng trong Python 3. Có một "ö" trong tên của bạn là một mớ hỗn độn :)
Emil Stenström

Đây chắc chắn là một lĩnh vực tôi muốn thấy một sự cải thiện.
Nathan Osman

32

Tạo các chuỗi đối tượng như thế, với các phương thức được xây dựng để thay thế các chuỗi không đối tượng được đặt tên và tham số không nhất quán. ví dụ

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

Vân vân.

Chỉnh sửa: một điều nữa: Các phương thức này luôn luôn mong đợi và phát ra UTF-8, ngoại trừ các phương thức được dành riêng để xử lý mã hóa. Nếu đầu vào không hợp lệ UTF-8, một ngoại lệ sẽ bị ném, ngay cả khi đầu ra của chức năng sẽ không bị ảnh hưởng bởi mã hóa.


lên, đó chính xác là những gì tôi đang hướng tới.
Kemo

1
subject->verb(object), làm cho thứ tự tham số dễ nhớ hơn.
Ming-Tang

+1 Tôi đã chơi xung quanh với việc tạo lớp chuỗi của riêng mình để thực hiện loại điều này, nó giúp việc mã hóa trở nên dễ dàng hơn rất nhiều và bạn không bao giờ quên thứ tự tham số.
DisgruntledGoat

2
Vì vậy, những gì sẽ is_object($string)trở lại? Điều này sẽ phá vỡ khả năng tương thích ngược thời gian lớn, hoặc dẫn đến việc giới thiệu các đối tượng thực sự gần như không trực quan nhưng không hoàn toàn.
Tgr

@Tgr: is_object () không được dùng nữa - Không nên có thứ gọi là "không phải là một đối tượng". Trong ngắn hạn, nó sẽ phải là một thuộc tính mà bạn có thể tắt trên bất kỳ đối tượng nào và các hàm tạo chuỗi mặc định sẽ tắt nó.
rjmunro

24

1) Tôi rất thích các đối tượng mới được khởi tạo để trả về "$ this" để tôi có thể phương thức chuỗi, $ user = new User ('john') -> setLastName ('Doe') -> save ();

2) Nếu bạn đã từng sử dụng ruby ​​và nút gần đây nhất, chúng có lớp vỏ tương tác tuyệt vời (IRB). Tôi rất thích PHP có một cái thực sự hữu ích.

3) Đặc điểm / Mixins, nhưng tôi nghe thấy chúng đang trên đường.

4) Tôi muốn thứ hai mảng ngắn $ myArray = ['my', 'mảng'];

5) Đặt tên / thứ tự nhất quán (ví dụ: kim haystack)


Tôi ghét phải tạo ra một create()phương thức không có gì đặc biệt chỉ để làm việc xung quanh # 1!
Alan Pearce

Tôi cũng làm như vậy nhưng, sử dụng liên kết tĩnh muộn và siêu lớp đối tượng, theo cách đó, mọi lớp mở rộng siêu lớp của tôi đều có phương thức, ví dụ: SomceClass mở rộng SuperObject {}; Một sốClass :: tạo () -> somemethod ();
dukeofgaming

Hãy xem github.com/ph Whileurgeon/php-ps Đây chỉ là một sự khởi đầu nhưng với một số trợ giúp, nó có thể khá hữu ích.
Phil Sturgeon

1
Ngoài ra còn có gói PEAR cung cấp lớp vỏ tương tác để mã hóa các thử nghiệm nhanh trong PHP - có sẵn tại pear.php.net/package/PHP_Shell
kguest

(Foo mới ()) -> bar () là một phần của 5.4. 3) và 4) cũng vậy.
StasM

20

1) xin vui lòng thoát khỏi bao gồm (). Các tham chiếu đến các tệp khác phải là các tham chiếu và không thực sự đặt nội dung của một tệp mã nguồn này vào một tệp khác. Quá nhiều lập trình viên PHP sử dụng bao gồm () như một kiểu gọi hàm chứ không phải là phương tiện để tham chiếu thư viện. Điều này dẫn đến tất cả các loại mơ hồ trong trạng thái biến đổi và mã không ổn định. Thay thế điều này bằng lệnh 'sử dụng' giống như Perl.

2) vui lòng cung cấp ra khỏi hộp phương thức để biên dịch một ứng dụng PHP thành một tệp mã byte phân phối duy nhất hoặc có thể thực thi được. Điều này sẽ tăng cường đáng kể sự hấp dẫn của PHP như một ngôn ngữ phát triển thương mại. Đây phải là một thành phần cơ bản của ngôn ngữ. Đừng lo lắng về các tệp html được sử dụng cho GUI của ứng dụng vì ...

3) hãy loại bỏ khả năng nhúng các thẻ PHP vào HTML. Hoặc ít nhất cung cấp chế độ 'không nhúng'. Đây là một mớ hỗn độn tuyệt đối và khuyến khích thiết kế xấu bằng cách trộn logic ứng dụng và trình bày với nhau. Các nhà phát triển nên sử dụng các mẫu để hiển thị và không đập các tệp PHP lại với nhau và hy vọng điều tốt nhất.

Đã ký

Chưởng môn

ps: không nghe những gì người khác ở đây nói, tôi đã tốt đẹp cả năm


37
1). Bao gồm là tuyệt vời. Tất cả mọi thứ đã bao gồm. 2). Điều này là tốt 3) Tạo khuôn là tính năng mạnh nhất của PHP . Buộc bạn sử dụng một số nhảm nhí templating khác sẽ là một động thái rất xấu.
Josh K

8
Tôi thích (1) và (2), nhưng (3) có vẻ như là một bước lùi. PHP cung cấp cho bạn sức mạnh tạo khuôn mẫu, tùy thuộc vào việc bạn sử dụng nó một cách khôn ngoan hay không.
geekbrit

11
3 không có ý nghĩa - việc nhúng thẻ là cần thiết cho bất kỳ V trong khung MVC.
Alex

9
Tôi đọc câu trả lời này là "Ông già Noel thân mến, làm ơn hãy biến PHP thành PHP."
Stephen

1
3 là đúng, vì PHP một ngôn ngữ khuôn mẫu.
Andrew

18

Một lệnh ini E_ERRORtrên các hằng số không xác định, thay vì cho rằng đó là một chuỗi với E_NOTICE.


1
Hằng số lớp làm điều đó, btw.
StasM

4
Nghiêm túc mà nói, tôi không hiểu tại sao họ làm cho PHP giả định các chuỗi không được trích dẫn. Đó là điều ngu ngốc nhất. Tôi sẽ chọn một trong hai E_ERRORhoặc E_PARSE.
BoltClock

14

Bình thường hóa không gian tên toàn cầu với một quy ước đặt tên được suy nghĩ kỹ càng có ý nghĩa với những người mới đến!

Để trích dẫn Jeff Atwood yêu quý của chúng tôi: PHP tệ nhưng không thành vấn đề !


1
Tôi đồng ý về nguyên tắc, nhưng không biết làm thế nào để thực hiện nó trong thực tế :)
StasM

3
@StasM: Tôi tưởng tượng bước đầu tiên sẽ là tạo các phiên bản mới của thư viện được đặt tên và cho phép các lập trình viên (thông qua cài đặt ini) vô hiệu hóa các thư viện toàn cầu hiện tại. Tôi nghĩ rằng một gói tương thích sẽ phù hợp với các phiên bản cũ hơn, nhưng không nên viết rất khó.
Michał T


13

1) Cú pháp mảng / đối tượng ngắn hơn, la JavaScript (như đã đề cập trước đó)

2) Cho phép constcác biến cho phép kết quả tính toán như thế define()nào.

3) Xâu chuỗi trực tiếp từ nhà xây dựng: new User()->name('Ryan');

4) Hội nghị truyền hình mảng: something_that_returns_array()[4];

5) Hỗ trợ SPL mở rộng. SPL thực hiện một công việc tốt là mô phỏng lại các hàm chuỗi và mảng (trong số những thứ khác) làm đối tượng. Việc mở rộng SPL có thể giải quyết được rất nhiều sự hiểu biết về ngôn ngữ đang bị đùa giỡn.

6) Sử dụng ArrayObject()phải minh bạch như sử dụng array(). Bạn sẽ có thể làm những việc như array_filter($array_object_instance)không cần làm array_filter($array_object_instance->getArrayCopy()). Thậm chí tốt hơn, tất nhiên, sẽ được $array_object_instance->filter().

7) Unicode đầy đủ sẽ tốt.

8) Dừng thực hiện chuyển đổi loại tự động kỳ lạ. Ví dụ, bạn không thể echođối tượng SimpleXMLE bổ sung mà không có kiểu chữ rõ ràng đầu tiên dưới dạng chuỗi. Hoặc ít nhất, ném một cái gì đó khi nó xảy ra (ví dụ, trong chế độ nghiêm ngặt hoặc bất kỳ chế độ nàoerror_reporting(-1) ).

9) Hỗ trợ cho nhiều luồng hoặc một số loại cuộc gọi lại không đồng bộ / không đồng bộ. Điều này quan trọng nhất khi cố gắng tải lên các tệp lớn thông qua cURL. Thay vì các chủ đề cũ kỹ, một cái gì đó như Grand Central Dispatch của Apple sẽ rất tuyệt. Hoặc thậm chí một cái gì đó giống như JavaScript nơi bạn có thể thực hiện các yêu cầu không đồng bộ và xác định các cuộc gọi lại.

10) Đặt tên / đặt hàng nhất quán (ví dụ kim haystack) sẽ tốt, nhưng tôi nghĩ điều này có thể được giải quyết tốt hơn với SPL.

11) Một shell PHP tương tác được hỗ trợ chính thức, như IRB. Facebook có một cuộc gọiphpsh bằng Python, nhưng nó thiếu sự đánh bóng mà tôi muốn thấy.

12) Đối với API Reflection, hãy thêm hỗ trợ cho (a) nhận xét docblock về hằng số (toàn cầu & lớp) và (b) hỗ trợ để phân tích các nhận xét giống như PHPDoc thành cấu trúc dữ liệu hợp lý. Có một gói PECL được gọi là "docblock" cố gắng thực hiện điều này, nhưng có vẻ như tác giả đã đi rất xa.

EDIT: 13) Tôi cũng rất thích xem khả năng sử dụng !?tên hàm - như Ruby có thể.


Tôi đồng ý, mảng đó phải được hỗ trợ cho các hàm Array_ *. nhưng điều gì sẽ là kết quả mong đợi cho một cái gì đó như "Array_merge" nếu bạn xem xét các lớp con của mảng. bạn sẽ chỉ được phép hợp nhất các thể hiện của cùng một lớp và mảng_merge sẽ trả về cái gì? một mảng php hoặc một thể hiện của mảngobject (tương ứng là lớp con)?
harald

Tôi sẽ lập luận rằng vì dữ liệu bên trong là một mảng và ArrayObject kết hợp với chức năng, nên ngay cả các lớp con của ArrayObject vẫn sẽ hoạt động với các mảng bên trong. Tôi hy vọng có thể hợp nhất một mảng tiêu chuẩn hoặc ArrayObject (hoặc lớp con) khác. Theo như những gì nó sẽ trả về, tôi sẽ lập luận rằng nó cũng sẽ trả về một ArrayObject mới, nhưng tuân theo tiền lệ mà Simplexml_load_opes () đặt ở đó bạn có thể chỉ định tên của lớp mà kết quả sẽ là một thể hiện của.
Ryan Parman

12

1) Hiểu mảng theo kiểu hiểu danh sách Python:

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

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

2) Cú pháp mảng ngắn

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

3) Làm trống () không coi chuỗi '0' là đúng


2
Tôi nghĩ rằng (1) thứ gì đó được nấu từ iterator & clos sẽ tốt hơn.
StasM

+1 IMHO, điều này nên được bao gồm trong tất cả các ngôn ngữ, cũng như các trình vòng lặp. Họ chỉ là cách hữu ích để không có.
Evan Plaice

empty()là đối nghịch logic if ($x), vì vậy nó có ý nghĩa empty('0')là đúng, bởi vì if ('0')là sai. Sự khác biệt duy nhất là, empty()không đưa ra thông báo nếu biến không được đặt.
Andrew

12

Tôi muốn xem một phương pháp hợp pháp để tạo / xác định mảng CONSTANT. Có một vài cách hackish để mô phỏng loại chức năng này nhưng sẽ rất tuyệt nếu nó chỉ là một tính năng trực tiếp của PHP. Sẽ thật tuyệt nếu bạn có thể tạo một mảng theo cách tương tự như khai báo "cuối cùng" của Java.

Tôi đã tạo một hệ thống đăng nhập rất nhanh để thiết lập. Tất cả bạn phải làm là thay đổi nội dung của một mảng trong tệp văn bản để chỉ định các trường bạn muốn cho thông tin người dùng. Sử dụng một vòng lặp cho các vòng lặp, nó xử lý tất cả mọi thứ từ tạo biểu mẫu và độ nhạy đầu vào, đến các cuộc gọi cơ sở dữ liệu nhưng tất cả đều phụ thuộc vào mảng ban đầu này.

Các tập tin với mảng được khóa với quyền nhưng một khi mảng di chuyển xung quanh trong ether thì nó có thể thay đổi. Mặc dù tôi cảm thấy hệ thống này khá an toàn nhưng tôi không muốn để bất cứ điều gì có cơ hội. Một phương pháp để hoàn thiện các mảng sẽ tốt cho một tình huống như thế này.

Ý tưởng mới !!

Ohhh, tôi đã nghĩ đến một cái gì đó khác mà tôi thực sự sẽ thực sự thích trong php. Tôi muốn một số loại hệ thống để kiểm soát các hoạt động tệp php và các hoạt động thư mục tương tự như cách .htaccess hoạt động.

Tệp .phpaccess sẽ kích hoạt một số loại chính sách / tên miền giống nhau.

Ví dụ: Nếu tôi đang lưu trữ nhiều trang web có máy chủ ảo, tôi có thể có tệp .phpaccess trong thư mục sẽ báo cho php kiểm tra quỹ đạo của bất kỳ tập lệnh nào đang được thực thi trên thư mục được bảo vệ của tôi. Nếu tập lệnh không đến từ thư mục đó hoặc thư mục con của nó thì các thao tác tệp / hoặc các hoạt động của ổ cắm sẽ bị từ chối.

Tôi nghĩ rằng một hệ thống như thế này sẽ làm cho việc lưu trữ ảo trở thành một môi trường an toàn hơn nhiều. Nếu bạn có thể đặt một trong số chúng ở đầu mỗi máy chủ ảo thì sẽ giảm bớt cơ hội ai đó tìm cách lẻn vào từ máy chủ ảo lân cận.

Ngoài ra nếu nó là tốt để có một phương pháp bảo đảm nó theo nghịch đảo của cách này. tức là hạn chế phạm vi tiếp cận của các tập lệnh trong một thư mục vào thư mục đó.

Đó là âm và dương ya biết!


+1 cho final. Để làm rõ: finalcó nghĩa là giá trị của một biến có thể được đặt trong thời gian chạy (không giống như các hằng, phải là biểu thức không đổi), nhưng chỉ có thể được đặt một lần. Xem thêm C # readonly.
davidtbernal

1
có một đề xuất cho getters / setters cho thân cây sẽ thay thế chỉ đọc, vv mảng bất biến mặc dù có lẽ sẽ khó thực hiện.
StasM

Re phpaccess, PHP đã có "chế độ an toàn" thực hiện những gì bạn mô tả.
DisgruntledGoat

11

Hai mong muốn lớn nhất của tôi là một lập trình viên PHP khó tính:

  1. Hỗ trợ cuối cùng. Đó là một mớ hỗn độn lớn để hư cấu xung quanh điều này thông qua cờ hoặc phương tiện tương tự.
  2. Tôi rất thích thấy hỗ trợ về cú pháp của C # cho getters và setters. Khi bạn có nhiều getters và setters, một cú pháp đơn giản như C # là một công cụ tăng cường hiệu năng tuyệt vời thay vì thực hiện theo cách Java và viết các phương thức getter và setter. Các phương thức ma thuật rất tuyệt vời trong trường hợp bạn muốn tạo thành viên một cách linh hoạt (ví dụ: nếu bạn muốn cung cấp cho trình kết xuất mẫu một số biến để sử dụng), nhưng không tốt cho các thuộc tính thông thường mà IDE muốn IDE tự động hoàn thành, hãy biết các loại, và như vậy. điều này sẽ giúp làm cho mã nhỏ hơn và vẫn dễ đọc và dễ sử dụng.

1
1. thật không may, thật khó để làm, nhưng chắc chắn là một việc cần làm tốt 2. wiki.php.net/rfc/propertygetsetsyntax
StasM

@StasM: làm thế nào về việc thực hiện thông qua anotations? Một cái gì đó dọc theo dòng: / ** @get getFoo; @set setFoo; * / riêng $ foo;
Michał T

9

Cú pháp ngôn ngữ : Có một số manh mối tốt trong pihipiphpreboot về những gì các nhà phát triển quan tâm (mặc dù phpreboot đã đi quá xa trở thành JS).

Phương pháp phát triển : Nó sẽ giúp tăng đáng kể tuổi thọ của PHP.net nếu các cuộc khảo sát như vậy thực sự được tính đến. Không đưa ra bất kỳ quyết định cú pháp phiên IRC buổi chiều nào nữa.

Các tính năng cá nhân : Một số tính năng đã được đề cập trước đây, nhưng tôi sẽ vui vẻ đốt một số nghiệp lực để trở nên cùn hơn ở đây:

  • Kiểu chuỗi Unicode.
  • Bigint (xem Python).
  • Runkit dựng sẵn để loại bỏ / đổi tên / ghi đè các hàm và lớp dựng sẵn, không phải lúc nào cũng được thiết kế tốt.
  • OOP hiện đại
    • nhiều kế thừa (thay vì phức tạp để hỗ trợ các trường hợp cạnh hiếm khi có cú pháp đặc điểm vụng về)
    • vô hướng có thể tăng gấp đôi như các đối tượng (xem Python), ví dụ mảng () hoạt động như ArrayObject hoặc chuỗi dưới dạng SplString (cần các phương thức có thể sử dụng, tất cả các hàm funcs đều có sẵn như str::toupper())
  • Khấu hao \cú pháp không gian tên shit shitty , sửa lỗi trình phân tích cú pháp và chấp nhận ::thay thế. Bạn biết đấy, giống như một ngôn ngữ thực sự.
  • Bất kỳ biến thể nào của LINQ (mặc dù tôi không tin các bạn đã nghĩ ra một cú pháp hợp lý)
  • hoặc bằng chữ XML.
  • Loại bỏ hành vi thời gian chạy php.ini và chuyển đổi ngữ nghĩa. Nó lấy ra một số sự phấn khích, đúng, nhưng sẽ có lợi cho các nhà phát triển và cơ sở người dùng.
  • Vâng, magic_quotes vẫn chưa biến mất.
  • Chuyển đổi mã byte Zend Engine sang PBC

Mặc dù, nếu điều này không rõ ràng, tôi vui vẻ tài trợ cho bất kỳ ai khác làm điều sau và loại bỏ php.net làm triển khai chính. :P
Ồ, chỉ cần chú ý, đó là wiki cộng đồng. Vì vậy, có một cơ hội bạn không thực sự ở đây vì nghiệp, nhưng quan tâm thực sự. Nếu vậy, hãy xem xét vấn đề <b> </ b> làm tổn thương nghiêm trọng ngôn ngữ (viêm đạo diễn).


5
Tôi ghét cú pháp không gian tên, nhưng đó là một câu chuyện dài và buồn tại sao nó lại trở nên như vậy và có lẽ nó sẽ không thay đổi ... Có lẽ nếu tôi có thể thay đổi chỉ một điều trong PHP sẽ là ứng cử viên chính của tôi. Nhưng đó là những gì nó được.
StasM

@StasM: Cảm ơn bạn đã phản hồi và xin lỗi vì đã thô lỗ về một số điều PHP, nhưng tôi quan tâm đến PHP; do đó rất quan điểm. - Tôi đã đọc một chút về lý do. Vấn đề nan giải dấu gạch chéo ngược chưa phải là một vấn đề rất lớn, nhưng nó sẽ trở thành vào năm tới khi các thư viện lan rộng. Vì vậy, tôi hy vọng ai đó viết một trình phân tích cú pháp viết lại tên \ Freight \ Cult \ class \ trở lại các lược đồ gạch dưới.
mario

Có lẽ tôi là người ngốc, nhưng sự khác biệt dù chúng ta sử dụng '::' hay '\' cho các không gian tên?
Michał T

@Pies: Điều ::này sẽ tự nhiên hơn đối với bất kỳ ngôn ngữ đóng cú pháp C / C ++ nào. Và `\` không chỉ bất thường trong tất cả các ngôn ngữ lập trình, mà còn có ý nghĩa chưa được kiểm chứng. Một số cuộc thảo luận trước đây: stackoverflow.com/questions/238550/ Mạnh hoặc developers.slashdot.org/article.pl?sid=08/10/26/1610259reddit.com/r/programming/comments/79cut/ tựa - Nhưng trong đặc biệt quyết định rằng không có phản hồi và báo hiệu cho cộng đồng nhà phát triển để thu hút nó không phải là một động thái rất đáng hoan nghênh.
mario

1
+ 1000000 cho nhiều kế thừa.
ts01

8

Tôi muốn thấy sự thống nhất giữa Lỗi và Ngoại lệ thành một khái niệm duy nhất (Ngoại lệ). Thật tuyệt vời khi có thể bắt ngoại lệ và ghi chúng vào nhật ký, để tìm và sửa lỗi theo cách đó. Nhưng nếu có một cái gì đó sai về cơ bản (đọc: Lỗi PHP) trong một mật mã rất hiếm khi xảy ra, thì không có cách nào tốt để đưa thông tin đó vào cùng một cơ sở dữ liệu về các vấn đề.

Xin vui lòng, Santa, giới thiệu một công tắc trong php.ini sẽ biến tất cả các lỗi thành ngoại lệ - lý tưởng nhất là các ngoại lệ tôi có thể bắt được trong mã của mình.


1
Đã có hỗ trợ trong công cụ cho điều đó và nhiều tiện ích mở rộng sử dụng nó. Bạn cũng có thể dễ dàng làm điều đó với set_error_handler () và ErrorException. Cảnh giác với E_STRICT / E_NOTICE / E_DEPRECATED mặc dù ...
StasM

Tôi nhận thức rõ về các phương pháp này và chúng thực sự rất hack. Tôi thích một cách thống nhất - cách bao gồm E_STRICT / E_NOTICE và như vậy.
Alex

7

PHP rất phù hợp với tôi vì nó phù hợp với các trang web vừa và nhỏ; Tôi phải là một chút không tưởng tượng, điều duy nhất tôi có thể nghĩ như là một câu trả lời cho câu hỏi này sẽ là một cái gì đó làm cho nó có quy mô tốt hơn cho các trang web lưu lượng truy cập cao.

Tôi đang suy nghĩ về việc sinh ra các quy trình cho các lõi khác, ví dụ như cập nhật cơ sở dữ liệu trong một quy trình trong khi tạo trang đầu ra trong quy trình khác. Một tìm kiếm nhanh trên google chỉ ra rằng điều này có thể được mô phỏng, nhưng hiện tại không được hỗ trợ trực tiếp trong php.


1
Trên thực tế, suy nghĩ nhiều hơn về nó, giảm tải cơ sở dữ liệu dường như là kịch bản thú vị, vì vậy +1 trên đó :)
StasM

1
@Stasm, tôi giả sử bạn có nghĩa là các yêu cầu riêng biệt chạy dưới dạng các quy trình riêng biệt. Tôi đang nói về một trang phức tạp đòi hỏi phải tạo trang và tính toán nền. Tôi có thể sai, nhưng tôi không nghĩ có một cách để sinh ra (ví dụ) các hoạt động cập nhật cơ sở dữ liệu trong một quy trình riêng biệt. Lý do để làm điều này là để trang được gửi đến người yêu cầu sớm hơn, thay vì phải chờ tất cả quá trình xử lý không liên quan trực tiếp đến việc sản xuất trang hoàn tất. PS .. Cảm ơn đã cập nhật!
geekbrit

7

Tôi thực sự đã bỏ lỡ rằng các kiểu vô hướng không được coi là các đối tượng và các đối tượng thực không thể hoạt động như bất kỳ loại hoặc đối tượng nào khác (ngoại trừ chuỗi do __toString ()).


Vâng, phương pháp kỳ diệu cho typecasting xin vui lòng.
Michał T

7
  • hỗ trợ liệt kê (như java 1.5+)
  • Có thể định nghĩa các kiểu trả về của phương thức, trong các giao diện và các lớp
  • hỗ trợ cho các chú thích / định nghĩa siêu dữ liệu về các thuộc tính và phương thức.
  • có thể thực hiện gợi ý kiểu nghiêm ngặt cho các đối số vô hướng phương thức.

+1 Như tôi muốn thấy tất cả những điều đó trong PHP.
Jeremy

6

Dọn dẹp "Ghi chú đóng góp của người dùng" trên http://php.net . Chúng đôi khi là một mớ hỗn độn thực sự, trong khi nói chung là một giá trị lớn.


1
Một số loại chức năng bỏ phiếu lên / xuống và khả năng liên kết với nhận xét ban đầu trong bài trả lời chắc chắn sẽ rất hay.
Tgr

5

Có một số hàm mảng khá tốt trong PHP, cung cấp khả năng xử lý danh sách, với các cuộc gọi lại và create_function()cung cấp một phép tính lambda cơ bản.

Vấn đề chính với nó, là nó quá dài dòng trong PHP, một hệ thống tốc ký sẽ rất tuyệt vời, đặc biệt là khi các lệnh map / less có liên quan.

Quan trọng hơn, các chức năng danh sách không hoàn toàn đầy đủ:

  • không có foldrchức năng, array_reduce()cung cấpfoldl
  • array_map()nên vượt qua chủ chốt trong đối số thứ hai, như array_walk()không
  • một array_map_keys()có thể hữu ích cho sửa đổi quan trọng
  • danh sách hiểu biết là rất phiền phức, range(), array_fill()array_fill_keys()chỉ xử lý rất nhiều trường hợp, và array_filter()là riêng biệt

Tôi không có ý định đưa PHP vào Haskell, nhưng PHP thường được sử dụng để thao tác cấu trúc dữ liệu kiểu danh sách và có một bộ công cụ đầy đủ về vấn đề này sẽ hữu ích.


1
Một đồng nghiệp của tôi cũng nghĩ rằng có thể / nên có một số bổ sung khác có chức năng liên quan đến mảng; tại được đề cập trên tài khoản github của mình: Đây là những thiếu mảng_all () và mảng_any (), kiểm tra xem * một điều kiện được biểu thị bởi một hàm gọi lại giữ cho tất cả hay bất kỳ phần tử nào trong một mảng. gist.github.com/44350
kguest

5

Quá tải toán tử:

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

1
Không chắc chắn điều này sẽ nhấp tốt như thế nào với PHP là một ngôn ngữ được gõ động.
BoltClock

5
Có lẽ nó nên được thực hiện thông qua các phương thức ma thuật, như __add ($ obj), __times ($ obj), v.v.
Michał T

nó đã tồn tại dưới dạng phần mở rộng PECL: pecl.php.net/package/operator . Không nên quá nhiều công việc để hợp nhất nó với nguồn chính
Xananax

4

Thêm ngoại lệ thay vì tạo E_WARNING ... Thật khó chịu khi tôi không thể sử dụng thứ gì đó như:

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

Tất nhiên, hiện tại không thực tế lắm nhưng rất khó nhận:

CẢNH BÁO

CẢNH BÁO

CẢNH BÁO

và tôi không thể kiểm soát luồng mã mà không viết error_handler của riêng mình và đánh hơi chuỗi lỗi nào đã được tạo ra (quyền, tên tệp không chính xác hoặc bất cứ điều gì khác; Tôi không bận tâm về các nguồn lỗi khác ở đây) để đưa ra ngoại lệ chính xác .

Tôi hy vọng tôi không giải thích được tại sao nó quan trọng.

PHP đã trở thành Hướng đối tượng một thời gian trước đây và chúng tôi, các lập trình viên sử dụng PHP, đang mong đợi các tính năng OO, không giới thiệu "goto" ... Khi tôi phát hiện ra điều đó thực sự rất vui, tôi nghĩ đó là một ngày Cá tháng Tư.


Trừ khi bị bắt, ngoại lệ sẽ giết chết kịch bản. Cảnh báo, trên máy chủ sản xuất, sẽ được ghi lại và không bao giờ hiển thị cho người dùng. Thay đổi chức năng này bây giờ sẽ phá vỡ rất nhiều tập lệnh vì chúng không được thiết kế để bắt nó. (Lưu ý rằng tôi viết trình xử lý lỗi để tự ném ngoại lệ). Bây giờ, những thứ PDO có thể đưa ra các cảnh báo hoặc ngoại lệ: lập trình viên quyết định trong thời gian chạy. Chức năng đó có lẽ là một chức năng nên được thêm vào nhiều mô-đun.
Reece45

4
  1. Hợp nhất mô hình đối tượng - làm cho tất cả các đối tượng mở rộng lớp Object cơ sở. Lớp Object sẽ (trong số những thứ khác) thực hiện tất cả các phương thức ma thuật (vì vậy chúng sẽ không còn là phép thuật nữa!)

  2. Di chuyển các tiện ích mở rộng sang không gian tên của riêng chúng - giải phóng không gian tên toàn cầu $conn = new \MySQLi\Connection();

  3. Hủy làm tê liệt spl_autoload()chức năng! Nghiêm túc mà nói, đây có thể là một trong những tính năng tuyệt vời nhất của PHP và cũng là vô dụng nhất cùng một lúc. spl_autoloadlà trình tải tự động mặc định, hỗ trợ không gian tên và nhiều phần mở rộng tệp, nhưng vì một số lý do không xác định, yêu cầu tên tệp phải được hạ xuống. Có một báo cáo lỗi được điền cho điều này , nhưng nhân viên trả lời họ sẽ không sửa nó vì tính tương thích ngược. Phải ... nó không giống như mọi khung công tác với trình tải tự động của riêng nó, vì cái mặc định bị tê liệt!



4

Mang hỗ trợ mờ lên phiên bản mới nhất và đưa nó vào các bản dựng tiêu chuẩn, tốt nhất là bật trong cấu hình mặc định http://wiki.php.net/rfc/taint

Điều này sẽ ngăn chặn các cuộc tấn công tiêm XSS và SQL bằng cách làm cho mọi người viết mã đúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.