Fitur Tersembunyi PHP? [Tutup]

174

Saya tahu ini kedengarannya seperti pertanyaan pelacur tapi biarkan saya menjelaskan dari mana saya berasal.

Keluar dari perguruan tinggi saya mendapat pekerjaan di sebuah toko PHP. Saya bekerja di sana selama satu setengah tahun dan berpikir bahwa saya telah belajar semua yang ada untuk belajar tentang pemrograman.

Kemudian saya mendapat pekerjaan sebagai toko pengembangan internal satu orang di sebuah perusahaan yang cukup besar di mana semua pekerjaan berada di C #. Dalam komitmen saya pada posisi itu, saya mulai membaca banyak blog dan buku dan dengan cepat menyadari betapa salahnya saya dengan berpikir saya tahu segalanya. Saya belajar tentang pengujian unit, injeksi ketergantungan dan pola dekorator, prinsip desain kopling longgar, komposisi debat warisan, dan seterusnya dan seterusnya - saya masih sangat menyerap semuanya. Tidak perlu dikatakan gaya pemrograman saya telah berubah seluruhnya dalam setahun terakhir.

Sekarang saya menemukan diri saya mengambil proyek php melakukan beberapa pengkodean untuk teman start-up dan saya merasa benar-benar dibatasi sebagai lawan pemrograman di C #. Sangat mengganggu saya bahwa semua variabel pada ruang lingkup kelas harus dirujuk dengan menambahkan '$ this->'. Ini mengganggu saya bahwa tidak ada IDE yang saya coba memiliki intellisense yang sangat baik dan metode unit SimpleTest saya harus mulai dengan kata 'test'. Ini membuat saya gila bahwa pengetikan dinamis membuat saya tidak menentukan secara implisit parameter mana yang diharapkan dari suatu metode, dan bahwa Anda harus menulis pernyataan switch untuk melakukan overload metode. Saya tidak tahan bahwa Anda tidak dapat memiliki ruang nama bersarang dan harus menggunakan operator :: untuk memanggil konstruktor kelas dasar.

Sekarang saya tidak punya niat memulai debat PHP vs C #, tapi yang ingin saya katakan adalah bahwa saya yakin ada beberapa fitur PHP yang entah tidak saya ketahui atau ketahui gagal digunakan dengan benar. Saya berada di alam semesta C # dan mengalami kesulitan melihat di luar mangkuk kaca.

Jadi saya bertanya, apa saja fitur favorit Anda dari PHP? Apa hal yang dapat Anda lakukan di dalamnya yang tidak dapat atau lebih sulit dalam bahasa .Net?

George Mauer
sumber
Paradigma OO yang rusak? Bagi saya itu adalah fitur "tersembunyi" terburuk yang Anda temukan.
knoopx
Utas ini agak lucu ... Karena bagi tim saya bekerja dengan "fitur tersembunyi" adalah frasa kode yang berarti "bug". Dan tahukah Anda ... Terkadang menemukan fitur tersembunyi tidak selalu merupakan hal yang baik ...
Ganesh Shankar
@Ganesh bug satu orang adalah fitur tersembunyi pria lain ...
Xeoncross

Jawaban:

328

Dokumentasi . The dokumentasi mendapatkan suara saya. Saya belum menemukan dokumentasi daring yang lebih menyeluruh untuk bahasa pemrograman - semua yang lain harus saya kumpulkan dari berbagai situs web dan halaman manual.

Kyle Cronin
sumber
60
Saya setuju. Mampu mengetikkan www.php.net/function_name dan mendapatkan referensi sebagian besar waktu sangat bagus.
Allain Lalonde
1
Ini adalah fitur hebat dari PHP, tapi saya tidak akan benar-benar menyebutnya tersembunyi ... Jika Anda pernah googled untuk parameter metode, dll, Anda akan berakhir di php.net.
John Bubriski
27
Saya setuju juga. Hal terbesar tentang manual adalah komentar pengguna. Saya jarang melihat dokumentasi lain yang memilikinya. Mereka dapat berisi permata asli. Satu-satunya downside adalah bahwa IMHO mereka sedikit dipangkas terlalu cepat.
Sander Marechal
3
@Phoexo "sedikit kurang bisa dibaca" ??? Saya tidak pernah mengerti dan tidak akan pernah mengerti MSDN, sedangkan dokumentasi PHP mudah dan jelas.
lauriys
3
Tidak setuju. Satu-satunya alasan dokumentasi ini "baik" adalah karena beberapa komentar pengguna memasukkan semua lubang di catatan resmi.
Rob Howard
179

Array . Menilai dari jawaban atas pertanyaan ini, saya kira orang tidak sepenuhnya menghargai betapa mudah dan bermanfaatnya Arays di PHP. Array PHP bertindak sebagai daftar, peta, tumpukan, dan struktur data umum semuanya secara bersamaan. Array diimplementasikan dalam inti bahasa dan digunakan di semua tempat yang menghasilkan lokalitas cache CPU yang baik. Perl dan Python menggunakan konstruksi bahasa yang terpisah untuk daftar dan peta yang menghasilkan lebih banyak penyalinan dan transformasi yang berpotensi membingungkan.

pengguna8134
sumber
11
Elemen array PHP dipesan.
user8134
117
Langkah awal saya dari PHP ke C # hampir membunuh saya. Dalam C #, array hanyalah struktur sederhana dengan ukuran statis dan indeks numerik. Dalam PHP, array adalah lakban alam semesta!
Dinah
4
Saya juga setuju. Ketika bermain dengan Java untuk tugas Uni, saya terkejut melihat betapa kaku mereka, tidak ada fleksibilitas sama sekali. Benar-benar membuat saya menghargai betapa bagusnya array PHP.
Christian
11
Saya yakin array php bagus, tetapi 40 suara untuk komentar yang mengetuk array C #? Jika array C # tidak sesuai dengan kebutuhan, ada banyak opsi. Koleksi ArrayList dan generik keduanya sangat kuat. Ada banyak jenis koleksi untuk kebutuhan spesifik. Satu-satunya keuntungan sebenarnya dari php dalam hal ini adalah bahwa ia tidak memberikan opsi apa pun dari mana seorang programmer harus memutuskan. Anda menggunakan array atau Anda tidak memiliki variabel yang dapat diindeks.
G-Wiz
24
Di sisi lain, sintaks untuk array sepenuhnya menyebalkan. Dalam banyak bahasa scripting Anda dapat membuat array 2D sederhana seperti: [[1, 2], [3, 4]], bandingkan dengan versi PHP: array(array(1, 2), array(3, 4)).
Rene Saarsoo
167

Stream Handler memungkinkan Anda untuk memperluas "FileSystem" dengan logika yang sejauh yang saya tahu cukup sulit dilakukan di sebagian besar bahasa lain.

Misalnya dengan handler MS-Excel Stream Anda dapat membuat file MS Excel dengan cara berikut:

$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);
Allain Lalonde
sumber
Saya percaya bahwa kerangka kerja KIO memungkinkan Anda melakukan ini juga, tetapi itu hanya tersedia untuk aplikasi desktop berbasis KDE.
MiffTheFox
21
IMHO memiliki pendekatan OO yang tepat akan jauh lebih masuk akal daripada kekacauan ini dengan penangan arus. Ya, lucu bisa membaca / menulis file Excel, tetapi apakah harus bekerja seperti ini?
Anti Veeranna
3
Mungkin begitu, tetapi pendekatan ini merangkum kompleksitas dalam antarmuka yang umum bagi kebanyakan pengembang PHP ... tanpa mengharuskan mereka mempelajari konsep Berorientasi Objek yang mungkin berada di luarnya.
Allain Lalonde
13
Jika Anda bekerja dengan Amazon S3, periksa Zend_Amazon_S3, yang menyediakan antarmuka aliran untuk url seperti 's3: // {bucket-name} / path'.
davidtbernal
Saya telah menggunakan ini untuk membuat DSL sederhana untuk lapisan tampilan saya dengan hanya membaca file PHP, melakukan beberapa penggantian string dan meneruskannya melalui eval (). Misalnya, saya membuatnya sedemikian rupa sehingga saya dapat menggunakan tag pendek setiap kali saya memilih dan melakukan @ -> someVar sehingga saya dapat mengakses data tingkat tampilan.
Jasper Bekkers
131

Metode Ajaib adalah metode fall-through yang dipanggil setiap kali Anda memanggil metode yang tidak ada atau menetapkan atau membaca properti yang tidak ada, antara lain.

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

Pengembang C ++ di sini mungkin memperhatikan, bahwa PHP memungkinkan kelebihan beberapa operator, misalnya ()atau (string). Sebenarnya PHP memungkinkan overloading lebih banyak lagi, misalnya []operator ( ArrayAccess ), foreachkonstruksi bahasa ( Iterator dan IteratorAggregate ) dan countfungsinya (Dapat Dihitung ).

NikiC
sumber
4
Sebagai contoh berguna tentang apa yang dapat dicapai dengan metode ajaib goto phpcodetips.blogspot.com/2008/07/domain-model-validation.html
grom
6
Tidak setuju. Ini jauh lebih lemah daripada fasilitas serupa di Smalltalk, Ruby & Python (dan mungkin itu disalin dari salah satu dari ini)
finnw
34
Fakta bahwa implementasi PHP dari fungsi ini lebih lemah daripada bahasa-bahasa lain, tidak membuatnya kurang berguna dalam PHP.
Allain Lalonde
2
__call()besar dalam kerangka kerja dengan peta domain.com/controller/method/
alex
7
Metode sihir juga lambat sekali. Gunakan dengan hati-hati.
Alex Weinstein
95

Kelas standar adalah wadah yang rapi. Saya hanya mempelajarinya baru-baru ini.

Alih-alih menggunakan array untuk menyimpan atribut serveral

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

Anda dapat menggunakan kelas standar

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

Ini sangat membantu ketika mengakses variabel-variabel ini dalam sebuah string

$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";
Dean Rather
sumber
43
"{$ orang ['nama']} adalah {$ orang ['usia']} tahun".
Kornel
27
"orang [nama] adalah $ orang [usia] tahun" juga akan bekerja ... Tidak ada kutipan, tidak ada kawat gigi :)
majelbstoat
16
$ string = sprintf ("% s adalah% d tahun.", $ orang ['nama'], $ orang ['usia']);
Daniel Sloof
60
Sementara kita pada subjek: array (objek) ("name" => 'bob', 'age' => 5)
Annika Backstrom
30
@majelbstoat: Mengeluarkan tanda kutip akan memperlambat skrip karena penerjemah PHP akan melihat apakah 'nama' dan 'usia' telah ditetapkan dengan define (...). Ini juga merupakan praktik yang buruk mengingat akan mungkin untuk benar-benar membalik kunci yang diakses dalam setiap kasus: define ('age', 'name'); define ('name', 'age');
brianreavis
90

Sertakan file dapat memiliki nilai balik yang dapat Anda tetapkan ke variabel.

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

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org
Philippe Gerber
sumber
@Peter SANGAT berguna untuk db-> penanganan kesalahan pengecualian localhost.
Talvi Watia
Lebih mudah untuk mengatur file konfigurasi cepat dan kotor.
Frank Farmer
Mengapa Anda mengembalikan array ini? Jika file yang disertakan berisi array, itu dapat digunakan di sertakan segera.
fabrik
5
@fabrik karena itu akan menjadi variabel global dan tersedia di seluruh cakupan utama. Itu sangat tidak menyenangkan, ini jauh lebih baik.
Mikulas Dite
Saya bekerja pada sebuah proyek dalam kerangka Yii dan proyek itu memiliki file konfigurasi di mana array dikembalikan seperti ini, sekarang saya mengerti mengapa file seperti ini.
Pengembang Simer Twilio Toronto
83

Anda dapat memanfaatkan fakta bahwa oroperator memiliki prioritas lebih rendah daripada =melakukan ini:

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

Jika nilai penugasan pertama dievaluasi true, penugasan kedua diabaikan. Contoh lain:

$record = get_record($id) 
  or throw new Exception("...");
Pies
sumber
7
Saya kira saya tidak terlalu yakin dengan ini; meskipun tampaknya tidak rentan kesalahan itu kontra-intuitif, dan itu sendiri dapat mempromosikan kesalahan.
thomasrutter
14
@ Pai: salah satu caranya adalah kode yang cukup berantakan berikut ini: $ page = isset ($ _ DAPATKAN ['halaman'])? (int) $ _ DAPAT ['halaman']: 1; // Keuntungan dari ini adalah tidak ada penindasan kesalahan yang diperlukan.
DisgruntledGoat
3
pada pemikiran kedua, karena Anda sedang mencari integer yang dapat Anda gunakan sebagai gantinya: $ page = is_int ($ _ GET ['page'])? $ _GET ['halaman']: 1;
DisgruntledGoat
4
Perlu dicatat bahwa kode setelah orakan mengeksekusi jika kode sebelum ormenghasilkan nilai numerik 0. Jadi semantik mungkin kurang mungkin dengan sesuatu seperti $_GET['page'], tetapi jelas keadaan mungkin muncul dan ada baiknya diwaspadai.
kelopak mata
3
Perlu juga dicatat bahwa oroperator adalah versi yang lebih rendah dari ||operator. Juga, +1 karena ini sangat ekspresif dan saya sering lupa itu mungkin. Itu harus digunakan lebih sering, dan itu benar-benar jelas dalam apa fungsinya. Saya tidak tahu tentang bagaimana "pria sejati" kode, jadi saya tidak bisa mengomentari itu.
kelopak mata
80

__autoload() (kelas-) file dibantu oleh set_include_path() .

Dalam PHP5 sekarang tidak perlu menentukan daftar panjang pernyataan "include_once" saat melakukan OOP yang layak.

Cukup tentukan sekumpulan direktori kecil di mana file library-class terstruktur secara waras, dan atur jalur auto include:

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

Sekarang __autoload() rutinitas:

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

Sekarang PHP akan secara otomatis memasukkan file yang dibutuhkan sesuai permintaan, menghemat waktu dan memori parsing.

Wimmer
sumber
Apakah spl_autoload_register () lebih baik digunakan?
Alex
19
Tentu saja! __autoload () adalah PHP4 tetapi spl_autoload_register () adalah "daisy-chaining" non-destruktif dari metode autoloading.
Willem
3
Fitur yang berguna, tetapi satu peringatan adalah ketika Anda menemukan contoh kelas yang diberikan, itu membuatnya sedikit lebih sulit untuk memburu lokasi file kelas. Mendefinisikan secara eksplisit termasuk di bagian atas memberi Anda daftar kelas yang terlibat terbatas dan lokasi yang tepat.
Cory House
Ini adalah fitur yang bagus, tetapi hanya untuk mengatasi situasi tidak memiliki kode yang telah dikompilasi, sehingga tidak tahu di mana kelas akan berada. Kelemahan besar dari ini adalah bahwa Anda tidak dapat memiliki 2 kelas dengan nama yang sama, bahkan jika mereka berada di ruang nama yang berbeda.
Kibbee
3
Silakan lihat propsal PSR-0 dari Kelompok Kerja Standar PHP (menampilkan pengembang ZF, Symfony, Doctrine, CakePHP, Solar, dll.) Ketika menerapkan autoloading: groups.google.com/group/php-standards/web / psr-0-final-proposal
Philippe Gerber
76

Kemudahan . Fitur terbesar adalah betapa mudahnya bagi pengembang baru untuk duduk dan menulis skrip "yang berfungsi" dan memahami kodenya.

Fitur terburuk adalah betapa mudahnya bagi pengembang baru untuk duduk dan menulis skrip "yang berfungsi" dan berpikir mereka memahami kodenya.

The keterbukaan masyarakat sekitarnya PHP dan sejumlah besar proyek-proyek PHP tersedia sebagai open-source yang jauh lebih menakutkan bagi seseorang memasuki dunia pengembangan dan seperti Anda, bisa menjadi batu loncatan ke lebih matang bahasa.

Saya tidak akan memperdebatkan hal-hal teknis seperti sebelum saya miliki, tetapi jika Anda melihat PHP sebagai komunitas daripada bahasa web, sebuah komunitas yang jelas merangkul Anda ketika Anda mulai berkembang, manfaatnya benar-benar berbicara sendiri.

Chris Ridenour
sumber
3
Jelas komentar yang bagus. Python adalah bahasa pertama saya dan itu luar biasa, tetapi kurangnya proyek yang saya rasa mampu memahaminya membuat penghalang. Dengan PHP saya dapat melihat hampir semua hal pada dokumentasi dan mencari tahu ... sumber daya yang tersedia di web luar biasa.
Dscher
76

Variabel variabel dan fungsi tanpa keraguan!

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

Konsep yang sama berlaku untuk parameter objek ($ some_object -> $ some_variable);

Sangat sangat bagus. Membuat kode dengan loop dan pola sangat mudah, dan lebih cepat dan lebih terkendali daripada eval (Thanx @Ross & @Joshi Spawnbrood!). T

Jrgns
sumber
111
variabel variabel sebenarnya membuat kode lebih mudah dibaca dan lebih rentan terhadap kesalahan.
Elzo Valugi
8
Dan orang benar-benar menggunakan ini? Aku benci membaca sumber-sumber ini.
Gary Willoughby
27
Variabel variabel adalah salah satu fitur terburuk yang ditawarkan PHP.
davidtbernal
10
9 Dari 10 kali variabel variabel lebih baik diganti dengan array sehingga Anda memiliki semua data di satu tempat, Anda dapat mengulanginya dan seterusnya. Hanya dalam beberapa keadaan yang sangat spesifik barulah mereka berguna.
Jasper Bekkers
7
Tolong jangan membuat pemula menggunakan "fitur" itu.
whiskeysierra
68

Anda dapat menggunakan fungsi dengan jumlah argumen yang tidak ditentukan menggunakan 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);

?>
TheBrain
sumber
1
Baru saja memposting ini. Agak seperti properti argumen dalam fungsi JS.
Alex
67

Saya suka file jarak jauh . Untuk pengembangan web, fitur semacam ini sangat berguna.

Perlu bekerja dengan konten halaman web? Sederhana

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

dan Anda sudah punya file menangani siap untuk pergi, sama seperti file normal lainnya.

Atau bagaimana dengan membaca file jarak jauh atau halaman web secara langsung ke sebuah string?

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

Kegunaan metode khusus ini sulit untuk dilebih-lebihkan.

Ingin menganalisis gambar jarak jauh? Bagaimana kalau melakukannya melalui FTP?

$imageInfo = getimagesize('ftp://user:[email protected]/image/name.jpg');

Hampir semua fungsi PHP yang berfungsi dengan file dapat bekerja dengan file jarak jauh. Anda bahkan dapat include()atau require()kode file jarak jauh dengan cara ini.

zombat
sumber
2
Ini sangat bagus! Untuk melakukan ini, misalnya Java, Anda harus memasukkan file gazillion jar dan daripada menulis banyak kode boilerplate.
Kimble
16
"Anda bahkan dapat memasukkan () atau meminta () file kode dari jarak jauh dengan cara ini." Tentu saja, memasukkan () file pada server yang tidak Anda kontrol adalah ide yang sangat buruk.
Frank Farmer
4
@Frank - ya, baik, orang akan menganggap bahwa Anda akan termasuk kode dari server Anda lakukan kontrol.
zombat
1
Intinya, inklusi file jarak jauh adalah masalah keamanan PHP yang umum: en.wikipedia.org/wiki/Remote_File_Inclusion#PHP .
Frank Farmer
63

strtr ()

Ini sangat cepat, sangat banyak sehingga Anda akan kagum. Secara internal mungkin menggunakan beberapa struktur tipe b-tree gila untuk mengatur pertandingan Anda dengan awalan umum mereka. Saya menggunakannya dengan lebih dari 200 menemukan dan mengganti string dan masih melewati 1MB dalam waktu kurang dari 100 ms. Untuk semua kecuali string strtr () yang sangat kecil, bahkan jauh lebih cepat daripada strtolower () dalam melakukan hal yang persis sama, bahkan dengan mempertimbangkan karakter yang diperhitungkan. Anda mungkin bisa menulis parser seluruh menggunakan panggilan strtr berturut-turut dan itu akan lebih cepat dari pencocokan ekspresi reguler biasa, mencari tahu jenis token, output ini atau itu, jenis ekspresi reguler berikutnya.

Saya sedang menulis normaliser teks untuk memisahkan teks menjadi kata-kata, menurunkan, menghapus tanda baca dll dan strtr adalah pisau tentara Swiss saya, itu mengalahkan celana dari ekspresi reguler atau bahkan str_replace ().

thomasrutter
sumber
1
Mungkin lebih cepat karena itu penggantian karakter tunggal.
statika
10
strtr () tidak hanya melakukan penggantian karakter tunggal. Itu dapat mengganti substring panjang sewenang-wenang dengan substring panjang sewenang-wenang lainnya, dan tampaknya masih sangat cepat.
thomasrutter
1
Anda menyebutkan itu lebih cepat daripada strtolower dalam beberapa kasus, dapatkah Anda membuktikannya? Saya melakukan tolok ukur kecil dan ternyata itu salah.
Pengembang Pixel
1
Saya menemukan bahwa pada string kecil katakanlah 80 karakter itu lebih lambat dari strtolower, dan pada string besar katakanlah 1MB itu lebih cepat. Mungkin ada beberapa jenis biaya tetap setiap kali disebut. Saya hanya menggunakan strtr ($ this-> string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); String yang saya operasikan adalah teks bahasa Inggris yang khas ("Rubah coklat cepat", semacam itu).
thomasrutter
Saya baru saja membaca posting ini dan kemudian melakukan pencarian Google dan menemukan: simplemachines.org/community/index.php?topic=175031.0 Ada gagasan yang mana yang benar?
Flipper
61

Salah satu fitur PHP yang tidak begitu terkenal adalah extract(), fungsi yang membongkar array asosiatif ke dalam namespace lokal. Ini mungkin ada untuk aborminasi autoglobal tetapi sangat berguna untuk templating:

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

Sekarang Anda dapat menggunakan render_template('index.html', array('foo' => 'bar'))dan hanya $foodengan nilai yang "bar"muncul di template.

Armin Ronacher
sumber
15
Saya akan marah pada Anda karena menyarankan ekstrak () dengan cara apa pun adalah fitur yang baik. Tapi saya kira penggunaannya cukup berguna. Saya kira itu satu kali saya pernah melihatnya digunakan di mana itu adalah ide yang bagus!
thomasrutter
5
ekstrak () membuatnya mudah untuk menggulung sistem templating berat Anda sendiri yang sangat ringan. +1
Dinah
14
Inversnya, compact (), juga bagus: $ a = 1; $ b = 2; kompak ('a', 'b'); // == array ('a' => $ a, 'b' => $ b)
Annika Backstrom
2
Ya, itu mungkin satu-satunya penggunaan ekstrak ().
staticsan
4
Saya menyarankan untuk tidak menggunakan kata-kata umum sebagai nama argumen fungsi dalam kasus ini, karena $ context tempat Anda mengekstrak () dapat berisi nilai pada indeks 'as_string' atau 'template_name'. Menggunakan EXTR_SKIP dapat diterima, tetapi hanya memindahkan masalah di tempat lain (yaitu jika templat mengharapkan $ as_string itu akan mendapatkan nilai yang salah untuk itu.)
Michał Tatarynowicz
52

Range () tidak tersembunyi per se, tetapi saya masih melihat banyak orang yang mengulangi dengan:

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

kapan mereka bisa menggunakan:

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

Dan Anda dapat melakukan hal-hal sederhana seperti

foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t<option value=\"{$i}\">{$i}</option>\n";
}
Darren Newton
sumber
3
Anda dapat melakukan foreach ($ array sebagai $ key => $ value) {} yang bahkan lebih sederhana.
SilentGhost
15
Ini mungkin optimasi mikro, tetapi perlu dicatat bahwa untuk dan sementara jauh lebih cepat dan kurang banyak memori daripada sebelumnya.
JAL
3
Anda harus mencoba Python. Ini sesederhana "for i in range (12)", atau Anda dapat menggunakan xrange yang lebih efisien.
Ponkadoodle
2
@ SilentGhost: Anda masih memerlukan array untuk memulai, yang tidak selalu demikian. @Newbie: tolong jelaskan?
Alec
1
@flexxy, tampaknya, ini TIDAK. Pertimbangkan ini: gulir ke bawah ke phpbench.comRead Loop .
Buddy
44

PHP webspace yang diaktifkan biasanya lebih murah daripada sesuatu dengan (asp) .net. Anda mungkin menyebutnya fitur ;-)

VolkerK
sumber
3
Ini juga jauh lebih murah untuk mengatur beberapa server jika Anda tidak harus membayar untuk Windows Server di setiap server.
MiffTheFox
4
Satu-satunya tempat saya tahu di mana Windows hemat biaya adalah di Universitas yang mendapat diskon STEEEEP pada perangkat lunak server sebanyak itu lebih murah bagi dept saya untuk membeli 100 salinan windows daripada untuk melatih admin kami di linux (yang sebagian membuat saya sedih tetapi setup windows mereka bersih dan baik setup).
dcousineau
4
Untuk saat ini, tetapi Anda harus beralih hanya sekali, sementara Anda harus membeli lisensi baru cepat atau lambat ...
e-satis
42

Kata statickunci berguna di luar sudut pandang OOP. Anda dapat dengan cepat dan mudah menerapkan 'memoisasi' atau fungsi caching dengan sesuatu yang sederhana seperti:

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

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

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

Kata statickunci membuat variabel yang hanya bertahan dalam lingkup fungsi yang melewati eksekusi. Teknik ini sangat bagus untuk fungsi-fungsi yang seperti database get_all_books_by_id(...)atau get_all_categories(...)Anda akan menelepon lebih dari satu kali selama memuat halaman.

Peringatan: Pastikan Anda menemukan cara terbaik untuk membuat kunci untuk hash Anda, dalam hampir setiap keadaan di md5(...)atas BUKAN keputusan yang baik (masalah kecepatan dan panjang keluaran), saya menggunakannya untuk tujuan ilustrasi. sprintf('%u', crc32(...))atau spl_object_hash(...)mungkin jauh lebih baik tergantung pada konteksnya.

dcousineau
sumber
7
Hanya fitur yang disalin dari C / C ++
GetFree
2
@GETFree Saya tidak berpikir siapa pun akan menyangkal bahwa hampir semua PHP telah disalin dari C, C ++, Perl, dll.
Frank Farmer
1
Menyalin adalah hal terbaik yang bisa dilakukan.
NikiC
1
PHP salah. Selalu menyalin fitur dari orang lain. Seharusnya menulis semuanya dari awal sebagai gantinya! (Dalam hal kemungkinan sekecil apa pun dianggap serius: Saya bercanda)
Halil Özgür
42

Salah satu fitur bagus PHP adalah CLI . Tidak begitu "dipromosikan" dalam dokumentasi tetapi jika Anda memerlukan skrip / aplikasi konsol rutin, menggunakan cron + php cli sangat cepat untuk dikembangkan!

Lucacri
sumber
Saya benar-benar harus melihat ini, saya memiliki beberapa pekerjaan cron yang mengambil skrip PHP melaluiwget http://example.com...
DisgruntledGoat
CLI juga merupakan cara terbaik untuk spot-debug, karena peringatan / kesalahan akan muncul tanpa Anda harus mengubah preferensi pelaporan kesalahan Anda.
Glacials
40

Lalu trik "dan cetak"

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

Akan menggema Blah jika $ flag benar. TIDAK BEKERJA DENGAN ECHO.

Ini sangat berguna dalam templat dan ganti? : yang tidak mudah dibaca.

e-satis
sumber
24
Saya sendiri menemukan operator ternary jauh lebih jelas daripada mengeksploitasi evaluasi short-cirtcuit yang logis dan.
Vicent Marti
26
Sebenarnya jumlah karakter yang sama dengan <? Php if ($ flag) cetak "Blah"
terlalu banyak php
3
Parenthesis tidak semudah mengetik "dan", terutama pada keyboard Prancis berdarah saya ;-)
e-satis
7
@semua komentar - Ini bukan tentang seberapa pendek Anda bisa mendapatkannya! Ini tentang keterbacaan dan kemudahan penggunaan untuk orang-orang templat, yang kadang-kadang bahkan bukan programmer.
Tor Valamo
6
Saya ingin berkomentar bahwa pernyataan if () lebih mudah dan lebih mudah dibaca. Ini tentu lebih mudah bagi saya untuk mendapatkan kepalaku daripada mengeksploitasi pada dasarnya efek samping dari operator 'dan' di PHP, di mana itu mudah untuk membuat kesalahan (atau sepertinya itu adalah kesalahan ketika Anda membaca kode nanti). Misalnya, seperti yang dinyatakan ini tidak akan berfungsi seperti yang Anda inginkan dengan 'echo'. Dengan if () tidak ada gotcha seperti ini.
thomasrutter
37

Anda dapat menggunakan karakter minus dalam nama variabel seperti ini:

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

Kenapa menggunakannya? Tidak tahu: mungkin untuk model CSS? Atau beberapa JSON aneh yang perlu Anda hasilkan. Ini fitur yang aneh :)

monk-e-boy
sumber
2
Apakah itu berfungsi dengan nama metode? Dapat bermanfaat untuk kerangka kerja yang menggunakan router dan saya ingin domain.com/something-with-minuses/view/
alex
6
Kurung kurawal memungkinkan Anda untuk mengakses objek layak yang memiliki tanda hubung, titik, dan entitas non-alfanumerik lainnya. Salah satu alasan untuk menggunakannya adalah ketika berhadapan dengan xml, di mana nama entitas dapat diberi titik seperti di NITF / NewsML <body.content>. Jika Anda menggunakan SimpleXML, Anda akan mengaksesnya seperti ini $item->DataContent->body->{'body.content'}.
Jesse Kochis
2
Variabel PHP dapat mengambil karakter apa pun saat digunakan dengan cara itu, bahkan spasi dan baris baru.
Pemula
Ini akan sangat berguna saat menggunakan di SimpleXML ... luar biasa. Terima kasih telah berbagi.
KyleFarris
34

Sintaks HEREDOC adalah fitur tersembunyi favorit saya. Selalu sulit ditemukan karena Anda tidak dapat Google untuk <<< tetapi berhenti Anda harus keluar dari HTML besar dan masih memungkinkan Anda untuk menjatuhkan variabel ke dalam aliran.

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;
Pablo Livardo
sumber
2
HEREDOC adalah cara favorit saya untuk membangun dan menggunakan pernyataan SQL.
bdl
11
Catatan: EOM penutup; tidak bisa di-indentasi.
micahwittman
Bagus, tapi tidak ada gunanya jika Anda menggunakan template. Plus itu menghalangi indentasi yang tepat.
Manos Dilaverakis
7
Ya Tuhan, itu adalah kode yang paling jelek yang pernah saya lihat. Jika Anda menggunakan HEREDOC's, maka Anda belum memisahkan presentasi dari logika.
Lotus Notes
@Byron: Anda tidak harus menggunakannya untuk presentasi, itu dapat digunakan untuk string apa pun. Lihat komentar dari bdl.
Tom Pažourek
34

Mungkin tidak banyak yang tahu bahwa adalah mungkin untuk menentukan "variabel" konstan sebagai nilai default untuk parameter fungsi:

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

String dapat digunakan seolah- olah mereka adalah array :

$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"
jamolkhon
sumber
3
Yang terakhir bagus. Meskipun saya tidak tahu kapan itu akan lebih baik daripada beberapa metode lain untuk menghapus karakter. +1 nontheless
George Mauer
3
Mungkin lebih efisien daripada memanggil fungsi untuk melakukannya. String biasanya disimpan secara bersamaan dalam memori, jadi mendapatkan $ str [4] adalah sepele. Menyimpan string sebagai array dari karakter umum untuk kebanyakan bahasa yang berasal dari C.
sjobe
1
Anda tidak harus menggunakan konstanta yang didefinisikan sebagai nilai default. Berikut ini juga benar-benar valid: fungsi kaki ($ param1, $ default = array ('key' => 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false). Namun Anda benar dalam mencatat bahwa Anda tidak dapat menggunakan variabel sebagai argumen default.
dcousineau
@dcousineau Contoh Anda benar-benar valid karena array () bukan fungsi tetapi konstruksi bahasa. Panggilan fungsi tidak diizinkan sebagai nilai default untuk argumen.
Jamol
4
Berhati-hatilah dengan memperlakukan string sebagai array jika Anda memiliki string multi-byte (bahasa asing, dll.)
philfreo
33

Satu-satunya hal yang paling berguna tentang kode PHP adalah bahwa jika saya tidak begitu mengerti fungsi, saya tahu saya bisa mencarinya dengan menggunakan browser dan mengetik:

http://php.net/function

Bulan lalu saya melihat fungsi "range" dalam beberapa kode. Ini adalah salah satu dari ratusan fungsi yang saya berhasil tidak pernah gunakan tetapi ternyata sangat berguna:

http://php.net/range

Url itu adalah alias untuk http://us2.php.net/manual/en/function.range.php . Gagasan sederhana itu, tentang pemetaan fungsi dan kata kunci untuk url , mengagumkan.

Saya berharap bahasa lain, kerangka kerja, database, sistem operasi memiliki mekanisme sederhana untuk mencari dokumentasi.

artlung
sumber
5
range()dapat bermanfaat untukforeach( range(1, 10) as $i) { };
alex
Jika Anda memiliki FireFox; cukup ketik PHP functionbilah alamat itu akan melakukan pencarian Google 'Saya merasa beruntung' dan Anda hampir selalu berakhir di halaman dokumentasi php yang tepat.
Kolky
30

Cekal komentar cepat

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


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

Komentar ini memungkinkan Anda untuk beralih jika blok kode dikomentari dengan satu karakter.

Sam152
sumber
14
Ini tidak terlalu spesifik untuk PHP. Ini berfungsi dalam bahasa apa pun yang mendukung // ...komentar garis dan /* ... */memblokir komentar.
Jordan Ryan Moore
utilitas pembersihan kode apa pun akhirnya membenci Anda karena menggunakan ini ...;)
Talvi Watia
3
Saya juga pernah menggunakan /** /sebelum dan /**/sesudah. Anda dapat beralih blok dengan menghapus dan menambahkan ruang di yang pertama. Ini memiliki manfaat tambahan untuk bekerja dengan CSS (dan bahasa lain yang tidak mendukung // ... komentar).
kingjeffrey
FWIW, tautan ke artikel asli aleembawany.com/2009/01/27/lazy-block-comment-trick
aleemb
@aleemb, jangan lakukan pengeditan lebih lanjut untuk pertanyaan ini.
Sam152
29

Daftar saya .. kebanyakan dari mereka lebih banyak berada di bawah "fitur tersembunyi" daripada "fitur favorit" (saya harap!), Dan tidak semua berguna, tapi .. 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');

Anda dapat membuat sarang operator ternary juga, terkadang berguna.

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

Benar, saya akan berhenti untuk sekarang :-)


Hmm, sudah lama ..

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

Jadi, baru saja ditemukan Anda dapat melewatkan string apa pun sebagai nama metode JIKA Anda melampirkannya dengan kurung keriting. Anda tidak dapat mendefinisikan string apa pun sebagai metode, tetapi Anda dapat menangkapnya dengan __call (), dan memprosesnya lebih lanjut sesuai kebutuhan. Hmmm....

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

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

Menemukan permata kecil ini di komentar Reddit:

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

Anda tidak dapat memanggil fungsi di dalam {} secara langsung seperti ini, tetapi Anda dapat menggunakan variabel-holding-the-function-name dan memanggilnya! (* dan * Anda juga dapat menggunakan variabel variabel)

MSpreij
sumber
2
Tolong jangan terlalu sering menggunakan operator perbandingan ternary; ini menyebabkan kode kebingungan.
staticsan
Wow. Itu benar-benar dapat mengisi daftar $ GLOBALS Anda. Latihan yang buruk. Serius.
Talvi Watia
Apakah ada kontes PHP yang sudah dikaburkan?
Lotus Notes
Nah, trik dengan swap - mengesankan dan bermanfaat, terima kasih.
OZ_
1
${''} = 456;hahaha .... cukup pelecehan.
Skurmedel
26

Manipulasi array.
Banyak alat untuk bekerja dengan dan memanipulasi array. Ini mungkin tidak unik untuk PHP, tapi saya belum pernah bekerja dengan bahasa yang membuatnya sangat mudah.

MattBelanger
sumber
seperti apa misalnya? Sepertinya saya seperti semua fungsi canggung dinamai dan diposisikan di namespace global. Ditambah lagi, saya tidak bisa memikirkan apa pun yang tidak semudah dalam bahasa lain kecuali mungkin $ arr [] = $ nilai baru untuk menambahkan nilai - itu keren
George Mauer
8
Nah, array PHP adalah struktur data yang dapat digunakan dengan mudah sebagai tumpukan, antrian, deque, daftar, hashtabel, dll. Memang cukup fleksibel untuk sebagian besar kebutuhan umum, tanpa menggunakan apa pun selain fungsi array_ *.
Camilo Díaz Repka
6
Python melakukan array (seperti daftar dan tupel) jauh lebih baik daripada PHP.
terlalu banyak php
26

Saya sedikit seperti Anda, saya sudah mengode PHP selama lebih dari 8 tahun. Saya harus mengambil kursus .NET / C # sekitar setahun yang lalu dan saya benar-benar menikmati bahasa C # (benci ASP.NET) tetapi itu membuat saya menjadi pengembang PHP yang lebih baik.

PHP sebagai bahasa sangat buruk, tapi, saya sangat cepat dengan itu dan tumpukan LAMP mengagumkan. Produk akhir jauh melebihi jumlah bagian-bagiannya.

Yang mengatakan, dalam menjawab pertanyaan Anda:

http://uk.php.net/SPL

Saya suka SPL , kelas koleksi di C # adalah sesuatu yang saya sukai segera setelah saya mulai dengan itu. Sekarang saya dapat memiliki kue dan memakannya.

Andrew

Andrew Taylor
sumber
24

Saya sedikit terkejut belum ada yang menyebutkannya, tetapi salah satu trik favorit saya dengan array menggunakan operator plus. Ini sedikit seperti array_merge()tetapi sedikit lebih sederhana. Saya telah menemukan itu biasanya apa yang saya inginkan. Akibatnya, dibutuhkan semua entri dalam RHS dan membuatnya muncul dalam salinan LHS, ditimpa sesuai kebutuhan (yaitu tidak komutatif). Sangat berguna untuk memulai dengan array "default" dan menambahkan beberapa nilai nyata semua dalam satu hit, sementara meninggalkan nilai default di tempat untuk nilai yang tidak disediakan.

Contoh kode yang diminta:

// 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 );
statistik
sumber
$defaultsseharusnya$control_defaults
diEcho
3
Saya pikir itu tidak sejelas array_merge ketika Anda memiliki banyak kode untuk dipelihara. Setidaknya, ketika Anda menggunakan, fungsi array_merge, jelas bahwa Anda berurusan dengan array.
Sylvain
Dan fakta yang Anda lakukan ... + array( ...tidak cukup untuk menunjukkan hal ini? :-)
staticsan
Versi PHP apa yang Anda butuhkan untuk ini?
Lotus Notes
Ini adalah fitur yang hebat dan harus dicatat bahwa array di sisi "kanan" dari "+" tidak akan terlalu banyak menulis kunci dari array ke sisi "kiri" dari "+".
Wil Moore III
21

Ini satu, saya suka bagaimana menetapkan nilai default pada parameter fungsi yang tidak disediakan jauh lebih mudah:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }
George Mauer
sumber
4
Lucunya, saya melihat "fitur tersembunyi" ini di Google Reader minggu lalu. Saya tidak mendapatkan apa yang disembunyikan tentangnya - ini adalah sintaksis dasar. Coba jika ($ var = true) misalnya.
Ross
8
Lebih mudah dari apa? Sebagian besar bahasa memiliki fitur ini.
Christian Davén
10
Lebih mudah daripada C # (dan saya pikir C ++, dan Java)
George Mauer
8
C ++ mendukung nilai parameter default.
sjobe
2
c # tidak mendukung nilai default sama sekali. Anda harus menulis fungsi yang kelebihan beban dan selalu menyatakan nilai yang tidak praktis
DeveloperChris
21

Cepat dan kotor adalah standarnya.
Bahasa ini diisi dengan pintasan yang berguna, Ini menjadikan PHP kandidat yang tepat untuk proyek (kecil) yang memiliki waktu pemasaran yang singkat. Bukan berarti kode PHP yang bersih tidak mungkin, hanya butuh sedikit usaha dan pengalaman.

Tapi saya suka PHP karena memungkinkan saya mengekspresikan apa yang saya inginkan tanpa mengetik esai.

PHP:

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

JAWA:

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

Dan ya, itu termasuk tidak mengetik Int .

Bob Fanger
sumber
4
Anda sebaiknya menggunakan strpos: if (false! == strpos ("one cat", "cat")) {
OIS
17
@OIS tujuan dari contohnya adalah untuk menggambarkan dan membandingkan jalannya pertandingan regex cepat, bukan bagaimana menemukan string "kucing" dalam "satu kucing".
dcousineau
19
Java: if (Pattern.matches ("cat", "one cat")) {// lakukan sesuatu} Berhenti mengeluh tentang java jika Anda tidak mengetahuinya.
whiskeysierra
3
+1 Willi bagaimana Anda melakukan preg_replace ('/ ([<[]! - \ s *) (\ S *?) (\ S * - [>]]?) / Se', "\ $ this- > Pilih ('\\ 1', '\\ 2', '\\ 3', \ $ data) ", $ text); di Jawa? Ini menemukan komentar dalam teks input dan kemudian memanggil fungsi dengan elemen yang cocok yang dalam hal ini $ this-> select (...) memutuskan untuk mengganti apa yang cocok dengan dan mengembalikan hasilnya.
DeveloperChris
1
Regex adalah PHP sangat jelek ... Saya lebih suka memiliki Perl atau gaya JavaScript Regex di mana //dibangun ke dalam bahasa.
cdmckay