Các tính năng ẩn của PHP? [đóng cửa]


174

Tôi biết điều này nghe giống như một câu hỏi hay, nhưng hãy để tôi giải thích tôi đến từ đâu.

Ra trường đại học tôi có một công việc tại một cửa hàng PHP. Tôi đã làm việc ở đó được một năm rưỡi và nghĩ rằng tôi đã học được tất cả những gì cần học về lập trình.

Sau đó, tôi có một công việc là một cửa hàng phát triển nội bộ một người đàn ông tại một tập đoàn lớn, nơi tất cả các công việc đều ở C #. Trong cam kết của tôi với vị trí này, tôi bắt đầu đọc rất nhiều blog và sách và nhanh chóng nhận ra rằng tôi đã sai lầm như thế nào khi nghĩ rằng tôi biết tất cả mọi thứ. Tôi đã học về thử nghiệm đơn vị, mô hình tiêm phụ thuộc và trang trí, nguyên tắc thiết kế khớp nối lỏng lẻo, thành phần trong tranh luận về thừa kế, vân vân và vân vân - Tôi vẫn còn tiếp thu tất cả. Không cần phải nói phong cách lập trình của tôi đã thay đổi hoàn toàn trong năm ngoái.

Bây giờ tôi thấy mình đang chọn một dự án php thực hiện một số mã hóa cho khởi nghiệp của một người bạn và tôi cảm thấy hoàn toàn bị hạn chế so với lập trình trong C #. Nó thực sự làm phiền tôi rằng tất cả các biến trong phạm vi lớp phải được gọi bằng cách nối thêm '$ this->'. Điều đó làm tôi bực mình vì không có IDE nào mà tôi đã thử có khả năng hiểu rất tốt và các phương pháp kiểm tra đơn vị SimpleTest của tôi phải bắt đầu bằng từ 'test'. Điều đó làm tôi phát điên khi gõ động giúp tôi không chỉ định ngầm định loại tham số nào mà phương thức mong đợi và bạn phải viết một câu lệnh chuyển đổi để thực hiện quá tải phương thức. Tôi không thể chịu đựng được rằng bạn không thể có các không gian tên lồng nhau và phải sử dụng toán tử :: để gọi hàm tạo của lớp cơ sở.

Bây giờ tôi không có ý định bắt đầu một cuộc tranh luận về PHP và C #, thay vào đó tôi muốn nói là tôi chắc chắn có một số tính năng PHP mà tôi không biết hoặc không biết sử dụng đúng cách. Tôi được đặt trong vũ trụ C # của mình và gặp khó khăn khi nhìn thấy bên ngoài bát thủy tinh.

Vì vậy, tôi đang hỏi, các tính năng yêu thích của bạn về PHP là gì? Những điều bạn có thể làm trong đó là gì mà bạn không thể hoặc khó khăn hơn trong các ngôn ngữ .Net?


Mô hình OO bị phá vỡ? Đối với tôi đó là tính năng "ẩn" tồi tệ nhất mà bạn khám phá.
knoopx

Các chủ đề này khá hài hước ... Bởi vì đối với nhóm tôi làm việc với "tính năng ẩn" là cụm từ mã có nghĩa là "lỗi". Và bạn biết những gì ... Đôi khi khám phá ra một tính năng ẩn không nhất thiết là một điều tốt ...
Ganesh Shankar

@Ganesh lỗi của một người là một tính năng ẩn của người khác ...
Xeoncross

Câu trả lời:


328

Tài liệu . Các tài liệu được bình chọn của tôi. Tôi chưa gặp tài liệu trực tuyến kỹ lưỡng hơn cho ngôn ngữ lập trình - mọi thứ khác tôi phải ghép lại từ các trang web và trang người dùng khác nhau.


60
Tôi đồng ý. Có thể nhập www.php.net/feft_name và nhận được một tài liệu tham khảo hầu hết thời gian là tuyệt vời.
Allain Lalonde

1
Đây là một tính năng tuyệt vời của PHP, nhưng tôi thực sự sẽ không gọi nó là ẩn ... Nếu bạn đã từng tìm kiếm các tham số phương thức, v.v., bạn sẽ kết thúc tại php.net.
John Bubriski

27
Tôi cũng đồng ý. Điều tuyệt vời nhất về hướng dẫn sử dụng là các bình luận của người dùng. Tôi hiếm khi thấy các tài liệu khác có những tài liệu đó. Chúng có thể chứa đá quý thực sự. Nhược điểm duy nhất là IMHO họ bị cắt tỉa quá sớm.
Sander Marechal

3
@Phoexo "ít đọc hơn một chút" ??? Tôi không bao giờ hiểu và sẽ không bao giờ hiểu MSDN, trong khi các tài liệu PHP rất dễ dàng và rõ ràng.
lauriys

3
Không đồng ý. Lý do duy nhất khiến tài liệu này "tốt" là do một số bình luận của người dùng cắm tất cả các lỗ hổng trong ghi chú chính thức.
Rob Howard

179

Mảng . Đánh giá từ các câu trả lời cho câu hỏi này, tôi không nghĩ mọi người đánh giá cao sự dễ dàng và hữu ích của Mảng trong PHP. Mảng PHP hoạt động như danh sách, bản đồ, ngăn xếp và cấu trúc dữ liệu chung cùng một lúc. Mảng được triển khai trong lõi ngôn ngữ và được sử dụng ở mọi nơi dẫn đến vị trí bộ đệm CPU tốt. Cả Perl và Python đều sử dụng các cấu trúc ngôn ngữ riêng biệt cho danh sách và bản đồ dẫn đến việc sao chép nhiều hơn và các biến đổi có thể gây nhầm lẫn.


11
Các phần tử mảng PHP được sắp xếp.
dùng8134

117
Bước đầu tiên của tôi từ PHP sang C # gần như đã giết chết tôi. Trong C #, mảng chỉ là một cấu trúc đơn giản với kích thước tĩnh và chỉ số số. Trong PHP, mảng là băng keo của vũ trụ!
Dinah

4
Tôi cũng đồng ý. Khi chơi với Java cho một bài tập Uni, tôi đã choáng váng vì chúng cứng nhắc như thế nào, không linh hoạt chút nào. Thực sự làm cho tôi đánh giá cao các mảng PHP tốt như thế nào.
Christian

11
Tôi chắc chắn mảng php là tuyệt vời, nhưng 40 phiếu cho nhận xét đánh bại mảng C #? Nếu một mảng C # không phù hợp với nhu cầu, có nhiều lựa chọn. ArrayList và bộ sưu tập chung đều rất mạnh mẽ. Có rất nhiều loại bộ sưu tập cho các nhu cầu cụ thể. Ưu điểm thực sự duy nhất của php về vấn đề này là nó không cung cấp bất kỳ tùy chọn nào mà lập trình viên phải quyết định. Bạn có thể sử dụng mảng hoặc bạn không có một biến có thể lập chỉ mục.
G-Wiz

24
Mặt khác, cú pháp cho mảng hoàn toàn hút. Trong nhiều ngôn ngữ kịch bản, bạn có thể tạo một mảng 2D đơn giản như vậy : [[1, 2], [3, 4]], so sánh phiên bản này với phiên bản PHP : array(array(1, 2), array(3, 4)).
Rene Saarsoo

167

Stream Handlers cho phép bạn mở rộng "Hệ thống tệp" với logic mà theo như tôi biết là khá khó thực hiện trong hầu hết các ngôn ngữ khác.

Ví dụ: với trình xử lý Luồng MS-Excel, bạn có thể tạo tệp MS Excel theo cách sau:

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

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

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

Tôi tin rằng khung KIO cũng cho phép bạn làm điều này, nhưng điều đó chỉ có sẵn cho các ứng dụng máy tính để bàn dựa trên KDE.
MiffTheFox

21
IMHO có cách tiếp cận OO thích hợp sẽ hợp lý hơn nhiều so với mớ hỗn độn này với các trình xử lý luồng. Vâng, thật dễ thương để có thể đọc / ghi các tệp Excel, nhưng nó có phải hoạt động như thế này không?
Anti Veeranna

3
Có thể là như vậy, nhưng cách tiếp cận này gói gọn sự phức tạp trong một giao diện phổ biến đối với hầu hết các nhà phát triển PHP ... mà không yêu cầu họ tìm hiểu các khái niệm Hướng đối tượng có thể vượt ra ngoài chúng.
Allain Lalonde

13
Nếu bạn đang làm việc với Amazon S3, hãy xem Zend_Amazon_S3, nơi cung cấp giao diện luồng cho các url như 's3: // {buck-name} / path'.
davidtbernal

Tôi đã sử dụng điều này để tạo một DSL đơn giản cho lớp khung nhìn của mình bằng cách chỉ đọc tệp PHP, thực hiện một số thay thế chuỗi và chuyển qua máng eval (). Ví dụ: tôi đã làm cho nó có thể sử dụng các thẻ ngắn bất cứ khi nào tôi chọn và làm @ -> someVar để tôi có thể truy cập dữ liệu cấp độ xem.
Jasper Bekkers

131

Phương thức ma thuật là phương thức thông qua được gọi bất cứ khi nào bạn gọi một phương thức không tồn tại hoặc gán hoặc đọc một thuộc tính không tồn tại, trong số những thứ khác.

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

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

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

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

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

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

Một nhà phát triển C ++ ở đây có thể nhận thấy rằng PHP cho phép quá tải một số toán tử, ví dụ ()hoặc (string). Trên thực tế PHP cho phép quá tải thậm chí nhiều hơn, ví dụ []toán tử ( ArrayAccess ), foreachcấu trúc ngôn ngữ ( IteratorIteratorAggregate ) và counthàm ( Countable ).


4
Là ví dụ hữu ích về những gì có thể đạt được với các phương thức ma thuật goto phpcodetips.blogspot.com/2008/07/domain-model-validation.html
grom

6
Không đồng ý. Điều này yếu hơn nhiều so với các cơ sở tương tự ở Smalltalk, Ruby & Python (và có lẽ nó đã được sao chép từ một trong số này)
vây

34
Thực tế là việc triển khai chức năng này của PHP yếu hơn các ngôn ngữ khác, không làm cho nó trở nên ít hữu ích hơn trong PHP.
Allain Lalonde

2
__call()là tuyệt vời trong các khung với bản đồ domain.com/controll/method/
alex

7
Phương pháp ma thuật cũng chậm như địa ngục. Sử dụng chúng cẩn thận.
Alex Weinstein

95

Các lớp tiêu chuẩn là một container gọn gàng. Tôi chỉ tìm hiểu về nó gần đây.

Thay vì sử dụng một mảng để giữ các thuộc tính máy chủ

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

Bạn có thể sử dụng một lớp tiêu chuẩn

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

Điều này đặc biệt hữu ích khi truy cập các biến này trong một chuỗi

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

43
"{$ Person ['name']} là {$ person ['age']} tuổi" hoạt động.
Kornel

27
"người [tên] là $ người [tuổi] tuổi" cũng sẽ hoạt động ... Không có dấu ngoặc kép, không có dấu ngoặc nhọn :)
majelbstoat

16
$ string = sprintf ("% s là% d tuổi.", $ person ['name'], $ person ['age']);
Daniel Sloof

60
Trong khi chúng ta đang ở chủ đề: (đối tượng) mảng ("name" => 'bob', 'age' => 5)
Annika Backstrom

30
@majelbstoat: Việc trích dẫn các trích dẫn sẽ làm chậm kịch bản vì trình thông dịch PHP sẽ xem liệu 'tên' và 'tuổi' đã được đặt với định nghĩa (...). Đây cũng là một thực tiễn tồi khi xem xét có thể lật hoàn toàn các phím được truy cập trong từng trường hợp: xác định ('tuổi', 'tên'); định nghĩa ('tên', 'tuổi');
brianreavis

90

Bao gồm các tệp có thể có giá trị trả về mà bạn có thể gán cho một biến.

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

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

@Peter RẤT hữu ích cho db-> xử lý lỗi ngoại lệ localhost.
Talvi Watia

Thật tiện lợi khi thiết lập một tập tin cấu hình nhanh và bẩn.
Nông dân Frank

Tại sao bạn trả lại mảng này? Nếu một tệp được bao gồm chứa một mảng, nó có thể được sử dụng ngay lập tức.
fabrik

5
@fabrik vì nó sẽ là biến toàn cục và có sẵn trong toàn bộ phạm vi chính. Điều đó khá khó chịu, đây là cách tốt hơn.
Mik Formula Dite

Tôi đã làm việc trên một dự án trong khung Yii và dự án đó có tệp cấu hình trong đó mảng được trả về như thế này, bây giờ tôi hiểu tại sao tệp lại như thế này.
phát triển Simer Twilio Toronto

83

Bạn có thể tận dụng thực tế là ortoán tử có quyền ưu tiên thấp hơn =để làm điều này:

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

Nếu giá trị của nhiệm vụ đầu tiên ước tính true, thì nhiệm vụ thứ hai bị bỏ qua. Một vi dụ khac:

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

7
Tôi không hoàn toàn bị thuyết phục về điều này tôi nghĩ; mặc dù nó dường như không phải là lỗi dễ bị phản tác dụng và bản thân nó có thể gây ra lỗi.
thomasrutter

14
@Pies: một cách là như sau, mã khá lộn xộn phải trung thực: $ page = isset ($ _ GET ['page'])? (int) $ _ NHẬN ['trang']: 1; // Ưu điểm của việc này là không cần phải loại bỏ lỗi.
DisgruntledGoat

3
trên suy nghĩ thứ hai, vì bạn đang tìm kiếm một số nguyên mà bạn có thể sử dụng thay thế: $ page = is_int ($ _ GET ['page'])? $ _GET ['trang']: 1;
DisgruntledGoat

4
Cần lưu ý rằng mã sau orsẽ thực thi nếu mã trước orkết quả là giá trị số 0. Vì vậy, về mặt ngữ nghĩa, nó có thể ít xảy ra với một cái gì đó như thế $_GET['page'], nhưng rõ ràng hoàn cảnh có thể phát sinh và thật tốt để đề phòng.
mí mắt

3
Cũng đáng lưu ý rằng ortoán tử là phiên bản thấp hơn của ||toán tử. Ngoài ra, +1 vì điều này có tính biểu cảm cao và tôi thường quên điều đó là có thể. Nó nên được sử dụng thường xuyên hơn, và nó hoàn toàn rõ ràng trong những gì nó làm. Tôi không biết về cách mã "nam thật", vì vậy tôi không thể nhận xét về điều đó.
mí mắt

80

__autoload()(class-) tập tin hỗ trợ bởi set_include_path().

Trong PHP5 bây giờ không cần thiết phải chỉ định danh sách dài các câu lệnh "include_once" khi thực hiện OOP phong nha.

Chỉ cần định nghĩa một tập hợp nhỏ của thư mục trong đó các tệp thư viện lớp được cấu trúc hoàn toàn và đặt đường dẫn bao gồm tự động:

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

Bây giờ là __autoload()thói quen:

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

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

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

Bây giờ PHP sẽ tự động bao gồm các tệp cần thiết theo yêu cầu, tiết kiệm thời gian và bộ nhớ phân tích cú pháp.


spl_autoload_register () tốt hơn để sử dụng?
alex

19
Tất nhiên! __autoload () là PHP4 nhưng spl_autoload_register () là một "chuỗi xâu chuỗi" không phá hủy của các phương thức tự động tải.
Willem

3
Một tính năng tiện dụng, nhưng một điều lưu ý là khi bạn tìm thấy một thể hiện của một lớp nhất định, điều đó làm cho việc tìm kiếm vị trí của tệp lớp trở nên khó khăn hơn một chút. Việc xác định rõ ràng bao gồm ở đầu cung cấp cho bạn một danh sách hữu hạn các lớp liên quan và vị trí chính xác của chúng.
Nhà Cory

Đây là một tính năng hay, nhưng chỉ để khắc phục tình trạng không có mã được biên dịch trước, vì vậy nó không biết lớp sẽ đi đến đâu. Nhược điểm lớn của điều này là bạn không thể có 2 lớp có cùng tên, ngay cả khi chúng ở các không gian tên khác nhau.
Kibbee

3
Vui lòng xem đạo cụ PSR-0 từ Nhóm làm việc về Tiêu chuẩn PHP (có các nhà phát triển của ZF, Symfony, Doctrine, CakePHP, Solar, v.v.) khi triển khai tự động tải: Groups.google.com/group/php-stiterias/web / psr-0-Final-đề nghị
Philippe Gerber

76

Dễ dàng . Tính năng tuyệt vời nhất là việc các nhà phát triển mới có thể dễ dàng ngồi xuống và viết các kịch bản "làm việc" và hiểu mã như thế nào.

Tính năng tồi tệ nhất là việc các nhà phát triển mới dễ dàng ngồi xuống và viết các kịch bản "làm việc" và nghĩ rằng họ hiểu mã.

Sự cởi mở của cộng đồng xung quanh PHP và số lượng lớn các dự án PHP có sẵn như nguồn mở ít đáng sợ hơn đối với một người nào đó bước vào thế giới phát triển và như bạn, có thể là bước đệm cho các ngôn ngữ trưởng thành hơn.

Tôi sẽ không tranh luận về những thứ kỹ thuật như nhiều người trước đây nhưng nếu bạn xem PHP như một cộng đồng chứ không phải là một ngôn ngữ web, một cộng đồng rõ ràng chấp nhận bạn khi bạn bắt đầu phát triển, những lợi ích thực sự nói lên chính họ.


3
Chắc chắn là một nhận xét tốt. Python là ngôn ngữ đầu tiên của tôi và nó thật tuyệt vời, nhưng việc thiếu các dự án tôi cảm thấy có khả năng hiểu được đã tạo ra một rào cản. Với PHP tôi có thể tra cứu khá nhiều thứ trên tài liệu và tìm ra ... tài nguyên có sẵn trên web thật tuyệt vời.
DScher

76

Biến số và chức năng mà không có nghi ngờ!

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

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

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

Khái niệm tương tự áp dụng cho các tham số đối tượng ($ some_object -> $ some_variable);

Rất rất tốt. Tạo mã hóa với các vòng lặp và các mẫu rất dễ dàng, và nó nhanh hơn và được kiểm soát nhiều hơn so với eval (Thanx @Ross & @Joshi Spawnbrood!). T


111
các biến biến đang thực sự làm cho mã ít đọc hơn và dễ bị lỗi hơn.
Elzo Valugi

8
Và mọi người thực sự sử dụng điều này? Người đàn ông tôi ghét đọc những nguồn này.
Gary Willoughby

27
Biến biến là một trong những tính năng tồi tệ nhất mà PHP cung cấp.
davidtbernal

10
9 trong số 10 lần các biến biến được thay thế tốt hơn bằng các mảng để bạn có tất cả dữ liệu ở một nơi, bạn có thể lặp lại qua nó và cetera. Chỉ trong một số trường hợp rất cụ thể, chúng có thể hữu ích.
Jasper Bekkers

7
Vui lòng không làm cho người mới sử dụng "tính năng" đó.
whiskeyierra

68

Bạn có thể sử dụng các hàm với số lượng đối số không xác định bằng cách sử dụng func_get_args().

<?php

function test() {

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

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

?>

1
Đã được sắp đăng bài này. Sắp xếp giống như thuộc tính đối số trong các hàm JS.
alex

67

Tôi yêu các tập tin từ xa . Để phát triển web, loại tính năng này đặc biệt hữu ích.

Cần phải làm việc với nội dung của một trang web? Một đơn giản

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

và bạn đã có một tệp xử lý sẵn sàng để đi, giống như mọi tệp bình thường khác.

Hoặc làm thế nào về việc đọc một tập tin từ xa hoặc trang web trực tiếp vào một chuỗi?

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

Sự hữu ích của phương pháp đặc biệt này là khó để nói quá.

Bạn muốn phân tích một hình ảnh từ xa? Làm thế nào về việc thực hiện thông qua FTP?

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

Hầu như bất kỳ chức năng PHP nào hoạt động với các tệp đều có thể hoạt động với một tệp từ xa. Bạn thậm chí có thể include()hoặc require()mã tập tin từ xa theo cách này.


2
Điều này thật tuyệt Để làm điều này trong ví dụ Java, bạn cần bao gồm một tệp jar gazillion và hơn là viết rất nhiều mã soạn sẵn.
Kimble

16
"Bạn thậm chí có thể bao gồm () hoặc yêu cầu () tệp mã từ xa theo cách này." Tất nhiên, bao gồm () lấy một tệp trên máy chủ mà bạn không kiểm soát là một ý tưởng tồi tệ, tồi tệ.
Nông dân Frank

4
@Frank - vâng, người ta sẽ cho rằng bạn sẽ bao gồm mã từ máy chủ mà bạn đã kiểm soát.
zombat

1
Điểm hiện hữu, bao gồm tệp từ xa là một vấn đề bảo mật phổ biến của PHP: en.wikipedia.org/wiki/Remote_File_Ininating#PHP .
Nông dân Frank

63

strtr ()

Nó cực kỳ nhanh, đến mức bạn sẽ ngạc nhiên. Trong nội bộ, nó có thể sử dụng một số cấu trúc kiểu b-cây điên để sắp xếp các trận đấu của bạn theo các tiền tố phổ biến của chúng. Tôi sử dụng nó với hơn 200 chuỗi tìm và thay thế và nó vẫn đi qua 1MB trong vòng chưa đầy 100ms. Đối với tất cả, ngoại trừ chuỗi nhỏ tầm thường, strtr () thậm chí còn nhanh hơn đáng kể so với strtolower () khi thực hiện cùng một điều chính xác, thậm chí có tính đến bộ ký tự. Bạn có thể có thể viết toàn bộ trình phân tích cú pháp bằng cách sử dụng các lệnh gọi strtr liên tiếp và nó sẽ nhanh hơn so với kết hợp biểu thức chính quy thông thường, tìm ra loại mã thông báo, xuất ra loại này hoặc loại kia, loại biểu thức chính quy tiếp theo.

Tôi đang viết một trình bình thường hóa văn bản để tách văn bản thành các từ, hạ thấp, xóa dấu chấm câu v.v. và strtr là con dao quân đội Thụy Sĩ của tôi, nó đánh bật các biểu thức thông thường hoặc thậm chí là str numplace ().


1
Nó có thể nhanh hơn bởi vì nó thay thế nhân vật duy nhất.
staticsan

10
strtr () không chỉ thay thế một ký tự. Nó có thể thay thế các chuỗi chiều dài tùy ý bằng các chuỗi chiều dài tùy ý khác, và nó vẫn có vẻ rất nhanh.
thomasrutter

1
Bạn đã đề cập đến nó nhanh hơn strtolower trong một số trường hợp, bạn có thể chứng minh điều đó không? Tôi đã làm một điểm chuẩn nhỏ và thấy nó là sai.
Nhà phát triển Pixel

1
Tôi thấy rằng trên các chuỗi nhỏ có 80 ký tự, nó chậm hơn strtolower và trên các chuỗi lớn 1MB thì nó nhanh hơn. Có lẽ có một số loại chi phí cố định mỗi lần nó được gọi. Tôi chỉ đơn giản là sử dụng strtr ($ this-> chuỗi, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); Chuỗi tôi đang vận hành là một số văn bản tiếng Anh điển hình ("Con cáo nâu nhanh", đại loại thế).
thomasrutter

Tôi vừa đọc bài đăng này và sau đó đã tìm kiếm và tìm thấy Google: Simplemachines.org/community/index.php?topic=175031.0 Bạn có biết ý tưởng nào là đúng không?
Flipper

61

Một tính năng không được biết đến nhiều của PHP là extract() , một hàm giải nén một mảng kết hợp vào không gian tên cục bộ. Điều này có thể tồn tại cho quá trình cắt bỏ tự động nhưng rất hữu ích cho việc tạo khuôn mẫu:

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

Bây giờ bạn có thể sử dụng render_template('index.html', array('foo' => 'bar'))và chỉ $foovới giá trị "bar"xuất hiện trong mẫu.


15
Tôi sẽ tức giận với bạn vì đã gợi ý trích xuất () theo bất kỳ cách nào là một tính năng tốt. Nhưng tôi đoán rằng việc sử dụng nó là khá tiện dụng. Tôi cho rằng đó là lần duy nhất tôi thấy nó được sử dụng ở nơi đó là một ý tưởng hay!
thomasrutter

5
trích xuất () làm cho nó đơn giản để chết hệ thống khuôn mẫu trọng lượng cực kỳ nhẹ của riêng bạn. +1
Dinah

14
Nó nghịch đảo, compact (), cũng đẹp: $ a = 1; $ b = 2; nhỏ gọn ('a', 'b'); // == mảng ('a' => $ a, 'b' => $ b)
Annika Backstrom

2
Vâng, đó có lẽ là cách sử dụng trích xuất () thực sự tốt duy nhất.
staticsan

4
Tôi sẽ đề nghị không sử dụng các từ phổ biến làm tên đối số hàm trong trường hợp này, vì ngữ cảnh $ mà bạn trích xuất () có thể chứa các giá trị tại các chỉ mục 'as_opes' hoặc 'template_name'. Sử dụng EXTR_SKIP là có thể chấp nhận được, nhưng chỉ di chuyển vấn đề sang nơi khác (nghĩa là nếu mẫu đang mong đợi $ as_ chuỗi, nó sẽ nhận được giá trị không chính xác cho nó.)
Michał Tatarynowicz

52

Phạm vi () không bị ẩn mỗi se, nhưng tôi vẫn thấy rất nhiều người lặp lại với:

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

khi họ có thể sử dụng:

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

Và bạn có thể làm những việc đơn giản như

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

3
bạn có thể thực hiện foreach ($ mảng dưới dạng $ key => $ value) {} thậm chí còn đơn giản hơn.
SilentGhost

15
Nó có thể là một tối ưu hóa vi mô, nhưng đáng chú ý là trong và nhanh hơn và ít bộ nhớ hơn so với foreach.
JAL

3
Bạn nên thử Python. Nó đơn giản như "for i trong phạm vi (12)" hoặc bạn có thể sử dụng xrange hiệu quả hơn.
Ponkadoodle

2
@SilentGhost: bạn vẫn cần một mảng để bắt đầu, điều này không phải lúc nào cũng đúng. @Newbie: làm ơn giải thích?
Alec

1
@flexxy, ngay lập tức, nó KHÔNG. Xem xét điều này: phpbench.com cuộn xuống Read Loop.
Buddy

44

Không gian web kích hoạt PHP thường rẻ hơn so với một cái gì đó với (asp) .net. Bạn có thể gọi đó là một tính năng ;-)


3
Nó cũng rẻ hơn nhiều để thiết lập nhiều máy chủ nếu bạn không phải trả tiền cho Windows Server trên mỗi máy chủ.
MiffTheFox

4
Nơi duy nhất tôi biết Windows có hiệu quả về chi phí là tại một trường đại học được giảm giá STEEEEP trên phần mềm máy chủ với giá rẻ hơn khi tôi mua 100 bản sao của windows so với đào tạo quản trị viên của chúng tôi trên linux (một phần làm tôi buồn nhưng thiết lập windows của họ sạch sẽ và thiết lập tốt).
dcousineau

4
Hiện tại, nhưng bạn phải thực hiện chuyển đổi chỉ một lần, trong khi bạn sẽ phải mua giấy phép mới sớm hay muộn ...
e-satis

42

Các statictừ khóa nằm ngoài hữu ích của một quan điểm OOP. Bạn có thể nhanh chóng và dễ dàng thực hiện 'ghi nhớ' hoặc bộ đệm ẩn chức năng với một cái gì đó đơn giản như:

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

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

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

Các statictừ khóa tạo ra một biến mà vẫn tồn tại chỉ trong phạm vi chức năng mà trước đây thực hiện. Kỹ thuật này rất tốt cho các chức năng đánh vào cơ sở dữ liệu như get_all_books_by_id(...)hoặc get_all_categories(...)bạn sẽ gọi nhiều lần trong khi tải trang.

Hãy cẩn thận: Hãy chắc chắn rằng bạn tìm ra cách tốt nhất để tạo khóa cho hàm băm của mình, trong mọi trường hợp md5(...)ở trên KHÔNG phải là một quyết định tốt (vấn đề về tốc độ và độ dài đầu ra), tôi đã sử dụng nó cho mục đích minh họa. sprintf('%u', crc32(...))hoặc spl_object_hash(...)có thể tốt hơn nhiều tùy thuộc vào bối cảnh.


7
Chỉ là một tính năng được sao chép từ C / C ++
GetFree

2
@GetFree Tôi không nghĩ ai sẽ phủ nhận rằng hầu hết tất cả các PHP đã được sao chép từ C, C ++, Perl, v.v.
Frank Farmer

1
Sao chép là điều tốt nhất có thể được thực hiện.
NikiC

1
PHP tệ. Nó luôn sao chép các tính năng từ người khác. Nó nên viết mọi thứ từ đầu! (Trong trường hợp khả năng nhỏ nhất của việc này được thực hiện nghiêm túc: Tôi nói đùa)
Halil zgür

42

Một tính năng hay của PHP là CLI . Nó không được "quảng bá" trong tài liệu nhưng nếu bạn cần các tập lệnh / ứng dụng bảng điều khiển thông thường, sử dụng cron + php cli thực sự rất nhanh để phát triển!


Tôi thực sự nên xem xét điều này, tôi có một số công việc định kỳ tìm nạp tập lệnh PHP thông quawget http://example.com...
DisgruntledGoat

CLI cũng là một cách tuyệt vời để gỡ lỗi tại chỗ, vì các cảnh báo / lỗi sẽ hiển thị mà bạn không phải thay đổi tùy chọn báo cáo lỗi.
Glacials

40

Sau đó "và in" lừa

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

Sẽ lặp lại Blah nếu cờ $ là đúng. KHÔNG LÀM VIỆC VỚI ECHO.

Điều này rất tiện dụng trong mẫu và thay thế? : điều đó không thực sự dễ đọc.


24
Bản thân tôi tìm thấy toán tử ternary rõ ràng hơn nhiều so với việc khai thác đánh giá ngắn gọn của một logic và.
Vicent Marti

26
Trên thực tế, đó là cùng số lượng ký tự như <? Php if ($ flag) in "Blah"
quá nhiều php

3
Dấu ngoặc đơn không dễ gõ như "và", đặc biệt là trên bàn phím tiếng Pháp đẫm máu của tôi ;-)
e-satis

7
@all bình luận - Đây không phải là về thời gian ngắn bạn có thể nhận được nó! Đó là về khả năng đọc và dễ sử dụng cho người mẫu, đôi khi thậm chí không phải là lập trình viên.
Tor Valamo

6
Tôi sẽ nhận xét rằng câu lệnh if () dễ dàng và dễ đọc hơn. Tôi chắc chắn dễ dàng hiểu được hơn là khai thác về cơ bản là tác dụng phụ của toán tử 'và' trong PHP, nơi dễ mắc lỗi (hoặc có vẻ như đó là lỗi khi bạn đọc mã sau). Ví dụ, như đã nêu, điều này sẽ không hoạt động theo cách bạn muốn với 'echo'. Với if () không có gotchas như thế này.
thomasrutter

37

Bạn có thể dùng ký tự trừ trong các tên biến như thế này:

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

Tại sao sử dụng nó? Không có ý tưởng: có thể cho một mô hình CSS? Hoặc một số JSON kỳ lạ bạn cần xuất ra. Đó là một tính năng kỳ lạ :)


2
Nó có hoạt động với tên phương thức không? Có thể hữu ích cho các khung sử dụng bộ định tuyến và tôi muốn domain.com/s Something
alex

6
Các dấu ngoặc nhọn cho phép bạn truy cập các phần thích hợp của đối tượng có dấu gạch ngang, dấu chấm và các thực thể không chữ và số khác. Một lý do để sử dụng nó là khi giao dịch với xml, trong đó tên thực thể có thể được chấm như trong NITF / NewsML <body.content>. Nếu bạn sử dụng SimpleXML, bạn sẽ truy cập nó như thế này $item->DataContent->body->{'body.content'}.
Jesse Kochis

2
Các biến PHP có thể lấy bất kỳ ký tự nào khi được sử dụng theo cách đó, thậm chí cả khoảng trắng và dòng mới.
Newbie

Điều này sẽ rất hữu ích khi sử dụng trong SimpleXML ... tuyệt vời. Cám ơn vì đã chia sẻ.
KyleFarris

34

Cú pháp HEREDOC là tính năng ẩn yêu thích của tôi. Luôn luôn khó tìm vì bạn không thể tìm kiếm Google cho <<< nhưng điều đó ngăn bạn phải thoát khỏi khối lượng lớn HTML và vẫn cho phép bạn thả các biến vào luồng.

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

2
HEREDOC là cách yêu thích của tôi để xây dựng và sử dụng các câu lệnh SQL.
bdl

11
Lưu ý: EOM đóng cửa; không thể thụt lề.
micahwittman

Tốt, nhưng vô nghĩa nếu bạn sử dụng các mẫu. Thêm vào đó, nó được theo cách thụt lề thích hợp.
Manos Dilaverakis

7
Chúa ơi, đó là đoạn mã xấu nhất tôi từng thấy. Nếu bạn đang sử dụng HEREDOC, thì bạn đã tách phần trình bày khỏi logic.
Lotus Notes

@Byron: Bạn không phải sử dụng nó để trình bày, nó có thể được sử dụng cho bất kỳ chuỗi nào. Xem bình luận từ bdl.
Tom Pažourek

34

Có lẽ không nhiều người biết rằng có thể chỉ định các "biến" không đổi làm giá trị mặc định cho các tham số hàm:

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

Chuỗi có thể được sử dụng như thể chúng là mảng :

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

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

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

3
Đó là cuối cùng là tiện lợi. Mặc dù tôi không biết khi nào nó sẽ tốt hơn một số phương pháp loại bỏ một nhân vật khác. +1 không mất tiền
George Mauer

3
Có lẽ hiệu quả hơn là gọi một chức năng để làm điều đó. Các chuỗi thường được lưu trữ liên tục trong bộ nhớ, do đó, việc truy cập $ str [4] là chuyện nhỏ. Lưu chuỗi dưới dạng mảng ký tự là phổ biến đối với hầu hết các ngôn ngữ xuất phát từ C.
sjobe

1
Bạn không phải sử dụng hằng số xác định làm giá trị mặc định. Những điều sau đây cũng hoàn toàn hợp lệ: hàm foot ($ param1, $ default = mảng ('key' => 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false). Tuy nhiên, bạn đã đúng khi lưu ý rằng bạn không thể sử dụng một biến làm đối số mặc định.
dcousineau

@dcousineau Ví dụ của bạn là hoàn toàn hợp lệ vì mảng () không phải là hàm mà là cấu trúc ngôn ngữ. Các cuộc gọi chức năng không được phép làm giá trị mặc định cho các đối số.
Jamol

4
Hãy cẩn thận với việc coi các chuỗi là mảng nếu bạn có chuỗi nhiều byte (tiếng nước ngoài, v.v.)
philfreo

33

Điều hữu ích nhất về mã PHP là nếu tôi không hiểu rõ về một chức năng tôi thấy tôi có thể tra cứu nó bằng cách sử dụng trình duyệt và gõ:

http://php.net/feft

Tháng trước tôi đã thấy hàm "phạm vi" trong một số mã. Đó là một trong hàng trăm chức năng tôi quản lý không bao giờ sử dụng nhưng hóa ra nó thực sự hữu ích:

http://php.net/range

Url đó là một bí danh cho http://us2.php.net/manual/en/feft.range.php . Ý tưởng đơn giản đó, về các chức năng ánh xạ và từ khóa thành url , thật tuyệt vời.

Tôi muốn các ngôn ngữ, khung, cơ sở dữ liệu, hệ điều hành khác có cơ chế đơn giản để tra cứu tài liệu.


5
range()có thể hữu ích choforeach( range(1, 10) as $i) { };
alex

Nếu bạn có FireFox; chỉ cần gõ PHP functionvào thanh địa chỉ, nó sẽ thực hiện tìm kiếm Google 'Tôi cảm thấy may mắn' và bạn hầu như luôn kết thúc trên trang tài liệu php phù hợp.
Kolky 18/03/2016

30

Bình luận khối nhanh

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


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

Những nhận xét này cho phép bạn chuyển đổi nếu một khối mã được nhận xét bằng một ký tự.


14
Điều này không thực sự cụ thể đối với PHP. Điều này hoạt động trong bất kỳ ngôn ngữ hỗ trợ // ...bình luận dòng và /* ... */chặn bình luận.
Jordan Ryan Moore

bất kỳ tiện ích dọn dẹp mã nào đều ghét bạn vì đã sử dụng ...;)
Talvi Watia

3
Tôi cũng đã sử dụng /** /trước và /**/sau. Bạn có thể chuyển đổi khối bằng cách loại bỏ và thêm khoảng trắng vào đầu tiên. Điều này có thêm lợi ích khi làm việc với CSS (và các ngôn ngữ khác không hỗ trợ // ... nhận xét).
kingjeffrey

FWIW, liên kết đến bài viết gốc aleembawany.com/2009/01/27/lazy-block-comment-trick
aleemb

@aleemb, không được thực hiện bất kỳ chỉnh sửa nào nữa cho câu hỏi này.
Sam52

29

Danh sách của tôi .. hầu hết trong số chúng thuộc nhiều "tính năng ẩn" hơn là "tính năng yêu thích" (tôi hy vọng!), Và không phải tất cả đều hữu ích, nhưng .. yeah.

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

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

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

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

Bạn có thể lồng các toán tử ternary quá, đôi khi có ích.

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

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

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

Phải, tôi sẽ dừng ngay bây giờ :-)


Hmm, đã được một lúc rồi ..

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

Vì vậy, chỉ cần phát hiện ra bạn có thể chuyển bất kỳ chuỗi nào dưới dạng tên phương thức NẾU bạn đặt nó với dấu ngoặc nhọn. Bạn không thể định nghĩa bất kỳ chuỗi nào là một phương thức, nhưng bạn có thể bắt chúng bằng __call () và xử lý chúng thêm khi cần. Hừm ....

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

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

Tìm thấy viên ngọc nhỏ này trong các bình luận Reddit:

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

Bạn không thể gọi các hàm bên trong {} như thế này trực tiếp, nhưng bạn có thể sử dụng các biến-giữ-chức năng-tên và gọi chúng! (* và * bạn cũng có thể sử dụng các biến số trên đó)


2
Xin đừng lạm dụng toán tử so sánh ternary; Điều này dẫn đến mã obfuscation.
staticsan

Ồ Điều đó hoàn toàn có thể vòi danh sách $ GLOBALS của bạn. Thực hành xấu. Nghiêm túc.
Talvi Watia

Có một cuộc thi PHP khó hiểu nào chưa?
Lotus Notes

Vâng, lừa với hoán đổi - ấn tượng và hữu ích, cảm ơn.
OZ_

1
${''} = 456;hahaha .... khá là lạm dụng.
Skurmedel

26

Thao tác mảng.
Hàng tấn công cụ để làm việc với và thao tác các mảng. Nó có thể không phải là duy nhất đối với PHP, nhưng tôi chưa bao giờ làm việc với một ngôn ngữ khiến nó trở nên dễ dàng như vậy.


như cái gì chẳng hạn? Dường như với tôi, các chức năng đều được đặt tên và định vị một cách vụng về trong không gian tên toàn cầu. Thêm vào đó, tôi không thể nghĩ ra bất cứ điều gì không dễ dàng bằng ngôn ngữ khác ngoại trừ có thể $ Array [] = $ newvalue để thêm các giá trị - thật tuyệt
George Mauer

8
Chà, mảng PHP là một cơ sở hạ tầng có thể được sử dụng dễ dàng như một ngăn xếp, hàng đợi, deque, danh sách, hàm băm, v.v ... Nó thực sự linh hoạt cho hầu hết các nhu cầu phổ biến, mà không cần dùng đến bất kỳ thứ gì khác ngoài các hàm Array_ *.
Camilo Díaz Repka

6
Python thực hiện các mảng (như danh sách và bộ dữ liệu) tốt hơn nhiều so với PHP.
quá nhiều php

26

Tôi hơi giống bạn, tôi đã mã hóa PHP được hơn 8 năm. Tôi đã phải tham gia khóa học .NET / C # khoảng một năm trước và tôi thực sự thích ngôn ngữ C # (ghét ASP.NET) nhưng nó khiến tôi trở thành một nhà phát triển PHP tốt hơn.

PHP là một ngôn ngữ khá kém, nhưng, tôi cực kỳ nhanh nhạy với nó và LAMP stack thật tuyệt vời. Sản phẩm cuối cùng vượt xa tổng của các bộ phận.

Điều đó nói rằng, trong câu trả lời cho câu hỏi của bạn:

http://uk.php.net/SPL

Tôi yêu SPL , lớp sưu tập trong C # là thứ mà tôi thích ngay khi tôi bắt đầu với nó. Bây giờ tôi có thể có bánh của tôi và ăn nó.

Andrew


24

Tôi hơi ngạc nhiên khi chưa có ai đề cập đến nó, nhưng một trong những thủ thuật yêu thích của tôi với mảng là sử dụng toán tử cộng. Nó là một chút như array_merge()nhưng đơn giản hơn một chút. Tôi đã tìm thấy nó thường là những gì tôi muốn. Trên thực tế, nó lấy tất cả các mục trong RHS và làm cho chúng xuất hiện trong một bản sao của LHS, ghi đè khi cần thiết (nghĩa là nó không giao hoán). Rất hữu ích để bắt đầu với một mảng "mặc định" và thêm một số giá trị thực trong một lần nhấn, trong khi vẫn giữ nguyên các giá trị mặc định cho các giá trị không được cung cấp.

Mẫu mã được yêu cầu:

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

// ... many lines later ...

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

$defaultsnên là$control_defaults
diEcho

3
Tôi nghĩ nó không rõ ràng như Array_merge khi bạn có nhiều mã để duy trì. Ít nhất, khi bạn sử dụng, hàm Array_merge, rõ ràng là bạn đang xử lý các mảng.
Sylvain

Và thực tế là bạn đang làm ... + array( ...không đủ để chỉ ra điều này? :-)
staticsan

Phiên bản PHP nào bạn cần cho việc này?
Lotus Notes

Đây là một tính năng tuyệt vời và cần lưu ý rằng mảng ở phía "bên phải" của "+" sẽ không ghi đè lên các khóa hiện có của mảng sang phía "bên trái" của "+".
Wil Moore III

21

Đây là một, tôi thích cách đặt giá trị mặc định cho các tham số chức năng không được cung cấp dễ dàng hơn nhiều:

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

4
Thật thú vị, tôi đã thấy "tính năng ẩn" này trong Google Reader tuần trước. Tôi không hiểu những gì ẩn về nó - đó là cú pháp cơ bản. Hãy thử nếu ($ var = true) chẳng hạn.
Ross

8
Dễ hơn cái gì? Hầu hết các ngôn ngữ có tính năng này.
Christian Davén

10
Dễ dàng hơn C # (và tôi nghĩ C ++ và Java)
George Mauer

8
C ++ không hỗ trợ các giá trị tham số mặc định.
sjobe

2
c # hoàn toàn không hỗ trợ các giá trị mặc định. bạn phải viết một hàm quá tải và luôn luôn khai báo giá trị chỉ đơn giản là cồng kềnh
DeveloperChris

21

Nhanh và bẩn là mặc định.
Ngôn ngữ chứa đầy các phím tắt hữu ích, Điều này làm cho PHP trở thành ứng cử viên hoàn hảo cho các dự án (nhỏ) có thời gian tiếp thị ngắn. Không phải mã PHP sạch là không thể, nó chỉ cần thêm một chút nỗ lực và kinh nghiệm.

Nhưng tôi yêu PHP vì nó cho phép tôi thể hiện những gì tôi muốn mà không cần gõ một bài luận.

PHP:

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

JAVA:

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

Và vâng, bao gồm không gõ Int .


4
thay vào đó, bạn nên sử dụng strpose: if (false! == strpose ("one cat", "cat")) {
OIS

17
@OIS mục đích của ví dụ của anh ấy là để minh họa và so sánh việc chạy một trận đấu regex nhanh, chứ không phải làm thế nào để tìm chuỗi "con mèo" trong "một con mèo".
dcousineau

19
Java: if (Pattern.matches ("cat", "one cat")) {// làm gì đó} Dừng phàn nàn về java nếu bạn không biết điều đó.
whiskeyierra

3
+1 Willi làm thế nào để bạn thực hiện preg numplace ('/ ([<[]! - \ s *) (\ S *?) (\ S * - [>]]?) / Se', "\ $ this- > Chọn ('\\ 1', '\\ 2', '\\ 3', \ $ data) ", $ text); trong Java? Điều này tìm thấy một nhận xét trong văn bản đầu vào và sau đó gọi một hàm với các phần tử được khớp trong trường hợp này $ this-> select (...) quyết định cái gì sẽ thay thế kết quả khớp và trả về kết quả.
Nhà phát

1
Regex là PHP khá là nhảm nhí ... Tôi muốn có nhiều hơn theo kiểu Perl hoặc JavaScript Regex nơi //ngôn ngữ được tích hợp vào ngôn ngữ.
cdmckay
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.