คุณสมบัติที่ซ่อนของ PHP? [ปิด]


174

ฉันรู้ว่ามันฟังดูเหมือนคำถามที่มีประเด็นประเด็น แต่ให้ฉันอธิบายว่าฉันมาจากไหน

นอกวิทยาลัยฉันได้งานที่ร้าน PHP ฉันทำงานที่นั่นหนึ่งปีครึ่งและคิดว่าฉันได้เรียนรู้ทั้งหมดที่มีเพื่อเรียนรู้เกี่ยวกับการเขียนโปรแกรม

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

ตอนนี้ฉันพบว่าตัวเองกำลังรับโปรเจ็กต์ php กำลังทำการเขียนโค้ดสำหรับการเริ่มต้นของเพื่อนและฉันรู้สึกว่าถูก จำกัด อย่างสิ้นเชิงเมื่อเทียบกับการเขียนโปรแกรมใน C # มันทำให้ฉันรำคาญใจจริง ๆ ว่าตัวแปรทั้งหมดที่อยู่ในขอบเขตของคลาสต้องถูกอ้างอิงโดยการต่อท้าย '$ this->' มันทำให้ฉันรำคาญว่าไม่มี IDEs ใด ๆ ที่ฉันพยายามมีความเป็น Intellisense ที่ดีมากและวิธีการทดสอบหน่วย SimpleTest ของฉันต้องเริ่มต้นด้วยคำว่า 'test' มันทำให้ฉันคลั่งไคล้ที่การพิมพ์แบบไดนามิกทำให้ฉันไม่สามารถระบุวิธีการที่ชนิดพารามิเตอร์คาดหวังได้และคุณต้องเขียนคำสั่ง switch เพื่อทำวิธีการโอเวอร์โหลด ฉันไม่สามารถยืนได้ว่าคุณไม่มีเนมสเปซที่ซ้อนกันและต้องใช้ตัวดำเนินการ :: เพื่อเรียกคอนสตรัคเตอร์ของคลาสพื้นฐาน

ตอนนี้ฉันไม่มีความตั้งใจที่จะเริ่มต้นการอภิปราย PHP กับ C # แต่สิ่งที่ฉันหมายถึงคือฉันแน่ใจว่ามีฟีเจอร์ PHP บางอย่างที่ฉันไม่ทราบหรือรู้ แต่ยังไม่สามารถใช้งานได้อย่างถูกต้อง ฉันอยู่ในจักรวาล C # และมีปัญหาในการมองเห็นนอกชามแก้ว

ดังนั้นฉันจึงถามคุณสมบัติที่คุณโปรดปรานของ PHP คืออะไร? คุณสามารถทำอะไรในสิ่งที่คุณทำไม่ได้หรือยากขึ้นในภาษา. Net


กระบวนทัศน์ที่แตกสลาย OO? สำหรับฉันมันเป็นคุณสมบัติ "ซ่อน" ที่แย่ที่สุดที่คุณค้นพบ
knoopx

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

@Ganesh ข้อผิดพลาดของผู้ชายคนหนึ่งเป็นอีกหนึ่งชายคุณลักษณะที่ซ่อนอยู่ ...
Xeoncross

คำตอบ:


328

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


60
ฉันเห็นด้วย. ความสามารถในการพิมพ์ www.php.net/function_name และการอ้างอิงส่วนใหญ่นั้นยอดเยี่ยม
Allain Lalonde

1
นี่เป็นฟีเจอร์ที่ยอดเยี่ยมของ PHP แต่ฉันจะไม่เรียกมันว่าซ่อนอยู่จริงๆ ... ถ้าคุณเคยลองใช้พารามิเตอร์ของเมธอด ฯลฯ คุณจะพบกับ php.net
John Bubriski

27
ฉันเห็นด้วยเช่นกัน สิ่งที่ยิ่งใหญ่ที่สุดเกี่ยวกับคู่มือคือความคิดเห็นของผู้ใช้ ฉันไม่ค่อยเห็นเอกสารอื่น ๆ พวกเขาสามารถมีอัญมณีจริง ข้อเสียเพียงอย่างเดียวคือ IMHO พวกเขาตัดแต่งกิ่งเล็ก ๆ น้อย ๆ เร็วเกินไป
Sander Marechal

3
@Phoexo "อ่านน้อยลง" ฉันไม่เคยเข้าใจและจะไม่เข้าใจ MSDN ในขณะที่เอกสาร PHP นั้นง่ายและชัดเจน
lauriys

3
ไม่เห็นด้วย เหตุผลเดียวที่เอกสารประกอบคือ "ดี" เป็นเพราะความคิดเห็นของผู้ใช้บางส่วนเสียบรูทั้งหมดในบันทึกอย่างเป็นทางการ
Rob Howard

179

อาร์เรย์ ตัดสินจากคำตอบของคำถามนี้ฉันไม่คิดว่าผู้คนจะชื่นชมอย่างเต็มที่ว่าอาร์เรย์ใน PHP นั้นง่ายและมีประโยชน์เพียงใด PHP Arrays ทำหน้าที่เป็นรายการแผนที่สแต็คและโครงสร้างข้อมูลทั่วไปในเวลาเดียวกัน อาร์เรย์มีการใช้งานในแกนภาษาและใช้ทั่วสถานที่ซึ่งส่งผลให้สถานที่ที่แคช CPU ที่ดี Perl และ Python ใช้โครงสร้างภาษาแยกต่างหากสำหรับรายการและแผนที่ทำให้การคัดลอกและการแปลงสับสนมากขึ้น


11
มีการเรียงลำดับองค์ประกอบของ PHP
user8134

117
การย้ายครั้งแรกของฉันจาก PHP เป็น C # เกือบฆ่าฉัน ใน C # อาร์เรย์เป็นเพียงโครงสร้างอย่างง่ายที่มีขนาดคงที่และดัชนีตัวเลข ใน PHP อาร์เรย์คือเทปพันท่อของจักรวาล!
Dinah

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

11
ฉันแน่ใจว่าอาร์เรย์ php นั้นยอดเยี่ยม แต่ 40 คะแนนสำหรับความคิดเห็นที่เคาะอาร์เรย์ C #? หากอาร์เรย์ C # ไม่ตรงกับความต้องการมีตัวเลือกมากมาย ArrayList และคอลเลกชันทั่วไปมีประสิทธิภาพมาก มีคอลเลกชันหลายประเภทสำหรับความต้องการเฉพาะ ข้อได้เปรียบที่แท้จริงของ php ในเรื่องนี้คือมันไม่มีตัวเลือกใด ๆ ที่โปรแกรมเมอร์ต้องตัดสินใจ คุณอาจใช้อาร์เรย์หรือคุณไม่มีตัวแปรที่จัดทำดัชนีได้
G-Wiz

24
ในทางตรงกันข้ามไวยากรณ์สำหรับอาร์เรย์จะสมบูรณ์ ในภาษาสคริปต์มากมายที่คุณสามารถสร้างอาร์เรย์ 2D ง่ายๆเช่นดังนั้น: [[1, 2], [3, 4]]การเปรียบเทียบนี้เพื่อ PHP array(array(1, 2), array(3, 4))รุ่นนี้:
Rene Saarsoo

167

ตัวจัดการกระแสข้อมูลช่วยให้คุณสามารถขยาย "FileSystem" ด้วยตรรกะที่เท่าที่ฉันรู้ค่อนข้างยากที่จะทำในภาษาอื่น ๆ ส่วนใหญ่

ตัวอย่างเช่นตัวจัดการกระแส MS-Excelคุณสามารถสร้างไฟล์ MS Excel ได้ด้วยวิธีต่อไปนี้:

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

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

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

ฉันเชื่อว่ากรอบ KIO ช่วยให้คุณทำเช่นนี้ได้ แต่มีให้เฉพาะกับแอปพลิเคชันเดสก์ท็อปที่ใช้ KDE เท่านั้น
MiffTheFox

21
IMHO ที่มีวิธีการ OO ที่เหมาะสมจะเหมาะสมกว่าระเบียบกับตัวจัดการกระแส ใช่มันน่ารักที่จะสามารถอ่าน / เขียนไฟล์ Excel ได้ แต่ต้องทำงานเช่นนี้หรือไม่?
Anti Veeranna

3
อาจเป็นเช่นนั้น แต่วิธีการนี้จะรวมความซับซ้อนในอินเทอร์เฟซที่เป็นเรื่องธรรมดาสำหรับนักพัฒนา PHP ส่วนใหญ่ ... โดยไม่ต้องให้พวกเขาเรียนรู้แนวคิดเชิงวัตถุที่อาจอยู่นอกเหนือ
Allain Lalonde

13
หากคุณกำลังทำงานกับ Amazon S3 ลองดู Zend_Amazon_S3 ซึ่งมีสตรีมอินเทอร์เฟซสำหรับ URL เช่น 's3: // {bucket-name} / path'
davidtbernal

ฉันใช้สิ่งนี้เพื่อสร้าง DSL ที่ง่ายสำหรับเลเยอร์มุมมองของฉันโดยเพียงแค่อ่านไฟล์ PHP ทำการเปลี่ยนสตริงและส่งผ่าน eval รางน้ำ () เช่นฉันสร้างขึ้นเพื่อให้ฉันสามารถใช้แท็กสั้น ๆ เมื่อใดก็ตามที่ฉันเลือกและทำ @ -> someVar เพื่อให้ฉันสามารถเข้าถึงข้อมูลระดับการดูได้
Jasper Bekkers

131

เมธอด Magicเป็นเมธอดแบบ fall-through ที่ถูกเรียกเมื่อใดก็ตามที่คุณเรียกใช้เมธอดที่ไม่มีอยู่หรือกำหนดหรืออ่านคุณสมบัติที่ไม่มีอยู่เหนือสิ่งอื่นใด

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

c ++ นักพัฒนาที่นี่อาจสังเกตเห็นว่า PHP ช่วยให้ผู้ประกอบการบางมากไปเช่นหรือ() (string)ที่จริงแล้ว PHP อนุญาตให้โอเวอร์โหลดได้มากขึ้นตัวอย่างเช่น[]โอเปอเรเตอร์ ( ArrayAccess ) การforeachสร้างภาษา ( IteratorและIteratorAggregate ) และcountฟังก์ชั่น ( นับได้ )


4
เป็นตัวอย่างที่มีประโยชน์เกี่ยวกับสิ่งที่สามารถทำได้ด้วยวิธีการมายากล goto phpcodetips.blogspot.com/2008/07/domain-model-validation.html
grom

6
ไม่เห็นด้วย นี้อยู่ไกลอ่อนแอกว่าสิ่งอำนวยความสะดวกที่คล้ายกันในสมอลล์ทอล์คทับทิมและงูหลาม (และสันนิษฐานว่ามันถูกคัดลอกมาจากหนึ่งในเหล่านี้)
finnw

34
ความจริงที่ว่าการใช้งาน PHP ของฟังก์ชั่นนี้อ่อนแอกว่าภาษาอื่น ๆ นั้นไม่ได้ทำให้ PHP มีประโยชน์น้อยลง
Allain Lalonde

2
__call()เป็นกรอบที่ยอดเยี่ยมในแผนที่ map.com/controller/method/
alex

7
วิธีการเวทย์มนตร์ก็ช้าเหมือนนรก ใช้อย่างระมัดระวัง
Alex Weinstein

95

ระดับมาตรฐานเป็นภาชนะเรียบร้อย ฉันเพิ่งเรียนรู้เกี่ยวกับมันเมื่อเร็ว ๆ นี้

แทนที่จะใช้อาร์เรย์เพื่อเก็บแอตทริบิวต์ของเซิร์ฟเวอร์

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

คุณสามารถใช้คลาสมาตรฐาน

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

สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อเข้าถึงตัวแปรเหล่านี้ในสตริง

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

43
"{$ person ['name']} คือ {$ person ['อายุ']} ปี" ทำงาน
Kornel

27
"คน [ชื่อ] เป็น $ คนอายุ [] ปีเก่า" จะทำงาน ... ไม่มีคำพูดที่ไม่มีวงเล็บ :)
majelbstoat

16
$ string = sprintf ("% s คือ% d ปี", $ person ['name'], $ person ['อายุ']);
Daniel Sloof

60
ขณะที่เราอยู่ในหัวข้อ: (วัตถุ) อาร์เรย์ ("ชื่อ" => 'bob', 'อายุ' => 5)
Annika Backstrom

30
@majelbstoat: การเสนอราคาจะทำให้สคริปต์ช้าลงเนื่องจากล่าม PHP จะดูว่ามีการตั้งค่า 'ชื่อ' และ 'อายุ' ไว้ด้วย define (... ) หรือไม่ นอกจากนี้ยังเป็นแนวปฏิบัติที่ไม่ดีเมื่อพิจารณาว่าเป็นไปได้ที่จะพลิกคีย์ทั้งหมดที่เข้าถึงได้ในแต่ละกรณี: define ('อายุ', 'ชื่อ'); กำหนด ( 'ชื่อ', 'อายุ');
brianreavis

90

การรวมไฟล์สามารถมีค่าส่งคืนที่คุณสามารถกำหนดให้กับตัวแปรได้

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

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

@Peter VERYมีประโยชน์สำหรับ db-> การจัดการข้อผิดพลาดข้อยกเว้น localhost
Talvi Watia

สะดวกสำหรับการตั้งค่าไฟล์กำหนดค่าที่รวดเร็วและสกปรก
Frank Farmer

เหตุใดคุณจึงส่งคืนอาร์เรย์นี้ หากไฟล์ที่รวมมีอาเรย์นั้นสามารถใช้งานได้ที่การรวมทันที
fabrik

5
@fabrik เพราะมันจะเป็นตัวแปรทั่วโลกและมีอยู่ในขอบเขตหลักทั้งหมด ค่อนข้างไม่เป็นที่พอใจนี่เป็นวิธีที่ดีกว่า
Mikulas Dite

ฉันทำงานในโครงการในกรอบ Yii และโครงการนั้นมีไฟล์ config ที่อาเรย์ถูกส่งกลับมาเช่นนี้ตอนนี้ฉันเข้าใจแล้วว่าทำไมไฟล์ถึงเป็นเช่นนี้
นักพัฒนา Simer Twilio Toronto

83

คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าorผู้ประกอบการมีความสำคัญต่ำกว่า=การทำเช่นนี้:

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

หากค่าของการมอบหมายครั้งแรกประเมินเป็นtrueค่าที่สองจะถูกละเว้น ตัวอย่างอื่น:

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

7
ฉันไม่มั่นใจในสิ่งนี้มากนักฉันคิดว่า; แม้ว่ามันจะดูเหมือนว่าจะไม่เกิดข้อผิดพลาดได้ง่าย แต่มันก็ตอบโต้ได้ง่ายและในตัวมันเองอาจส่งเสริมข้อผิดพลาด
thomasrutter

14
@Pies: วิธีหนึ่งคือรหัสต่อไปนี้ค่อนข้างยุ่งที่จะซื่อสัตย์: $ page = isset ($ _ GET ['หน้า'])? (int) $ _ GET ['หน้า']: 1; // ข้อดีของสิ่งนี้คือไม่จำเป็นต้องมีการปราบปรามข้อผิดพลาด
DisgruntledGoat

3
ในความคิดที่สองเนื่องจากคุณกำลังมองหาจำนวนเต็มที่คุณสามารถใช้แทน: $ page = is_int ($ _ GET ['หน้า'])? $ _GET ['หน้า']: 1;
DisgruntledGoat

4
มันน่าสังเกตว่ารหัสหลังจากorจะดำเนินการถ้ารหัสก่อนที่จะส่งผลให้ค่าตัวเลขor 0ดังนั้นความหมายอาจเป็นไปได้น้อยกว่าด้วยสิ่งที่ชอบ$_GET['page']แต่เห็นได้ชัดว่าสถานการณ์อาจเกิดขึ้นและเป็นเรื่องที่ดีที่จะระวัง
เปลือกตา

3
นอกจากนี้ยังเป็นที่น่าสังเกตว่าorผู้ประกอบการเป็นรุ่นที่ต่ำกว่าก่อนหน้าของ||ผู้ประกอบการ นอกจากนี้ +1 เพราะนี่เป็นสิ่งที่แสดงออกอย่างมากและฉันมักจะลืมว่าเป็นไปได้ ควรใช้บ่อยขึ้นและชัดเจนในสิ่งที่มันทำ ฉันไม่รู้ว่ารหัส "ตัวผู้ที่แท้จริง" เป็นอย่างไรดังนั้นฉันจึงไม่สามารถออกความเห็นได้
เปลือกตา

80

__autoload()(class-) set_include_path()ไฟล์รับความช่วยเหลือจาก

ใน PHP5 ตอนนี้ไม่จำเป็นต้องระบุรายการคำสั่ง "include_once" แบบยาวเมื่อทำ OOP ที่เหมาะสม

เพียงกำหนดไดเรกทอรีขนาดเล็กซึ่งไฟล์คลาสไลบรารีมีโครงสร้างที่ดีและตั้งค่าพา ธ การรวมอัตโนมัติ:

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

ตอนนี้__autoload()ประจำ:

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

ตอนนี้ PHP จะรวมไฟล์ตามความต้องการโดยอัตโนมัติช่วยประหยัดเวลาในการแยกวิเคราะห์และหน่วยความจำ


spl_autoload_register () ดีกว่าที่จะใช้หรือไม่
alex

19
แน่นอน! __autoload () คือ PHP4 แต่ spl_autoload_register () เป็น "daisy-chaining" แบบทำลายล้างของวิธีการโหลดอัตโนมัติ
วิลเล็ม

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

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

3
โปรดดู PSR-0 อุปกรณ์ประกอบฉากจากคณะทำงานมาตรฐาน PHP (เนื้อเรื่อง ZF, Symfony, Doctrine, CakePHP, Solar, ฯลฯ ) เมื่อใช้การโหลดอัตโนมัติ: groups.google.com/group/php-standards/web / psr-0-final-offer
Philippe Gerber

76

ความสบาย คุณลักษณะที่ยิ่งใหญ่ที่สุดคือความง่ายในการที่นักพัฒนาใหม่จะนั่งลงและเขียนสคริปต์ "ที่ทำงาน" และทำความเข้าใจกับโค้ด

คุณลักษณะที่เลวร้ายที่สุดคือความง่ายในการที่นักพัฒนาใหม่จะนั่งลงและเขียนสคริปต์ "ที่ทำงาน" และคิดว่าพวกเขาเข้าใจโค้ด

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

ฉันจะไม่ถกเถียงเรื่องทางเทคนิคให้มากที่สุดเท่าที่ฉันเคยมีมาก่อน แต่ถ้าคุณมองว่า PHP เป็นชุมชนมากกว่าภาษาบนเว็บชุมชนที่โอบกอดคุณอย่างชัดเจนเมื่อคุณเริ่มพัฒนาประโยชน์ที่ได้พูดด้วยตนเอง


3
ความคิดเห็นที่ดีอย่างแน่นอน Python เป็นภาษาแรกของฉันและมันยอดเยี่ยม แต่การขาดโครงงานที่ฉันรู้สึกว่าสามารถเข้าใจได้สร้างอุปสรรค ด้วย PHP ฉันสามารถค้นหาอะไรก็ได้ในเอกสารและคิดออก ... ทรัพยากรที่มีในเว็บนั้นน่าทึ่งมาก
dscher

76

ตัวแปรและฟังก์ชั่นตัวแปรไม่ต้องสงสัย!

$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!

แนวคิดเดียวกันนี้ใช้กับพารามิเตอร์วัตถุ ($ some_object -> $ some_variable);

เยี่ยมมาก ๆ สร้างโค้ดด้วยลูปและรูปแบบได้ง่ายมากและเร็วกว่าและควบคุมได้มากกว่า eval (Thanx @Ross & @Joshi Spawnbrood!) t


111
ตัวแปรตัวแปรทำให้โค้ดอ่านได้ง่ายขึ้นและมีแนวโน้มที่จะเกิดข้อผิดพลาด
Elzo Valugi

8
และผู้คนใช้สิ่งนี้จริงเหรอ? ผู้ชายฉันเกลียดที่จะอ่านแหล่งข้อมูลเหล่านี้
Gary Willoughby

27
ตัวแปรตัวแปรเป็นหนึ่งในฟีเจอร์ที่แย่ที่สุดที่ PHP เสนอ
davidtbernal

10
9 ใน 10 ครั้งตัวแปรตัวแปรจะถูกแทนที่ด้วยอาร์เรย์ที่ดีกว่าเพื่อให้คุณมีข้อมูลทั้งหมดในที่เดียวคุณสามารถทำซ้ำมากกว่านั้นและอื่น ๆ เฉพาะในบางสถานการณ์ที่อาจมีประโยชน์
Jasper Bekkers

7
โปรดอย่าทำให้มือใหม่ใช้ "คุณสมบัติ"
whiskysierra

68

คุณสามารถใช้ฟังก์ชั่นที่มีจำนวนไม่ได้กำหนดของการขัดแย้ง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
เพิ่งจะโพสต์นี้ เรียงของชอบคุณสมบัติข้อโต้แย้งในฟังก์ชั่น JS
alex

67

ฉันรักไฟล์ระยะไกล สำหรับการพัฒนาเว็บไซต์ฟีเจอร์ประเภทนี้มีประโยชน์เป็นพิเศษ

ต้องการทำงานกับเนื้อหาของเว็บเพจหรือไม่ แบบง่าย ๆ

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

และคุณมีไฟล์จัดการพร้อมใช้งานเหมือนกับไฟล์ทั่วไปอื่น ๆ

หรือวิธีการเกี่ยวกับการอ่านไฟล์ระยะไกลหรือหน้าเว็บโดยตรงในสตริง?

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

ประโยชน์ของวิธีการนี้ยากที่จะพูดเกินจริง

ต้องการวิเคราะห์ภาพระยะไกลหรือไม่ วิธีการเกี่ยวกับการทำมันผ่าน FTP?

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

เกือบทุกฟังก์ชั่น PHP ที่ทำงานกับไฟล์สามารถทำงานกับไฟล์ระยะไกลได้ คุณสามารถแม้กระทั่งinclude()หรือrequire()รหัสไฟล์จากระยะไกลด้วยวิธีนี้


2
นี่คือเพื่อให้ดี! หากต้องการทำสิ่งนี้ใน Java ตัวอย่างเช่นคุณต้องรวมไฟล์ jar gazillion และเขียนโค้ดสำเร็จรูปจำนวนมาก
Kimble

16
"คุณสามารถรวม () หรือต้องการ () ไฟล์รหัสจากระยะไกลด้วยวิธีนี้" แน่นอนรวมถึง () การไฟล์บนเซิร์ฟเวอร์ที่คุณไม่ได้ควบคุมนั้นเป็นความคิดที่แย่มาก
Frank Farmer

4
@Frank - ใช่, ดี, ใครจะเข้าใจว่าคุณจะได้รับรวมทั้งรหัสจากเซิร์ฟเวอร์คุณไม่ควบคุม
ซอมบี้

1
จุดที่ถูกรวมไฟล์จากระยะไกลเป็นปัญหาความปลอดภัยทั่วไป PHP: en.wikipedia.org/wiki/Remote_File_Inclusion#PHP
Frank Farmer

63

strtr ()

มันเร็วมากมากจนคุณต้องประหลาดใจ ภายในอาจใช้โครงสร้างชนิด b-tree บางอย่างเพื่อจัดเรียงการแข่งขันของคุณตามส่วนนำหน้าทั่วไป ฉันใช้มันด้วยการค้นหามากกว่า 200 รายการและแทนที่สตริงและมันยังคงผ่าน 1MB ในเวลาน้อยกว่า 100ms สำหรับสตริง strtr () ทั้งหมด แต่เล็ก ๆ น้อย ๆ นั้นเร็วกว่า strtolower () อย่างมากในการทำสิ่งเดียวกันแม้จะพิจารณาจากตัวละคร คุณอาจจะเขียน parser ทั้งหมดโดยใช้การเรียก strtr ที่ต่อเนื่องกันและมันจะเร็วกว่าการจับคู่นิพจน์ทั่วไปปกติคิดหาประเภทโทเค็นเอาท์พุทสิ่งนี้หรือสิ่งนั้น

ฉันกำลังเขียนข้อความธรรมดาเพื่อแยกข้อความเป็นคำ, ลด, ลบเครื่องหมายวรรคตอนและ strtr คือมีดทหารสวิสของฉันมันทุบกางเกงออกจากการแสดงออกปกติหรือแม้กระทั่ง str_replace ()


1
มันอาจจะเร็วกว่าเพราะใช้การแทนที่อักขระเดียว
staticsan

10
strtr () ไม่เพียง แต่ทำการแทนที่อักขระเดียวเท่านั้น มันสามารถแทนที่ substrings ที่มีความยาวตามอำเภอใจได้ด้วย substrings ที่มีความยาวอื่น ๆ และดูเหมือนว่าจะเร็ว
thomasrutter

1
คุณพูดถึงมันเร็วกว่า strtolower ในบางกรณีคุณสามารถพิสูจน์ได้หรือไม่ ฉันทำเกณฑ์มาตรฐานขนาดเล็กและพบว่าเป็นเท็จ
นักพัฒนา Pixel

1
ฉันพบว่าในสตริงขนาดเล็กจำนวน 80 ตัวอักษรมันช้ากว่า strtolower และบนขนาดใหญ่ที่มีขนาด 1MB มันก็เร็วขึ้น อาจมีบางประเภทค่าใช้จ่ายคงที่ในแต่ละครั้งที่เรียกว่า ฉันแค่ใช้ strtr ($ this-> string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); สายอักขระที่ฉันใช้งานคือข้อความภาษาอังกฤษทั่วไป ("สุนัขจิ้งจอกสีน้ำตาลด่วน" ซึ่งเป็นสิ่งนั้น)
thomasrutter

ฉันเพิ่งอ่านโพสต์นี้จากนั้นก็ทำการค้นหาและค้นพบของ Google บางส่วน: simplemachines.org/community/index.php?topic=175031.0 มี ความคิดใดที่เหมาะสม
Flipper

61

ฟีเจอร์หนึ่งที่ไม่ค่อยเป็นที่รู้จักกันดีของ PHP คือextract()ฟังก์ชั่นที่คลายอาเรย์เชื่อมโยงลงในเนมสเปซในเครื่อง สิ่งนี้อาจมีอยู่สำหรับการยกเลิกการล็อกอัตโนมัติ แต่มีประโยชน์มากสำหรับการสร้างเทมเพลต:

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

ตอนนี้คุณสามารถใช้render_template('index.html', array('foo' => 'bar'))และ$fooมีค่า"bar"ปรากฏขึ้นในเทมเพลตเท่านั้น


15
ฉันจะโกรธที่คุณแนะนำสารสกัด () ในทางใดทางหนึ่งเป็นคุณสมบัติที่ดี แต่ฉันเดาว่าการใช้งานมันค่อนข้างมีประโยชน์ ฉันคิดว่ามันเป็นครั้งเดียวที่ฉันเคยเห็นมันใช้ในที่ซึ่งมันเป็นความคิดที่ดี!
thomasrutter

5
สารสกัด () ทำให้ตายง่ายในการม้วนระบบ templating น้ำหนักเบามากของคุณเอง +1
ไดน่า

14
ขนาดกะทัดรัด () ตรงกันข้ามก็ดีเช่นกัน: $ a = 1; $ b = 2; กะทัดรัด ('a', 'b'); // == array ('a' => $ a, 'b' => $ b)
Annika Backstrom

2
ใช่นั่นเป็นเพียงการใช้สารสกัดที่ดีเท่านั้น ()
27932 staticsan

4
ฉันขอแนะนำไม่ให้ใช้คำทั่วไปเป็นชื่ออาร์กิวเมนต์ฟังก์ชันในกรณีนี้เนื่องจาก $ context ที่คุณแยก () สามารถมีค่าที่ดัชนี 'as_string' หรือ 'template_name' การใช้ EXTR_SKIP นั้นเป็นที่ยอมรับ แต่จะย้ายปัญหาไปที่อื่นเท่านั้น (เช่นถ้าเทมเพลตคาดว่า $ as_string จะได้รับค่าที่ไม่ถูกต้อง)
Michał Tatarynowicz

52

Range ()ไม่ได้ซ่อนอยู่ แต่ฉันยังคงเห็นผู้คนจำนวนมากวนซ้ำกับ:

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

เมื่อพวกเขาสามารถใช้:

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

และคุณสามารถทำสิ่งง่าย ๆ เช่น

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

3
คุณสามารถทำ foreach ($ array เป็น $ key => $ value) {} ซึ่งทำได้ง่ายกว่า
SilentGhost

15
มันอาจเป็นการเพิ่มประสิทธิภาพขนาดเล็ก แต่ก็คุ้มค่าที่จะสังเกตเห็นว่าในขณะที่เร็วกว่าและใช้หน่วยความจำน้อยกว่า foreach
JAL

3
คุณควรลอง Python มันง่ายเหมือน "for i in range (12)" หรือคุณสามารถใช้ xrange ที่มีประสิทธิภาพมากขึ้น
Ponkadoodle

2
@SilentGhost: คุณยังต้องมีอาเรย์เริ่มต้นด้วยซึ่งอาจไม่ใช่ทุกกรณี @ Newbie: โปรดอย่างละเอียด?
อเล็กซ์

1
@flexxy เห็นได้ชัดว่าไม่ใช่ พิจารณานี้phpbench.comRead Loopเลื่อนลงไป
บัดดี้

44

webspace ที่เปิดใช้งาน PHPมักจะมีราคาถูกกว่าบางสิ่งด้วย (asp) .net คุณอาจเรียกได้ว่าเป็นคุณสมบัติ ;-)


3
นอกจากนี้ยังถูกกว่ามากในการตั้งค่าเซิร์ฟเวอร์หลายเครื่องหากคุณไม่ต้องจ่ายค่า Windows Server ในทุก ๆ เครื่อง
MiffTheFox

4
ที่เดียวที่ฉันรู้ว่า Windows ประหยัดค่าใช้จ่ายแค่ไหนในมหาวิทยาลัยที่ได้รับส่วนลด STEEEEP ในซอฟต์แวร์เซิร์ฟเวอร์เท่าที่ถูกกว่าสำหรับแผนกของฉันที่จะซื้อ Windows 100 ชุดมากกว่าการฝึกอบรมผู้ดูแลระบบของเราบน linux ทำให้ฉันเศร้า แต่การติดตั้ง windows ของพวกเขาสะอาดและติดตั้งได้ดี)
dcousineau

4
สำหรับตอนนี้ แต่คุณต้องให้สลับเพียงครั้งเดียวในขณะที่คุณจะต้องซื้อใบอนุญาตใหม่ไม่ช้าก็เร็ว ...
E-satis

42

staticคำหลักที่อยู่นอกการใช้งานของมุมมอง OOP คุณสามารถนำ 'memoization' หรือ function caching ไปใช้อย่างรวดเร็วและง่ายดายด้วยบางสิ่งที่ง่ายเพียง:

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

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

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

staticคำหลักสร้างตัวแปรที่ยังคงมีอยู่เฉพาะภายในขอบเขตของฟังก์ชั่นที่ผ่านมาดำเนินการนั้น เทคนิคนี้เหมาะสำหรับฟังก์ชั่นที่ใช้งานฐานข้อมูลเช่นget_all_books_by_id(...)หรือget_all_categories(...)คุณต้องการโทรมากกว่าหนึ่งครั้งระหว่างการโหลดหน้าเว็บ

Caveat:ตรวจสอบให้แน่ใจว่าคุณหาวิธีที่ดีที่สุดในการสร้างรหัสสำหรับแฮชของคุณในทุก ๆ สถานการณ์ที่กล่าวมาmd5(...)ข้างต้นไม่ใช่การตัดสินใจที่ดี (ปัญหาความเร็วและความยาวของเอาต์พุต) ฉันใช้เพื่อจุดประสงค์ sprintf('%u', crc32(...))หรือspl_object_hash(...)อาจจะดีกว่าขึ้นอยู่กับบริบท


7
เพียงคุณลักษณะที่คัดลอกมาจาก C / C ++
GetFree

2
@GetFree ผมไม่คิดว่าใครจะปฏิเสธได้ว่าเกือบทั้งหมดของ PHP ได้รับการคัดลอกมาจาก C, C ++, Perl และอื่น ๆ
แฟรงก์ชาวนา

1
การคัดลอกเป็นสิ่งที่ดีที่สุดที่สามารถทำได้
NikiC

1
PHP ไม่ดี มันเป็นการคัดลอกฟีเจอร์จากคนอื่นเสมอ ควรเขียนทุกอย่างตั้งแต่เริ่มต้นแทน! (ในกรณีที่มีความเป็นไปได้น้อยที่สุดที่เกิดเรื่องนี้อย่างจริงจัง: ฉันล้อเล่น)
Halil Özgür

42

หนึ่งคุณลักษณะที่ดีของ PHP เป็นCLI มันไม่ได้ "เลื่อนขั้น" ในเอกสารประกอบ แต่ถ้าคุณต้องการแอปสคริปต์ / คอนโซลประจำการใช้ cron + php cli นั้นพัฒนาได้เร็วมากจริงๆ!


ฉันควรตรวจสอบเรื่องนี้จริงๆฉันมีงาน cron หลายอย่างที่ดึงสคริปต์ PHP ผ่านwget http://example.com...
DisgruntledGoat

CLI ยังเป็นวิธีที่ยอดเยี่ยมในการตรวจแก้จุดบกพร่องเนื่องจากคำเตือน / ข้อผิดพลาดจะปรากฏขึ้นโดยที่คุณไม่ต้องเปลี่ยนการตั้งค่าการรายงานข้อผิดพลาดของคุณ
Glacials

40

จากนั้น "และพิมพ์" เคล็ดลับ

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

จะสะท้อน Blah ถ้า $ flag เป็นจริง ไม่ทำงานกับ ECHO

แม่แบบนี้มีประโยชน์มากและแทนที่? : นั่นไม่ใช่เรื่องง่ายที่จะอ่าน


24
ฉันเองพบว่าผู้ประกอบการประกอบไปด้วยชัดเจนมากขึ้นกว่าการใช้ประโยชน์จากการประเมินผลระยะสั้นของตรรกะและ
Vicent Marti

26
ที่จริงแล้วมีจำนวนอักขระเท่ากับ <? php if ($ flag) พิมพ์ "Blah"
มากเกินไป php

3
วงเล็บไม่ได้เป็นเรื่องง่ายที่จะพิมพ์เป็น "และ" โดยเฉพาะอย่างยิ่งบนแป้นพิมพ์ภาษาฝรั่งเศสของฉันเลือด ;-)
E-satis

7
@ ความคิดเห็นทั้งหมด - นี่ไม่ได้เกี่ยวกับว่าคุณจะรับได้แค่ไหน! มันเกี่ยวกับความสามารถในการอ่านและใช้งานง่ายสำหรับผู้ใช้เทมเพลตซึ่งบางครั้งอาจไม่ใช่โปรแกรมเมอร์
Tor Valamo

6
ฉันจะแสดงความคิดเห็นว่าคำสั่ง if () นั้นง่ายและอ่านง่ายขึ้น แน่นอนว่ามันง่ายกว่าสำหรับฉันที่จะได้รับความสนใจมากกว่าการใช้ประโยชน์จากผลข้างเคียงของตัวดำเนินการ 'และ' ใน PHP ซึ่งง่ายต่อการทำผิดพลาด (หรือดูเหมือนว่าเป็นข้อผิดพลาดเมื่อคุณอ่านรหัสในภายหลัง) ตัวอย่างเช่นตามที่ระบุไว้สิ่งนี้จะไม่ทำงานตามที่คุณต้องการด้วย 'echo' ด้วย if () จะไม่มี gotchas เช่นนี้
thomasrutter

37

คุณสามารถใช้อักขระลบในชื่อตัวแปรเช่นนี้:

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

ทำไมต้องใช้ ไม่มีความคิด: อาจจะเป็นรูปแบบ CSS หรือไม่? หรือ JSON แปลก ๆ บางอย่างที่คุณต้องการส่งออก มันเป็นคุณสมบัติแปลก ๆ :)


2
ใช้งานกับชื่อเมธอดได้หรือไม่ อาจมีประโยชน์สำหรับเฟรมเวิร์กที่ใช้เราเตอร์และฉันต้องการ domain.com/something-with-minuses/view/
alex

6
วงเล็บปีกกาช่วยให้คุณสามารถเข้าถึงวัตถุที่มีเครื่องหมายขีด, จุดและเอนทิตีที่ไม่ใช่ตัวอักษรและตัวเลขอื่น ๆ เหตุผลหนึ่งที่ต้องใช้คือเมื่อต้องจัดการกับ xml โดยที่ชื่อเอนทิตีสามารถใช้เป็นจุดใน NITF / NewsML <body.content> ถ้าคุณใช้ SimpleXML $item->DataContent->body->{'body.content'}คุณจะเข้าถึงได้เช่นนี้
Jesse Kochis

2
ตัวแปร PHP สามารถใช้อักขระใด ๆ เมื่อใช้วิธีนั้นเว้นวรรคและบรรทัดใหม่
Newbie

มันจะมีประโยชน์มากเมื่อใช้ใน SimpleXML ... เยี่ยมยอด ขอบคุณสำหรับการแบ่งปัน.
KyleFarris

34

ไวยากรณ์HEREDOCเป็นคุณสมบัติที่ฉันโปรดปราน หายากเสมอเพราะคุณทำไม่ได้กับ Google <<< แต่มันทำให้คุณไม่ต้องหลบหนี HTML ขนาดใหญ่และยังช่วยให้คุณสามารถวางตัวแปรลงในสตรีมได้

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

2
HEREDOC เป็นวิธีที่ฉันโปรดปรานในการสร้างและใช้คำสั่ง SQL
bdl

11
หมายเหตุ: EOM ปิด; ไม่สามารถเยื้อง
micahwittman

ดี แต่ไม่มีประโยชน์ถ้าคุณใช้เทมเพลต รวมทั้งได้รับในทางของการเยื้องที่เหมาะสม
Manos Dilaverakis

7
ท่านที่รักนั่นคือรหัสที่น่าเกลียดที่สุดเท่าที่ฉันเคยเห็นมา หากคุณใช้ HEREDOC อยู่แสดงว่าคุณไม่ได้แยกงานนำเสนอออกจากตรรกะ
Lotus Notes

@Byron: คุณไม่ต้องใช้มันเพื่อการนำเสนอมันสามารถใช้กับสตริงใด ๆ ดูความคิดเห็นจาก bdl
Tom Pažourek

34

อาจไม่มากที่รู้ว่าเป็นไปได้ที่จะระบุ "ตัวแปร" คงที่เป็นค่าเริ่มต้นสำหรับพารามิเตอร์ฟังก์ชั่น:

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

สตริงสามารถใช้ราวกับว่าพวกเขาเป็นอาร์เรย์ :

$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
อันสุดท้ายคือดี แม้ว่าฉันจะไม่รู้เลยว่ามันจะดีไปกว่าวิธีอื่นในการลบตัวละครออกไป +1 อย่างไรก็ตาม
George Mauer

3
มันอาจจะมีประสิทธิภาพมากกว่าการเรียกฟังก์ชั่นให้ทำ ปกติสตริงจะถูกเก็บไว้ในหน่วยความจำอย่างต่อเนื่องดังนั้นการไปที่ $ str [4] จึงเป็นเรื่องเล็กน้อย การจัดเก็บสตริงเป็นอาร์เรย์ของตัวละครเป็นเรื่องธรรมดาที่ภาษาส่วนใหญ่ที่มาจากซี
sjobe

1
คุณไม่จำเป็นต้องใช้ค่าคงที่ที่กำหนดไว้เป็นค่าเริ่มต้น ต่อไปนี้ยังใช้งานได้อย่างสมบูรณ์: foot function ($ param1, $ default = array ('key' => 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false) อย่างไรก็ตามคุณถูกต้องในการสังเกตว่าคุณไม่สามารถใช้ตัวแปรเป็นอาร์กิวเมนต์เริ่มต้น
dcousineau

@dcousineau ตัวอย่างของคุณใช้ได้อย่างสมบูรณ์ตั้งแต่ array () ไม่ใช่ฟังก์ชัน แต่เป็นโครงสร้างภาษา ไม่อนุญาตให้เรียกใช้ฟังก์ชันเป็นค่าเริ่มต้นสำหรับอาร์กิวเมนต์
Jamol

4
ระมัดระวังกับการรักษาสตริงเป็นอาร์เรย์ถ้าคุณมีสายหลายไบต์ (ภาษาต่างประเทศอื่น ๆ )
philfreo

33

สิ่งที่มีประโยชน์มากที่สุดเกี่ยวกับโค้ด PHP คือถ้าฉันไม่เข้าใจฟังก์ชั่นที่ฉันเห็นฉันสามารถค้นหามันได้โดยใช้เบราว์เซอร์และพิมพ์:

http://php.net/function

เมื่อเดือนที่แล้วฉันเห็นฟังก์ชั่น "ช่วง" ในบางรหัส เป็นหนึ่งในฟังก์ชั่นนับร้อยที่ฉันจัดการไม่เคยใช้ แต่กลายเป็นประโยชน์จริงๆ:

http://php.net/range

มี URL ที่เป็นนามแฝงสำหรับhttp://us2.php.net/manual/en/function.range.php ความคิดง่ายๆของฟังก์ชั่นการทำแผนที่และคำหลักที่นำไปสู่ ​​URLนั้นยอดเยี่ยมมาก

ฉันต้องการภาษาอื่น ๆ กรอบฐานข้อมูลระบบปฏิบัติการมีกลไกที่ง่ายในการค้นหาเอกสาร


5
range()สามารถเป็นประโยชน์สำหรับforeach( range(1, 10) as $i) { };
alex

หากคุณมี FireFox เพียงพิมพ์PHP functionในแถบที่อยู่จะเป็นการค้นหา 'ดีใจจังค้นแล้วเจอเลย' ของ Google และคุณมักจะจบลงที่หน้าเอกสาร php ที่ถูกต้อง
Kolky

30

บล็อกความคิดเห็นอย่างรวดเร็ว

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


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

ความคิดเห็นเหล่านี้ช่วยให้คุณสามารถสลับหากบล็อกรหัสถูกใส่ความคิดเห็นด้วยอักขระหนึ่งตัว


14
นี่ไม่ใช่เฉพาะ PHP จริงๆ ใช้งานได้ในภาษาใดก็ได้ที่รองรับ// ...ความคิดเห็นในบรรทัดและ/* ... */บล็อกความคิดเห็น
จอร์แดนไรอันมัวร์

ยูทิลิตี้การล้างโค้ดใด ๆ จบลงด้วยการเกลียดคุณที่ใช้สิ่งนี้ ... ;)
Talvi Watia

3
ฉันยังใช้/** /ก่อนและ/**/หลัง คุณสามารถสลับบล็อกโดยการลบและเพิ่มพื้นที่ในครั้งแรก สิ่งนี้มีประโยชน์เพิ่มเติมในการทำงานกับ CSS (และภาษาอื่น ๆ ที่ไม่สนับสนุน// ... ความคิดเห็น)
kingjeffrey

FWIW ลิงก์ไปยังบทความต้นฉบับaleembawany.com/2009/01/27/lazy-block-comment-trick
aleemb

@aleemb อย่าทำการแก้ไขเพิ่มเติมสำหรับคำถามนี้
Sam152

29

รายการของฉัน .. ส่วนใหญ่ตกอยู่ภายใต้ "คุณสมบัติที่ซ่อนอยู่" มากกว่า "คุณสมบัติที่ชื่นชอบ" (ฉันหวังว่า!) และไม่ใช่ทั้งหมดที่มีประโยชน์ แต่ .. ใช่

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

คุณสามารถซ้อนผู้ประกอบการที่ประกอบไปด้วยเหมือนกันบางครั้งก็มีประโยชน์

// 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.  

ใช่ฉันจะหยุดตอนนี้ :-)


อืมมันผ่านมาซักพักแล้ว ..

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

ดังนั้นเพียงแค่ค้นพบว่าคุณสามารถผ่านสตริงใด ๆ ที่เป็นชื่อวิธีการถ้าคุณใส่มันด้วยวงเล็บปีกกา คุณไม่สามารถกำหนดสตริงใด ๆ เป็นวิธีอนิจจา แต่คุณสามารถจับพวกเขาด้วย __call () และดำเนินการต่อไปได้ตามต้องการ อืมม ....

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

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

พบอัญมณีเล็ก ๆ นี้ในความคิดเห็น Reddit:

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

คุณไม่สามารถเรียกใช้ฟังก์ชันภายใน {} ได้เช่นนี้โดยตรง แต่คุณสามารถใช้ตัวแปรที่มีชื่อฟังก์ชันและเรียกสิ่งเหล่านั้นได้! (* และ * คุณสามารถใช้ตัวแปรตัวแปรได้เช่นกัน)


2
โปรดอย่าใช้ตัวดำเนินการเปรียบเทียบแบบไตรภาคมากเกินไป สิ่งนี้นำไปสู่การทำให้งงงวยรหัส
staticsan

ว้าว. นั่นอาจทำให้รายชื่อ $ GLOBALS ของคุณสมบูรณ์ การปฏิบัติที่ไม่ดี อย่างจริงจัง.
Talvi Watia

มีการประกวด PHP ที่สับสนหรือยัง
Lotus Notes

ดีเคล็ดลับการแลกเปลี่ยน - น่าประทับใจและมีประโยชน์ขอบคุณ
OZ_

1
${''} = 456;ฮ่าฮ่าฮ่า .... เป็นการละเมิด
Skurmedel

26

การจัดการอาร์เรย์
เครื่องมือมากมายสำหรับการทำงานกับและจัดการอาร์เรย์ มันอาจจะไม่ซ้ำกับ PHP แต่ฉันไม่เคยทำงานกับภาษาที่ทำให้มันง่าย


เช่นอะไร ดูเหมือนว่าฉันจะชอบฟังก์ชั่นทั้งหมดตั้งชื่ออย่างน่าอึดอัดใจและวางตำแหน่งใน namespace ทั่วโลก นอกจากนี้ฉันไม่สามารถคิดอะไรที่ไม่เพียง แต่เป็นเรื่องง่ายในภาษาอื่นยกเว้นบางที $ arr [] = $ newvalue สำหรับการเพิ่มค่า - มันยอดเยี่ยม
George Mauer

8
อาร์เรย์ PHP เป็นโครงสร้างข้อมูลที่สามารถใช้งานได้อย่างง่ายดายเช่นสแต็กคิว deque รายการ hashtable ฯลฯ มันมีความยืดหยุ่นพอเหมาะสำหรับความต้องการทั่วไปโดยไม่ต้องใช้ฟังก์ชันอื่นนอกจาก array_ *
Camilo Díaz Repka

6
Python ทำการจัดเรียง (ตามรายการและสิ่งอันดับ) ดีกว่า PHP อย่างมาก
php มากเกินไป

26

ฉันเป็นเหมือนคุณฉันได้เขียนโค้ด PHP มานานกว่า 8 ปีแล้ว ฉันต้องเรียนหลักสูตร. NET / C # ประมาณหนึ่งปีที่แล้วและฉันสนุกกับภาษา C # (เกลียด ASP.NET) แต่มันทำให้ฉันเป็นนักพัฒนา PHP ที่ดีขึ้น

PHP ในภาษานั้นค่อนข้างแย่ แต่ฉันก็เร็วเหลือเกินและ LAMP ก็ยอดเยี่ยมมาก ผลิตภัณฑ์สุดท้ายนั้นมีน้ำหนักมากกว่าผลรวมของชิ้นส่วน

ที่กล่าวว่าในการตอบคำถามของคุณ:

http://uk.php.net/SPL

ฉันรักSPLคลาสคอลเลคชันใน C # เป็นสิ่งที่ฉันชอบทันทีที่เริ่มใช้งาน ตอนนี้ฉันมีเค้กและกินได้แล้ว

แอนดรู


24

ฉันประหลาดใจเล็กน้อยที่ยังไม่มีใครพูดถึงมัน แต่เทคนิคอย่างหนึ่งที่ฉันโปรดปรานกับอาร์เรย์คือการใช้ตัวดำเนินการบวก มันค่อนข้างเล็กน้อยarray_merge()แต่เรียบง่ายกว่าเล็กน้อย ฉันพบว่าปกติแล้วเป็นสิ่งที่ฉันต้องการ ผลจะใช้รายการทั้งหมดใน RHS และทำให้พวกเขาปรากฏในสำเนาของ LHS, เขียนทับตามความจำเป็น (เช่นมันไม่ใช่การสับเปลี่ยน) มีประโยชน์มากสำหรับการเริ่มต้นด้วยอาร์เรย์ "ค่าเริ่มต้น" และเพิ่มค่าจริงบางอย่างในการเข้าชมครั้งเดียวในขณะที่ปล่อยค่าเริ่มต้นไว้สำหรับค่าที่ไม่ได้จัดเตรียมไว้

ตัวอย่างโค้ดที่ร้องขอ:

// 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 );

$defaultsควรเป็น$control_defaults
diEcho

3
ฉันคิดว่ามันไม่ชัดเจนเท่า array_merge เมื่อคุณมีรหัสมากมายในการรักษา อย่างน้อยเมื่อคุณใช้งานฟังก์ชัน array_merge จะเห็นได้ชัดว่าคุณกำลังจัดการกับอาร์เรย์
Sylvain

และความจริงที่ว่าคุณทำ... + array( ...ไม่เพียงพอที่จะชี้ประเด็นนี้ :-)
staticsan

คุณต้องการ PHP เวอร์ชันใด
Lotus Notes

นี่เป็นคุณสมบัติที่ยอดเยี่ยมและควรสังเกตว่าอาเรย์ทางด้าน "ขวา" ของ "+" จะไม่เขียนทับคีย์ที่มีอยู่ของอาเรย์ไปทางด้าน "ซ้าย" ของ "+"
Wil Moore III

21

นี่คือสิ่งหนึ่งฉันชอบวิธีการตั้งค่าเริ่มต้นในพารามิเตอร์ฟังก์ชันที่ไม่ได้ให้มานั้นง่ายกว่ามาก:

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

4
สนุกพอฉันเห็น "คุณลักษณะที่ซ่อนอยู่" ใน Google Reader เมื่อสัปดาห์ที่แล้ว ฉันไม่ได้รับสิ่งที่ซ่อนอยู่เกี่ยวกับมัน - เป็นไวยากรณ์พื้นฐาน ลองถ้า ($ var = true) เป็นตัวอย่าง
Ross

8
ง่ายกว่าอะไร ภาษาส่วนใหญ่มีคุณสมบัตินี้
Christian Davén

10
ง่ายกว่า C # (และผมคิดว่า C ++ และ Java)
จอร์จ Mauer

8
C ++ รองรับค่าพารามิเตอร์เริ่มต้น
sjobe

2
c # ไม่รองรับค่าเริ่มต้นเลย คุณต้องเขียนฟังก์ชั่นโอเวอร์โหลดและมักจะประกาศค่าซึ่งเป็นเพียงปัญหาธรรมดา
DeveloperChris

21

ด่วนและสกปรกเป็นค่าเริ่มต้น
ภาษานั้นเต็มไปด้วยทางลัดที่มีประโยชน์ซึ่งทำให้ PHP เป็นตัวเลือกที่สมบูรณ์แบบสำหรับโครงการขนาดเล็กที่มีเวลาสั้น ๆ สู่ตลาด ไม่ว่าโค้ด PHP ที่สะอาดนั้นเป็นไปไม่ได้มันแค่ใช้ความพยายามและประสบการณ์พิเศษ

แต่ฉันชอบ PHP เพราะมันช่วยให้ฉันแสดงสิ่งที่ฉันต้องการโดยไม่ต้องพิมพ์เรียงความ

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
}

และใช่ว่าไม่รวมถึงการพิมพ์Int


4
คุณควรใช้ strpos แทน: if (false! == strpos ("one cat", "cat")) {
OIS

17
@OIS จุดประสงค์ของตัวอย่างของเขาคือการแสดงและเปรียบเทียบการทำงานของการจับคู่ regex อย่างรวดเร็วไม่ใช่วิธีการค้นหาสตริง "cat" ใน "one cat"
dcousineau

19
Java: if (Pattern.matches ("cat", "one cat")) {// ทำอะไรบางอย่าง} หยุดบ่นเกี่ยวกับ java หากคุณไม่รู้จัก
whiskysierra

3
+1 ทึกคุณทำอย่างไร preg_replace ('/ ([<[]! - \ s *) (\ S *?) (\ s * - [>]]?) / se', "\ $ this- > เลือก ('\\ 1', '\\ 2', '\\ 3', \ $ data) ", $ text); ใน Java? สิ่งนี้จะพบความคิดเห็นในข้อความที่ป้อนแล้วเรียกใช้ฟังก์ชันที่มีองค์ประกอบที่ตรงกันซึ่งในกรณีนี้ $ this-> select (... ) ตัดสินใจเลือกสิ่งที่จะแทนที่การจับคู่ด้วยและส่งกลับผลลัพธ์
DeveloperChris

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