Copyright © 1997 - 2009 PHP Belgelendirme Grubu. Bu belge, sadece Creative Commons Attribution lisansının 3.0 veya sonraki sürümlerinin koşullarına bağlı kalınarak dağıtılabilir. Creative Commons Attribution lisansının 3.0 sürümü bu kılavuzla birlikte dağıtılmaktadır. Şu anki son sürümü » http://creativecommons.org/licenses/by/3.0/ adresinden temin edilebilir.
Bu belgenin kısmen veya tamamen, değiştirilerek veya aynen yayınlanması veya dağıtılması ile ilgileniyorsanız ve bu konuda sorularınız varsa, lütfen » doc-license@lists.php.net adresinden telif hakkı sahiplerine yazınız. Bu adres içeriği halka açık olarak arşivlenen bir eposta listesine aittir.
PHP, "PHP: Hypertext Preprocessor" sözcüklerinin baş harfleriyle temsil edilen HTML içine gömülebilir açık kaynak kodlu, genel amaçlı, özellikle site geliştirmeye uygun bir betik dilidir. Dil yapısının önemli bir kısmını C, Java ve Perl gibi dillerden almış, kendisine has özelliklerle bu yapıyı pekiştirmiş, kolay öğrenilen bir dildir. Dilin ana amacı, site geliştiricilerinin devingen sayfalar oluşturmasını çabuklaştırmaksa da PHP ile çok daha fazlasını yapabilirsiniz.
Bu kılavuz temel olarak bir işlev başvuru kılavuzudur. Fakat bunun yanında bir dil kılavuzu, PHP'nin önemli özelliklerinin bazılarının açıklamaları ile tamamlayıcı bazı bilgiler de içermektedir.
Bu kılavuzu çeşitli biçemlerde » http://www.php.net/download-docs.php adresinden temin edebilirsiniz. Bu kılavuzun nasıl geliştirildiğiyle ilgili daha ayrıntılı bilgi edinmek için eklerdeki 'Kılavuz Hakkında' bölümüne bakabilirsiniz. PHP'nin tarihçesi ile ilgileniyorsanız onu da ek bölümler arasında bulabilirsiniz.
Kılavuzun ön sayfasında şu anda en etkin kişileri ön plana çıkartıyoruz, ancak çalışmamıza halen katkıda bulunmakta olan birçok kişi ve geçmişte önemli katkılarda bulunmuş birçok insan var. Kılavuz sayfalarında kullanıcı önerileri üzerinden katılımda bulunarak destek veren birçok isimsiz kişi var. Bu kişiler düzenli olarak buradaki listelere ekleniyor, tüm katılımcılara destekleri için müteşekkiriz. Aşağıdaki listelerde isimler alfabetik olarak sıralanmıştır.
Burada yer alan katılımcılar kılavuzun içeriğine yaptıkları ve/veya yapmakta oldukları eklemelerden dolayı takdir edilmelidirler: Bill Abt, Jouni Ahto, Alexander Aulbach, Daniel Beckham, Stig Bakken, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Rafael Martinez, Rick McGuire, Yasuo Ohgaki, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Michael Wallner, Lars Torben Wilson, Jim Winstead, Jeroen van Wolffelaar ve Andrei Zmievski.
Burada yer alan katılımcılar kılavuzun düzenlenmesi çalışmasında kayda değer katkılarda bulunmuşlardır: Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe ve Egon Schmid.
Şu anki en etkin geliştiriciler: Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda ve Maciek Sokolewicz.
Bu kişiler kullanıcı önerilerinin yönetiminde çok ciddi çaba sarfetmişlerdir: Mehdi Achour, Daniel Beckham, Friedhelm Betz, Victor Boivie, Jesus M. Castagnetto, Nicolas Chaillan, Ron Chmara, Sean Coates, James Cox, Vincent Gevers, Sara Golemon, Zak Greant, Szabolcs Heilig, Oliver Hinckel, Hartmut Holzgraefe, Etienne Kneuss, Rasmus Lerdorf, Matthew Li, Andrew Lindeman, Aidan Lister, Hannes Magnusson, Maxim Maletsky, Bobby Matthis, James Moore, Philip Olson, Sebastian Picklum, Derick Rethans, Sander Roobol, Damien Seguy, Jason Sheets, Tom Sommer, Jani Taskinen, Yasuo Ohgaki, Jakub Vrana, Lars Torben Wilson, Jim Winstead, Jared Wyles ve Jeroen van Wolffelaar.
PHP (açılımı PHP: Hypertext Preprocessor) geniş bir kitle tarafından kullanılan, özellikle sanal yöreler üzerinde geliştirme için tasarlanmış HTML içine gömülebilen bir betik dilidir.
Tamam da, bu tam olarak ne anlama gelmektedir? Bir örnek:
Örnek 1 - Başlangıç olarak bir örnek
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Örnek</title>
</head>
<body>
<?php
echo "Merhaba, ben bir PHP betiğiyim!";
?>
</body>
</html>
Bir PHP betiğinin Perl ya da C gibi dillerden ne kadar farklı bir yapıda
olduğuna dikkat edin. HTML kodu oluşturmak için bir sürü kod
yazacağınıza, istediğiniz işi yapan bir PHP kodu yazıp onu HTML kodunun
içine gömüyorsunuz (bu örnekte, yapılan iş ekrana yazı yazmak). PHP kodu
<?php ve
?> özel başlangıç ve bitiş etiketleri arasına
yazılır. Bu etiketler "PHP kipine" rahatlıkla girip çıkabilmenizi
sağlarlar.
PHP'yi Javascript gibi kullanıcı tarafında çalışan dillerden ayıran, sunucu tarafında çalıştırılıyor olmasıdır. Yukardaki örnekteki kodu kendi sunucunuzda çalıştırırsanız, sitenize bağlanan kullanıcılar kodu göremeyecekler ve müdahale edemeyecekler, yalnızca sonucu görebileceklerdir. Dilerseniz HTTP sunucunuzu bütün HTML dosyalarınızı PHP dosyası olarak görüp işleyecek hale bile getirebilirsiniz. Buna rağmen kullanıcılar sizin gerçekte sunucu taraflı bir uygulama kullandığınızı fark edemeyebilirler.
PHP kullanmanın en güzel yanlarından biri, yeni kullanıcılar için öğreniminin oldukça kolay olması ve aynı zamanda profesyonel kullanıcılar için ileri seviyede özellikler içermesidir. PHP'nin uzun özellikler listesini okumaktan korkmayın. Kısa sürede PHP ile programlamaya başlayabilir ve birkaç saat içersinde basit programlar yazmaya başlayabilirsiniz.
PHP'nin gelişimi sunucu-taraflı programlamaya odaklanmışsa da, çok daha fazlasını yapmanıza olanak tanıyan araçlara da sahiptir. PHP neler yapabilir? bölümünde bu araçlar hakkında daha fazla bilgiye ulaşabilirsiniz. Eğer yalnızca site programlama ile ilgileniyorsanız, Basit bir eğitmen bölümünden devam edebilirsiniz.
Her şeyi. PHP temel olarak sunucu-taraflı programlamaya odaklanmıştır, bu nedenle CGI uygulamalarının yaptığı her şeyi, örneğin formdan veri toplama, devingen sayfa içeriği oluşturma, ya da çerez alıp gönderme gibi işlemleri yapabilirsiniz. Ancak PHP bunlardan çok daha fazlasını yapabilecek yetenektedir.
PHP betiklerinin kullanıldığı başlıca üç alan vardır.
PHP bütün büyük işletim sistemlerinde, Linux, birçok Unix türevi (HP-UX, Solaris, OpenBSD vb.), Microsoft Windows, Mac OS X, RISC OS dahil olmak üzere çok çeşitli platformlarda çalışabilir. PHP benzer biçimde bugün yaygın biçimde kullanılan HTTP sunucularının büyük kısmını destekler. Bunlara Apache, Microsoft IIS, Microsoft PWS, Netscape ve iPlanet Sunucuları, Oreilly Website Pro, Caudium, Xitami, OmniHTTPD ve daha birçok sunucuyu örnek gösterebiliriz. Bu sunucuların çoğunluğunda PHP modül olarak kullanılabilir, geri kalanlarında da CGI standardı kullanılarak PHP bir CGI işleyici olarak çalıştırılabilir.
Sonuç olarak, PHP ile işletim sistemi ve HTTP sunucusu seçme özgürlüğüne sahipsiniz. Dahası, hangi programlama yöntemini kullanacağınıza, işlevsel yaklaşımı mı yoksa nesne yönelimli yaklaşımı mı yoksa her ikisini birden mi kullanacağınıza kendiniz karar verebilirsiniz. Bütün NYP (nesne yönelimli programlama) özellikleri PHP 4'te varolmasa da, birçok kod kütüphanesi ve büyük uygulama (PEAR kütüphanesi dahil) NYP kullanılarak yazılmıştır.
PHP'nin yetenekleri yalnızca HTML çıktı üretmekle sınırlı değildir. PHP'nin yetenekleri arasında resim çıktısı üretebilme, PDF oluşturabilme ve hatta Flash filmleri oluşturabilme (libswf ve Ming kullanarak) bulunmaktadır. Aynı şekilde XHTML ya da XML gibi her tür metin tabanlı dosyayı oluşturabilmeniz mümkündür. PHP bu dosyaları özdevinimli olarak oluşturabilir ve ekrana yazdırmanın yanında sizin için dosya sisteminde saklayabilir, böylece devingen içeriğiniz için sunucu-taraflı bir depo sistemini kullanımınıza sunabilir.
PHP'nin en güçlü ve en çok üstünde durulan özelliklerinden biri, sahip olduğu geniş ve gelişmiş veritabanı desteğidir. PHP ile veritabanı bağlantılı site sayfaları oluşturmak son derece basittir. Aşağıda desteklenen veritabanlarının listesi bulunmaktadır:
Bunların haricinde PDO adı verilen bir veritabanı soyutlama eklentisiyle, bu eklenti tarafından desteklenen veritabanlarını şeffaf olarak kullanabilirsiniz. PHP, ek olarak ODBC'yi, yani Açık Veritabanı Bağlantı standardını da destekler, bu şekilde ODBC'yi destekleyen tüm veritabanları ile iletişim kurabilirsiniz.
- Adabas D
- dBase
- Empress
- FilePro (salt okunur)
- Hyperwave
- IBM DB2
- Informix
- Ingres
- InterBase
- FrontBase
- mSQL
- Direct MS-SQL
- MySQL
- ODBC
- Oracle (OCI7 ve OCI8)
- Ovrimos
- PostgreSQL
- SQLite
- Solid
- Sybase
- Velocis
- Unix dbm
PHP, farklı hizmetlerle LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (Windows için) ve daha sayısız protokol aracılığıyla iletişim kurabilecek bir altyapıya da sahiptir. Hazır modüllerin haricinde ham ağ soketleri açıp bu soketler üzerinden istediğiniz bütün protokollerle çalışabilirsiniz. PHP, WDDX üzerinden sanal olarak sanal doku üzerinde hangi dilde yazılmış olursa olsun tüm uygulamalarla haberleşebilir. Ayrıca Java nesnelerinin oluşturulabilmesi ve şeffaf biçimde PHP nesneleri olarak kullanılabilmeleri önemli bir diğer özelliktir. Uzaktaki nesnelere erişim için CORBA uzantısı, yine PHP'nin sahip olduğu özellikler arasındadır.
PHP oldukça faydalı belge işleme özelliklerine sahiptir. Bu yelpaze Genişletilmiş POSIX ya da Perl düzenli ifade komutlarından XML dosyalarını okumaya kadar uzanır. XML dosyalarının okunması ve erişimi için SAX ve DOM standartlarını destekler. XSLT eklentisi ile XML belgeler dönüştürülebilir. PHP 5 tüm XML uzantılarını libxml2 tabanında tek bir standartta toplamış ve SimpleXML ile XMLReader desteğini bünyesine katarak sunduğu imkan yelpazesini genişletmiştir.
Bunların dışında, mnoGoSearch arama motoru, IRC ağ geçidi uzantıları, birçok sıkıştırma aracı (gzip, bz2) için yardımcı araçlar, takvim araçları, dil çeviri işlevleri yine PHP'nin sunmakta olduğu ilginç eklentilerden bazılarıdır.
Sizin de görebildiğiniz gibi bu sayfa PHP'nin sunabileceği bütün özellikleri ve faydaları anlatabilmek için yeterli değil. Yapılandırma ve Kurulum bölümünde ve İşlev başvuru kılavuzunda listelenen eklentilerin başlangıç bölümlerindeki açıklamalardan her bir eklenti için daha fazla bilgiye ulaşabilirsiniz.
Bu bölümde PHP ile ilgili en temel bilgileri kısa ve basit bir eğitmen üzerinde anlatmak istiyoruz. Bu metin yalnızca PHP ile devingen site sayfaları geliştirmeyi ele alır, ancak PHP'nin yeteneği yalnızca site sayfaları oluşturmakla sınırlı değildir. Daha fazla bilgi için PHP'nin yapabildikleri bölümünü inceleyebilirsiniz.
PHP tarafından etkinleştirilen site sayfaları normal HTML sayfaları gibidir ve bu sayfaları normal HTML sayfaları için kullandığınız yöntemlerle oluşturabilir ve düzenleyebilirsiniz.
Bu eğitmen süresince HTTP sunucunuzun PHP desteğinin etkinleştirilmiş olduğunu ve tüm .php uzantılı dosyaların PHP tarafından yorumlandığını varsayacağız. Çoğu sunucuda, bu uzantı PHP dosyaları için öntanımlı dosya uzantısıdır, ancak emin olmak için sunucunuzun yöneticisinden doğru bilgiyi edinebilirsiniz. Sunucunuz PHP'yi destekliyorsa, başka hiçbir şeye ihtiyacınız yok demektir. Yalnızca .php uzantılı dosyalarınızı oluşturmanız sunucunuzun belge dizinlerine koymanız, sunucunuzun bu dosyayı sizin için özdevinimli olarak işleme koyması için yeterli olacaktır. Herhangi bir şeyi derlemeniz ya da fazladan bir araç kurulumu yapmanız gerekmemektedir. PHP tarafından etkinleştirilen dosyaları yeni bir tür HTML dosyası olarak kafanızda canlandırabilirsiniz. Düşünün ki, artık HTML dosyasının içine sihirli birtakım etiketler koyabiliyor ve bu etiketler sayesinde istediğiniz her tür işlemi gerçekleştirebiliyorsunuz. Site barındırma hizmeti verenlerin çoğu PHP desteği sunmaktadır, ancak sizinki sunmuyorsa, » PHP Bağlantıları bölümünden PHP hizmeti sunan barındırma sitelerinin adreslerine ulaşabilirsiniz.
Diyelim ki çok değerli olan band genişliğinizi boşa harcamamak ve kendi sisteminizde yerel olarak geliştirme yapmak istiyorsunuz. Bu durumda, » Apache gibi bir HTTP sunucusunu ve elbette » PHP'yi indirmeniz ve kurmanız gerekecektir. Bu ikilinin yanında, » MySQL gibi bir veritabanını da indirip kurmanız iyi olacaktır.
Bu üçlüyü tek tek kumak yerine daha basit bir yol izleyebilirsiniz. Kılavuzumuz PHP için kurulum bilgileri (HTTP sunucunuzun halihazırda kurulu olduğunu öngörür) bölümüne sahiptir. PHP'yi kendiniz kurmakta sorun yaşarsanız, sorularınızın çözümü için » kurulum posta listesi'ne başvurabilirsiniz. Daha basit bir yoldan gitmek istiyorsanız, işletim sisteminize uygun olan » ön yapılandırmalı paketleri seçebilir ve tüm bu araçları bir kaç fare tıklamasıyla özdevinimli olarak yükleyebilirsiniz. MacOSX, Linux ve Windows dahil olmak üzere birçok işletim sistemine PHP destekli bir HTTP sunucusu kurmak oldukça kolaydır. Linux üzerinde, » rpmfind ve » PBone araçlar RPM dosyalarını bulmakta size yardımcı olacaklardır. Debian için ise » apt-get sayfasını ziyaret edebilirsiniz.
merhaba.php isimli bir dosya oluşturun ve HTML sunucunuzun belge kök dizinine (DOCUMENT_ROOT) aşağıdaki içerikle kaydedin:
Örnek 1 - İlk PHP betiğimiz: merhaba.php
<html>
<head>
<title>PHP Denemesi</title>
</head>
<body>
<?php echo '<p>Merhaba Dunya</p>'; ?>
</body>
</html>
Tarayıcınızı kullanarak HTTP sunucunuzun adresine erişebilirsiniz, sunucunuzun alan adının sonuna /merhaba.php eklemeniz yeterli olacaktır. Yerel olarak geliştirme yaparken bu URL http://localhost/merhaba.php ya da http://127.0.0.1/merhaba.php gibi bir şey olacaktır, ancak bu HTTP sunucusunun yapılandırma ayarlarına bağlıdır. Eğer her şey düzgün yapılandırılmışsa, bu dosya PHP tarafından işlenecek ve aşağıdaki çıktı tarayıcınıza gönderilecektir:
<html> <head> <title>PHP Denemesi</title> </head> <body> <p>Merhaba Dunya</p> </body> </html>
Bu program gördüğünüz gibi son derece basittir ve esasında böyle bir sayfa oluşturmak için PHP'ye gereksiniminiz yoktur. Görüntülenen: PHP'nin echo() deyimi kullanılarak elde edilen Merhaba Dünya cümlesidir. Bu dosyanın hiçbir şekilde çalıştırılabilir olmasına ya da özel bir türde olmasına ihtiyaç duyulmadığına dikkat edin. Sunucu dosyanın PHP tarafından işlenmesi gerektiğini bilir çünkü dosyaya ".php" uzantısını tanımladınız. Sunucu bu uzantıya sahip dosyaları PHP'ye aktaracak biçimde yapılandırılmıştır. Bunu size birtakım özel etiketlerle birçok ilginç işlem yapmanızı sağlayan bir tür HTML dosyası olarak düşünebilirsiniz.
Bu örneği denediyseniz ve hiçbir çıktı alamadıysanız, sizden dosyayı indirmenizi istediyse ya da dosyanın tüm içeriğini metin olarak ekranda gördüyseniz, büyük ihtimalle sunucunuzun PHP desteği etkinleştirilmemiştir ya da sunucunuz doğru yapılandırılmamıştır. Yöneticinizden kılavuzdaki Kurulum bölümünü kullanarak PHP'yi etkinleştirmesini rica edebilirsiniz. Yerel olarak geliştirme yapıyorsanız, kurulum bölümünü okuyarak herşeyin doğru yapılandırıldığından emin olun. Size çıktıyı sağlayan sunucudaki dosyaya http üzerinden erişmeye çalışıp çalışmadığınızı kontrol edin. Dosyayı doğrudan kendi dosya sisteminizden çağırıyorsanız, PHP tarafından işlenmeyecektir. Sorun her şeye rağmen devam ediyorsa, » PHP desteği alma yöntemlerini kullanmakta tereddüt etmeyin.
Bu örneğin amacı özel PHP etiketi biçemini göstermektir. Örnekte <?php ile PHP etiketinin başlangıcını belirledik. Sonra PHP komutunu yazdık ve kapanış etiketi ?> kullanarak PHP kipinden çıktık. Bir HTML dosyasında bu yöntemi kullanarak istediğiniz yerde PHP kipine girip çıkabilirsiniz. Daha fazla bilgi için, kılavuzun temel PHP sözdimi bölümünü okuyabilirsiniz.
Bilginize: Satırsonları hakkında
Satırsonu karakterlerinin HTML içinde bir önemi yoktur, bununla birlikte HTML kodunun göze hoş görünmesi için satırsonu karakterlerini kullanmak gerekir. ?> kapama etiketinin hemen ardından gelen satırsonu karakterini PHP silecektir. Dosyanın içine çok sayıda PHP bloğu koyarsanız veya hiçbir şey çıktılamayan betikleri dosyaya dahil etmeniz durumunda bu çok işe yarar. Ancak bu biraz kafa karıştırıcı olabilir. ?> kapama etiketinden sonra bir satırsonu karakterinin çıktılanmasını zorlamak isterseniz, ya kapama etiketinden sonra bir boşluk bırakıp onun ardına satırsonu karakterini koyun ya da PHP bloğunun son echo/print deyiminin sonuna bir satır sonu karakteri ekleyin.
Bilginize: Metin Düzenleyiciler Hakkında
PHP dosyalarını yaratabileceğiniz, düzenleyebileceğiniz ve yönetebileceğiniz birçok metin düzenleyici ve Bütünleşik Geliştirme Ortamı (IDE) bulunmaktadır. Bu araçların bir kısmı » PHP Düzenleyicileri Listesi bölümünde listelenmiştir. Sizin önermek istediğiniz bir düzenleyici varsa, lütfen yukarıdaki sayfayı ziyaret edin ve sayfa idarecisinden önermek istediğiniz düzenleyiciyi bu listeye eklemesini rica edin. Söz dizimi vurgulaması olan bir düzenleyici size yardımcı olabilir.
Bilginize: Kelime İşlemciler Hakkında
StarOffice Writer, Microsoft Word ve Abiword gibi kelime işlemciler PHP dosyalarını düzenlemek için uygun değillerdir. Eğer bu deneme betiği için bunlardan birini kullanmak istiyorsanız, dosyanın salt metin olarak kaydedildiğinden emin olun, aksi takdirde PHP'nin betiği okuması ve çalıştırması mümkün olmayacaktır.
Bilginize: Windows Not Defteri Hakkında
PHP betiklerinizi Windows Not Defteri ile yazıyorsanız, dosyalarınızın .php uzantısı ile kaydedildiğinden emin olmalısınız (Notepad birazdan bahsedeceğimiz önlemleri almadığınız takdirde dosyaların sonuna özdevinimli olarak .txt uzantısı ekler). Dosyayı kaydetmek istediğinizde, sizden dosyanız için bir isim belirtmeniz istenecektir. Dosya ismini tırnak içinde (örn. "hello.php") yazın. Bundan başka, 'Kaydet' iletişim kutusunun içindeki 'Metin Belgeleri' açılır menüsüne tıkladıktan sonra buradaki değeri "Tüm Dosyalar" olarak değiştirin. Artık dosya isminizi tırnak işareti kullanmadan yazabilirsiniz.
Artık çalışır bir PHP betiğini başarıyla oluşturduğunza göre, PHP betiklerinin en ünlüsünü oluşturma zamanı geldi demektir! phpinfo() işlevini çalıştıracağız ve sisteminiz ve yapılandırmanızla ilgili öntanımlı değişkenler, yüklü PHP modülleri ve yapılandırma ayarları gibi konularda faydalı birçok bilgiye ulaşacağız. Bu önemli bilgiler için biraz vakit ayırmanızı ve bunları incelemenizi öneririz.
Örnek 2 - PHP ile sistem bilgisine ulaşmak
<?php phpinfo(); ?>
Şimdi daha işe yarar bir şey yapalım. Ziyaretçilerinizin hangi tarayıcıyı kullandığını tespit edelim. Bunun için, ziyaretçinizin tarayıcısı tarafından HTTP isteği ile birlikte gönderilen kullanıcı aracısı dizgesine bakacağız. Bu bilgi bir değişkende saklanır. Değişkenler PHP'de her zaman dolar işareti ile başlar. Bizim şu an için ilgilendiğimiz değişken $_SERVER['HTTP_USER_AGENT']'tir.
Bilginize: $_SERVER PHP kullanımına ayrılmış özel bir değişken olup HTTP sunucusunun tüm bilgilerini içerir. Bu tür değişkenlere süper küreseller denir. Bu konuda daha ayrıntılı bilgiyi Süper küreseller bölümünde bulabilirsiniz. Bu özel değişkenler PHP » 4.1.0 sürümünden itibaren kullanılmaya başlanmıştır. Daha öncesinde, $HTTP_SERVER_VARS gibi eski $HTTP_*_VARS dizileri kullanılmaktaydı. Ömrünü doldurmuş olsa da, bu eski tarz değişkenler hala kullanılabilmektedir. (Eski kod bölümüne de bakınız.)
Bu değişkenin değerini görüntülemek için yapmanız gereken:
Örnek 1 - Bir değişkeni (dizi öğesini) yazdırmak
<?php echo $_SERVER['HTTP_USER_AGENT']; ?>
Bu betiğin çıktısı şöyle bir dizge olabilirdi:
PHP'de birçok farklı değişken türü mevcuttur. Yukardaki örnekte bir diziye ait bir öğeyi yazdırdık. Diziler çok kullanışlı olabilirler.
$_SERVER PHP tarafından kullanımınıza özdevinimli olarak sunulan bir değişkendir. Kullanım kılavuzunun Öntanımlı Değişkenler bölümünden tümünün listesine ulaşabilirsiniz ya da önceki örnekte kullandığımız phpinfo() işlevi ile üretilen çıktıya bakarak bütün listeye ulaşabilirsiniz.
PHP etiketinin içine birden çok PHP komutu koyabilir ve tek bir echo komutundan daha fazlasını yapan küçük kod blokları oluşturabilirsiniz. Örneğin, ziyaretçinizin Internet Explorer kullanıp kullanmadığını şöyle öğrenebilirsiniz:
Örnek 2 - Denetim yapılarının ve işlevlerin kullanım örneği
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
echo 'Internet Explorer kullanmaktasınız.<br />';
}
?>
Bu betiğin çıktısı şöyle olabilirdi:
Internet Explorer kullanmaktasınız.<br />
Burada birkaç yeni kavramı devreye soktuk. Bir if deyimimiz var. Eğer C dilinde kullanılan temel sözdizimine aşinalığınız varsa, bu kullanım size tanıdık gelecektir. Aksi takdirde, giriş düzeyinde bir PHP kitabı almanız ve ilk birkaç bölümünü okumanız ya da kılavuzun Dil Başvuru Kılavuzu bölümünü okumanız faydalı olacaktır.
Devreye soktuğumuz ikinci kavram, strpos() işlevi ile yaptığımız çağrı oldu. strpos(), bir dizgeyi başka bir dizgenin içinde arayan yerleşik bir PHP işlevidir. Burada 'MSIE' dizgesini (iğne) $_SERVER['HTTP_USER_AGENT'] içinde (samanlık) arıyoruz. Eğer iğne samanlıkta bulunursa işlev iğnenin konumunu samanlığın başlangıcına göreli olarak döndürür. Aksi takdirde FALSE döner. if ifadesinin sonucu TRUE olduğu takdirde FALSE dönmez ve kaşlı ayraçlar arasındaki kod çalıştırılır. Aksi takdirde kod çalıştırılmaz. If, else gibi denetim yapıları ile strtoupper() ve strlen() gibi işlevleri kullanarak siz de benzer örnekler yazabilirsiniz. İlgili her kılavuz sayfası aynı zamanda örnekler de içermektedir. Bu işlevleri nasıl kullanmanız gerektiğinden emin değilseniz, kılavuzdaki bir işlev tanımı nasıl okunur ve PHP işlevleri bölümlerini okuyabilirsiniz.
Bunu bir adım öteye taşıyabilir ve bir PHP bloğunun tam ortasındayken bile PHP kipine nasıl girip çıkabileceğimize bakabiliriz:
Örnek 3 - HTML ve PHP kiplerini karıştırmak
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
?>
<h3>strpos() false olmayan bir değer döndürmelidir</h3>
<p>Internet Explorer kullanmaktasınız</p>
<?php
} else {
?>
<h3>strpos() false döndürmelidir</h3>
<p>Internet Explorer kullanmıyorsunuz</p>
<?php
}
?>
Bu betikten elde edilebilecek sonuçlardan biri:
<h3>strpos() false olmayan bir değer döndürmelidir</h3> <p>Internet Explorer kullanmaktasınız</p>
Bir çıktı üretmek için PHP echo komutunu kullanmak yerine, PHP kipinden çıktık ve sadece düz HTML gönderdik. Burada dikkat edilmesi gereken önemli nokta, betiğin mantıksal akışının değişmiyor olmasıdır. strpos() işlevinden edinilen sonuca göre HTML bloklarından yalnızca biri görüntüleyiciye gönderilmektedir. Başka bir deyişle, bu işleyiş MSIE değişkeninin bulunup bulunmamasına bağlıdır.
PHP'nin en güçlü özelliklerinden biri HTML formlarına yaklaşım biçimidir. Bilinmesi gereken ilk önemli durum, form içindeki tüm elemanların PHP tarafından özdevinimli olarak kullanılabilir olacağıdır. PHP ile formların kullanımı ve daha ayrıntılı bilgi için Dış kaynaklı değişkenler bölümünü okuyabilirsiniz. Örnek bir HTML formu:
Örnek 1 - Örnek bir HTML formu
<form action="action.php" method="post"> <p>İsminiz: <input type="text" name="isim" /></p> <p>Yaşınız: <input type="text" name="yaş" /></p> <p><input type="submit" /></p> </form>
Bu formda özel hiçbir şey yoktur. Hiçbir özel etiket içermeyen düz bir HTML formudur. Kullanıcı formu doldurup gönder tuşuna bastığında, action.php sayfası çağrılır. Bu dosyaya aşağıdakileri yazabiliriz:
Örnek 2 - Formdan veri yazdırmak
Merhaba <?php echo htmlspecialchars($_POST['isim']); ?>.
Siz <?php echo (int)$_POST['yaş']; ?> yaşındasınız.
Bu betikten elde edilecek örnek çıktı:
Merhaba Ahmet. Siz 22 yaşındasınız.
htmlspecialchars() ve (int) kısımları harcinde yapılan iş oldukça açık. htmlspecialchars() işlevi HTML'ye özel karakterlerin doğru şekilde kodlandığından emin olunmasını sağlar, dolayısıyla başkaları sayfanıza dışardan HTML etiketleri veya Javascript yerleştiremez. Yaş alanınında ise değerin bir tamsayı olması gerektiğini bildiğimiz için değeri integer türüne dönüştürmekle özdevinimli olarak bu alana girilmesi olası başı boş karakterlerden de kurtulmuş olduk. Ayrıca, bunun PHP'de sizin yerinize özdevinimli olarak yapılmasını sağlamak için süzgeç eklentisini de kullanabilirdiniz. $_POST['isim'] değişkeni ve $_POST['yaş'] değişkenleri sizin yerinize PHP tarafından özdevinimli olarak oluşturulur. Daha önce $_SERVER süper küresel değişkenini kullanmıştık, yukarıda ise tüm POST verisini içeren $_POST süper küresel değişkenini tanımış olduk. Formumuz için tanımlı yöntemin POST oluşuna dikkat edin. GET yöntemini kullanmış olsaydık, form bilgilerimiz $_GET süper küresel değişkenine atanmış olacaktı. Bunların haricinde, istemciden gelen verinin hangi kaynaktan geldiği sizin için önemli değilse $_REQUEST süper küreselini de kullanabilirdiniz. Bu değişken GET, POST ve COOKIE verilerinin birleşiminden oluşur. Daha fazla bilgi için import_request_variables() işlevini inceleyebilirsiniz.
PHP içinde XForms öğelerini de kullanabilirsiniz, ancak başlangıç aşamasında çok iyi desteklenen HTML formları sizin işinizi görecektir. XForms ile çalışmak yeni başlayanlar için uygun olmasa da, ilginizi çekebilir. XForms ile çalışmak belgesinde bu konu ile ilgili daha fazla bilgi bulabilirsiniz.
PHP'nin günümüzün çok kullanılan bir betik dili olmasıyla birlikte, hazır kullanabileceğiniz kodlar üreten halka açık birçok depo ve kütüphane oluşturuldu. PHP geliştiricileri geriye dönük uyumluluğu mümkün olduğunca korumaya çalıştılar, dolayısıyla eski bir PHP sürümü ile birlikte yazılmış bir PHP kodu hiçbir değişiklik yapılmasına gerek duyulmadan (ideal olarak) yeni PHP sürümleri ile çalışabilir halde kaldı. Ancak uygulamada, bazı değişikliklerin yapılması gerekebilir.
Eski kodları etkileyen yakın geçmişe ait iki önemli değişiklik:
Bu değişiklikler ile ilgili daha fazla bilgi için, Öntanımlı Değişkenler bölümünden ve oradaki diğer bağlantılardan faydalanabilirsiniz.
Sahip olduğunuz yeni bilgilerle kılavuzun birçok bölümünü anlayabilir ve örnek arşivinde bulunan birçok betiği okuyabilir hale gelmiş olmalısınız. » http://www.php.net/links.php bağlantısından inceleyebileceğiniz başka örneklere ulaşabilirsiniz.
PHP ile neler yapabileceğiniz ile ilgili sunumlara ulaşmak isterseniz, » http://talks.php.net/ adresindeki PHP Konferans Malzemeleri Sitesini ziyaret edebilirsiniz.
Kuruluma başlamadan önce PHP'yi ne amaçla kullanacağınızı bilmeniz faydalı olur. Kullanım amaçları PHP ile ne yapılabilir? bölümünde anlatıldığı üzere 3 bölümde incelenebilir:
İlk ve en önemli amaç için üç şeye ihtiyacınız bulunmaktadır: PHP'nin kendisi, bir HTTP Sunucusu ve bir tarayıcı. Muhtemelen bir tarayıcınız zaten vardır. Kullanmakta olduğunuz işletim sistemine bağlı olarak bir HTTP Sunucunuz da olabilir (Linux ve MacOS üzerinde Apache, Windows üzerinde IIS gibi). Yoksa, bir firmadan site barındırma hizmeti alabilirsiniz. Böylece herşeyi kendiniz ayarlamak zorunda kalmazsınız. Sadece PHP betiklerinizi yazmakla ilgilenir ve onları kiraladığınız alana yükleyip tarayıcınızla sonuçları görürsünüz.
Sunucuyu ve PHP’yi kendiniz yapılandıracaksanız, PHP’yi sunucuya bağlamak için iki seçeneğiniz olacak. Bir çok sunucunun PHP için (SAPI de denilen) bir modülü vardır. Apache, Microsoft Internet Information Server, Netscape and iPlanet sunucuları bu tür sunuculardandır. Bir çok sunucunun da Microsoft modül arayüzü, ISAPI için desteği vardır (OmniHTTPd gibi). Eğer sunucunuzda PHP için modül desteği yoksa sunucunuz ne türde olursa olsun onu bir CGI veya FastCGI işlemcisi olarak kullanabilirsiniz. Yani, sunucuya gelen tüm PHP dosyası isteklerini işleme sokmak için PHP’nin CGI çalıştırılabilirini kullanmak üzere sunucunuzu yapılandırabilirsiniz.
PHP'yi komut satırı betikleri yazmak için kullanmayı düşünüyorsanız (özdevinimli olarak resim üreten veya komut satırından aktardığınız değiştirgelerle metin dosyalarını işleyen betikler gibi), bir komut satırı betik yorumlayıcısına ihtiyacınız var demektir. Bu konuda daha fazla bigi edinmek için Komut satırı PHP uygulamalarının yazılması bölümüne bakınız. Bu durumda ne sunucuya ne de tarayıcıya ihtiyacınız olur.
PHP ile PHP-GTK eklentisini kullanarak masaüstü uygulamaları da yazabilirsiniz. Herhangi bir HTML çıktı üretilmediği için Genel Ağ sayfaları yazmaktan tamamen farklı bir yaklaşıma sahiptir. Bu araçlarla sadece pencereleri ve nesneleri yönetirsiniz. PHP-GTK hakkında daha ayrıntılı bilgi edinmek için lütfen » bu eklentinin kendi sitesini ziyaret ediniz. PHP-GTK, resmi PHP dağıtımlarıyla gelmez.
Bu noktadan itibaren belgede, daha çok Unix ve Windows üzerinde çalışan modüllü HTTP sunucuları ve CGI çalıştırılabilirlerinin yapılandırılması üzerinde durulacaktır. Ayrıca, komut satırı çalıştırılabiliri hakkında da bilgi bulabileceksiniz.
PHP'nin kaynak kodu ve Windows için çalıştırılabilir sürümleri » http://www.php.net/downloads.php adresinden temin edilebilir. Dağıtımları indirmek için yakınınızdaki » yansıları kullanmanızı öneririz.
Bu bölümde, PHP'nin Unix sistemleri üzerindeki yapılandırmasından ve kurulumundan ana hatları ile bahsedilecektir. Kuruluma başlamadan önce platformunuza ve kullandığınız HTTP sunucusuna özgü bölümleri incelemenizi öneririz.
Kılavuzun Genel Kurulum Değerlendirmesi bölümünde ana hatlarıyla bahsettiğimiz gibi, bu bölümde esas olarak HTTP sunucusunu ilgilendiren ayarlardan bahseceksek de PHP'nin komut satırından kullanımı ile ilgili ayarlara da değineceğiz.
PHP'yi Unix platformlarına kurmanın çeşitli yolları vardır. Kaynak kod paketinden kendiniz derleyip kurabileceğiniz gibi başkaları tarafından derlenip paketlenmiş sürümleri de kurabilirsiniz. Bu belgelerde esas olarak kaynak kod paketinden derleme, kurulum ve yapılandırma sürecinden bahsedeceğiz. Çoğu Unix benzeri sistemin kendine özgü paket kurulum yöntemi vardır. Bu, standart yapılandırmaya yardımcı olabilirse de farklı özelliklere ihtiyaç duyduğunuzda (örneğin, güvenli sunucu veya veritabanı sunucusu), HTTP sunucunuzu ve PHP'yi kendiniz derlemek zorunda kalırsınız. Yazılımları kendiniz derleyip kuracak bilgiye sahip değilseniz, sizin istediğiniz özelliklerde başkaları paket derlemiş mi diye bir araştırma yapmanızı öneririz.
Derleme işlemi için gerekli bilgi ve yazılımlar:
PHP kaynak kod paketinin derleme için ayar ve yapılandırma işlemi configure betiğinin komut satırı seçenekleri kullanılarak yapılır. Bu seçeneklerin neler olduğunu görmek için kaynak paketinin kök dizininde komut satırından ./configure --help komutunu verebilirsiniz. Ayrıca, bu kılavuzda da bazı seçeneklerin açıklamalarına yer verilmiştir. Temel yapılandırma seçeneklerini eklerde bulabilirsiniz. Eklentilere özgü yapılandırma seçenekleri ise eklentilerin kılavuzdaki belgelerinde bulunabilir.
PHP'yi yapılandırdığınızda modülleri ve çalıştırılabilirleri derlemeye hazırsınız demektir. Artık make komutunu verebilirsiniz. Derleme işlemi bir noktada başarısız olursa ve bunun sebebini anlayamazsanız, Sorunlar bölümüne bakınız.
Bu bölümde, PHP'nin Unix platformlarında Apache kurulumlarına özgü bilgilere ve ipuçlarına yer verilmiştir. Apache 2 ile ilgili bilgiler ve ipuçları ayrı bir sayfada verilmiştir.
Aşağıda, 10. şıkta kullanacağınız configure betiğinin temel yapılandırma seçeneklerini eklerde bulabilirsiniz. Eklentilere özgü yapılandırma seçenekleri ise eklentilerin kılavuzdaki belgelerinde bulunabilir. Örneklerde yazılımların sürüm numaraları, belgeyi sürüm numarasına bağlı kılmamak için 'xxx' ile gösterilmiştir. Siz bu çarpıların yerine kurduğunuz paketlerin sürüm numaralarını yazacaksınız.
Örnek 1 - PHP'nin Paylaşımlı Apache Modülü olarak kurulumu
1. gunzip apache_xxx.tar.gz
2. tar -xvf apache_xxx.tar
3. gunzip php-xxx.tar.gz
4. tar -xvf php-xxx.tar
5. cd apache_xxx
6. ./configure --prefix=/usr --enable-module=so
7. make
8. make install
9. cd ../php-xxx
10. Artık PHP'yi yapılandırabilirsiniz. Burada PHP'yi eklentileri
etkinleştiren çeşitli seçeneklerle özelleştirebilirsiniz. Olası
seçeneklerin listesini almak için ./configure --help komutunu
çalıştırabilirsiniz. Bu örnekte Apache 1 için MySQL destekli
basit bir yapılandırmaya yer verilmiştir. Ayrıca, apxs komutunun
bulunduğu yer de buradakinden farklı olabilir.
./configure --with-mysql --with-apxs=/usr/bin/apxs
11. make
12. make install
Kurulumdan sonra yapılandırmanızı değiştirmek isterseniz son üç adımı
yinelemek yeterlidir. Yeni modülün etkili olması için tek ihtiyacınız
Apache'yi yeniden başlatmaktır. Apache'nin yeniden derlenmesine gerek
yoktur.
Aksi özellikle belirtilmedikçe 'make install' ile phpize gibi çeşitli PHP
araçları, PEAR, PHP CLI ve bir takım başka şeylerin de kurulumu yapılır.
13. php.ini dosyanızı yapılandırın:
cp php.ini-development /usr/local/lib/php.ini
PHP seçeneklerini ayarlamak için .ini dosyanızı düzenleyebilirsiniz. .ini
dosyanızın başka bir yerde durmasını istiyorsanız, 10. şıkta
--with-config-file-path=/başka/bir/yer seçeneği ile dosyanız için başka
bir yer belirtebilirsiniz.
php.ini-dist yerine php.ini-production (dağıtımın standart .ini dosyası
yerine önerilen yapılandırmalar dosyasını) kullanmayı tercih ederseniz,
değişiklik listesini okumayı ihmal etmeyin, çünkü bunlar PHP'nin
davranışını etkileyecektir.
14. PHP modülünün yüklenmesi için httpd.conf dosyasını düzenlemelisiniz.
LoadModule yönergesinin değeri PHP modülünün sistemdeki yerini
göstermelidir. Yukarıdaki 'make install' bunu sizin yerinize yapmıştır
ama emin olmak için siz yine de bir bakın.
PHP 4 için:
LoadModule php4_module libexec/libphp4.so
PHP 5 için:
LoadModule php5_module libexec/libphp5.so
15. httpd.conf'un AddModule bölümünde ClearModuleList yönergesinin altına
şunu ekleyin:
PHP 4 için:
AddModule mod_php4.c
PHP 5 için:
AddModule mod_php5.c
16. Apache'ye belli dosya uzantılarını PHP uzantıları olarak ele almasını
söyleyin. Örneğin, .php uzantılı dosyaları Apache'nin PHP dosyaları
olarak ele almasını isteyebiliriz. Başka uzantıları da buraya
ekleyebilirsiniz. Bunları aralarında boşluk bırakarak aynı satıra
yazabilirsiniz. Biz örnek olsun diye .phtml uzantısını ekledik.
AddType application/x-httpd-php .php .phtml
PHP kaynak kodlarını renklendirilmiş olarak göstermek için .phps
uzantısını da yapılandırmanıza ekleyebilirsiniz. Bu, şöyle yapılır:
AddType application/x-httpd-php-source .phps
17. Artık Apache'yi başlatabilirsiniz. Bunun için Apache'yi her zaman ki gibi
başlatmanız yetecektir. (Sunucunun bir HUP veya USR1 sinyali kullanılarak
yeniden yüklenmemesi için sunucunuzu yeniden başlatmadan önce
durdurmalısınız.)
PHP'yi bir duruk nesne olarak da kurabilirsiniz:
Örnek 2 - PHP'nin Duruk Apache Modülü olarak kurulumu
1. gunzip -c apache_1.3.x.tar.gz | tar xf -
2. cd apache_1.3.x
3. ./configure
4. cd ..
5. gunzip -c php-5.x.y.tar.gz | tar xf -
6. cd php-5.x.y
7. ./configure --with-mysql --with-apache=../apache_1.3.x
8. make
9. make install
10. cd ../apache_1.3.x
11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a
(Bu satırda bir hata yok! libphp5.a'nın henüz mevcut olmadığının
farkındayız. PHP derlenince mevcut olacak.)
12. make
(Artık httpd çalıştırılabilirini Apache bin dizinine kopyalayabilirsiniz.
Apache'yi ilk defa kuruyorsanız bu komuttan sonra "make install" komutunu
da verin.)
13. cd ../php-5.x.y
14. cp php.ini-development /usr/local/lib/php.ini
15. PHP seçeneklerini ayarlamak için artık /usr/local/lib/php.ini dosyasını
düzenleyebilirsiniz. httpd.conf veya srm.conf dosyasını açıp şunu ekleyin:
AddType application/x-httpd-php .php
Bilginize: PHP 4 kurulumu için php-5'lerin yerine php-4 ve php5'lerin yerine php4 yazın.
Kullandığınız Unix türevine ve Apache kurulumuna bağlı olarak, sunucuyu durdurmanın ve yeniden başlatmanın çeşitli yolları vardır. Aşağıda farklı Unix/Apache kurulumları için sunucuyu yeniden başlatırkan kullanılabilecek komutlara yer verilmiştir. /bir/yer/ yerine bu uygulamaların dosya sistemindeki yerlerini yazınız.
Örnek 3 - Apache'yi yeniden başlatmak için örnek komutlar
1. Çeşitli Linux ve SysV türevleri için: /etc/rc.d/init.d/httpd restart 2. apachectl betiği ile: /bir/yer/apachectl stop /bir/yer/apachectl start 3. httpdctl ve httpsdctl (OpenSSL kullanarak), apachectl gibidir: /bir/yer/httpsdctl stop /bir/yer/httpsdctl start 4. mod_ssl veya başka bir SSL sunucu kullanıyorsanız, elle durdurup başlatmanız gerekebilir: /bir/yer/apachectl stop /bir/yer/apachectl startssl
apachectl and http(s)dctl
çalıştırılabilirlerinin yerleri sık sık değişir. Sisteminizde
locate, whereis,
which gibi araçlar kuruluysa bunların yerlerini bu
araçları kullanarak öğrenebilirsiniz.
PHP'yi Apache için derlerken kullanılabilecek farklı yapılandırma örnekleri:
./configure --with-apxs --with-pgsql
Bu yapılandırmayla, Apache'nin httpd.conf dosyasında LoadModule yönergesi ile Apache'ye yüklenebilecek şekilde bir libphp5.so (veya PHP4 için libphp4.so) paylaşımlı kütüphanesi oluşturulacak, PostgreSQL desteği bu kütüphaneye gömülü olacaktır.
./configure --with-apxs --with-pgsql=shared
Bu yapılandırmayla, Apache için bir libphp4.so
paylaşımlı kütüphanesi oluşturulacak fakat önceki örnekten farklı olarak
PostgreSQL desteği için pgsql.so adında ayrı bir
paylaşımlı kütüphane oluşturulacaktır. PHP'ye PostgreSQL desteğini,
eklentiyi php.ini içinde bir extension yönergesinde
belirterek veya doğrudan bir betik içinde dl()
işlevini kullanarak verebilirsiniz.
./configure --with-apache=/bir/yer/apache_kaynak_paketi --with-pgsql
Bu yapılandırmayla, bir libmodphp5.a kütüphanesi, mod_php5.c diye bir dosya ve bunlara eşlik eden bazı dosyalar oluşturulacak ve bunlar Apache kaynak ağacının altında src/modules/php5 dizinine kopyalanacaktır. Bundan sonra Apache --activate-module=src/modules/php5/libphp5.a seçeneği kullanılarak derlendiğinde Apache libphp5.a kütüphanesini oluşturacak (PHP 4 için 5 yerine 4 yazın) ve onu httpd çalıştırılabiliri ile duruk olarak ilintileyecektir. PostgreSQL desteği de doğrudan httpd çalıştırılabiliri içinde olacaktır. Böylece sonuçta tek bir httpd çalıştırılabiliri Apache ve PHP'nin tamamını içerecektir.
./configure --with-apache=/bir/yer/apache_kaynak_paketi --with-pgsql=shared
Yukarıdakinden farklı olarak PostgreSQL desteği, doğrudan sonuncu httpd çalıştırılabiliri içinde değil, ayrı bir pgsql.so paylaşımlı kütüphanesiyle php.ini dosyası üzerinden veya doğrudan dl() işlevi kullanılarak PHP'ye yüklemek suretiyle elde edilecektir.
PHP'yi derlemek için seçtiğiniz her yolun getirileri olacağı gibi götürüleri de olacaktır. Paylaşımlı nesne olarak derlemek, Apache'yi ayrı olarak derleyip, PHP ile ilgili hiçbir şey için Apache'yi tekrar derleme ihtiyacı duymamak demektir. PHP'yi Apache içinde (duruk yöntem) derlerseniz PHP daha çabuk yüklenecek ve daha hızlı çalışacaktır. Bu konularda daha ayrıntılı bilgi edinmek için Apache'nin » DSO desteği sayfasına bakınız.
Bilginize: Apache'nin öntanımlı httpd.conf dosyası şöyle bir bölümle gelmektedir:
User nobody Group "#-1"Burada
Groupsatırı, Group nogroup veya Group daemon gibi bir satırla değiştirilmedikçe, PHP dosyaları açamayacaktır.
Bilginize: --with-apxs=/bir/yer/apxs seçeneğini kullanırken apxs'in kaynak paketindeki yerini değil, sisteminizde kurulu olduğu yeri belirtmeye dikkat edin.
Bu bölüm Unix sistemlerde PHP'nin Apache 2.x'e kurulumu hakkında bilgiler ve ipuçları içerir.
Apache 2'nin bir hizmet ortamında evreli MPM'lerle kullanımını önermiyoruz. Bunun yerine prefork MPM'sini veya Apache 1 kullanmanızı öneririz. Bunun sebebini SSS altında Apache ve evreli MPM'ler başlığı altında bulabilirsiniz.
Apache 2.x HTTP Sunucusu hakkında temel bir bilgi edinmek için mutlaka » Apache HTTP Sunucusu Sürüm 2.x Belgelerine bakmanızı öneririz.
Bilginize: PHP ve Apache 2.0.x uyumluluk bilgileri
Aşağıdaki PHP sürümlerinin Apache 2.0.x'in en son sürümleri ile çalıştığı bilinmektedir:
- PHP 4.3.0 ve sonrası » http://www.php.net/downloads.php adresinden indirilebilir.
- En son kararlı geliştirme sürümü. Kaynak kod paketini » http://snaps.php.net/php5-latest.tar.gz olarak, Windows çalıştırılabilirlerini ise » http://snaps.php.net/win32/php5-win32-latest.zip olarak indirebilirsiniz.
- Kararlı sürüm adayı sürümü » http://qa.php.net/ adresinden indirebilirsiniz.
- PHP'yi » anonim SVN'den indirme seçeneği elbette daima mevcut.
PHP'nin bu sürümleri Apache 2.0.40 ve sonrası ile uyumludur.
Apache 2.0 SAPI desteği PHP 4.2.0 ile başlamıştır. PHP'nin 4.2.3 sürümü Apache 2.0.39'da çalışır. PHP'nin 4.2.3 sürümünü bundan başka bir Apache sürümü ile kullanmayın. Ancak, PHP'nin 4.3.0 ve sonraki sürümlerini Apache2'nin en son sürümleri ile gönül rahatlığıyla kullanabilirsiniz.
PHP'nin bahsi geçen bütün sürümleri hala Apache 1.3.x ile çalışmaktadır. Apache 2.x.x'in Apache 1.3.x ile uyumlu (tek evreli çok süreçli) yapılandırmaları ile de aynı durum sözkonusudur.
En son sürümü » Apache 2.x indirme sitesinden ve buna uygun PHP sürümünü yukarıda bahsedilen yerlerden indirebilirsiniz. Bu kısa kılavuz Apache 2.x ve PHP hakkında sadece temel bilgi sağlar. Daha ayrıntılı bilgi edinmek için » Apache HTTP Sunucusu Belgelerine bakınız. Kurulum talimatlarının sürüm numaralarından ötürü geçerliliğini yitirmemesi için sürüm numaraları 'NN' şeklinde belirtilmiştir, NN yerine kurulan Apache sürümünün sürüm numarası yazılmalıdır.
Apache 2.x'in şu an iki sürümü mevcuttur: 2.0 ve 2.2. Bunlardan birini seçmek için çeşitli sebepler olabilirse de 2.2 şu an için en son ve önerilen sürümdür. Ancak, burada sözü edilen talimatlar hem 2.0 hem de 2.x için çalışır.
Örnek 1 - PHP'nin Paylaşımlı Apache 2 Modülü olarak kurulumu
1. gzip -d httpd-2_x_NN.tar.gz
2. tar xvf httpd-2_x_NN.tar
3. gunzip php-NN.tar.gz
4. tar -xvf php-NN.tar
5. cd httpd-2_x_NN
6. ./configure --enable-so
7. make
8. make install
Böylece standart prefork MPM'si ve yüklenebilir modül desteği ile Apache
2.x.NN /usr/local/apache2 altına kurulmuş oldu. Kurulumu denemek için
Apache HTTP sunucusunu normal yollardan başlatabilirsiniz. Örnek:
/usr/local/apache2/bin/apachectl start
PHP yapılandırmasıyla çalıştırmak üzere şimdilik sunucuyu durduralım:
/usr/local/apache2/bin/apachectl stop.
9. cd ../php-NN
10. Artık PHP'yi yapılandırabiliriz. Hangi eklentilerin etkin olacağını
belirten çeşitli seçenekleri kullanarak PHP'yi özelleştirebilirsiniz.
Olası seçeneklerin listesini görmek için ./configure --help komutunu
kullanın. Bu örnekte Apache 2 ve MySQL ile basit bir yapılandırmaya
gideceğiz. Sizde apxs farklı bir yere kurulmuş olabilir, hatta ismi apxs2
bile olabilir.
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
11. make
12. make install
Eğer kurulumdan sonra yapılandırmanızı değiştirmek isterseniz sadece son
üç adımı yinelemeniz yeterli olacaktır. Yeni modülün etkin olabilmesi
için Apache'yi yeniden başlatmanız gerekir. Apache'yi yeniden derlemeniz
gerekmez.
Aksi özellikle belirtilmedikçe 'make install' ile phpize gibi çeşitli PHP
araçları, PEAR, PHP CLI ve bir takım başka şeylerin de kurulumu yapılır.
13. php.ini dosyanızı yapılandırın:
cp php.ini-development /usr/local/lib/php.ini
PHP seçeneklerini ayarlamak için .ini dosyanızı düzenleyebilirsiniz. .ini
dosyanızın başka bir yerde durmasını istiyorsanız, 10. şıkta
--with-config-file-path=/başka/bir/yer seçeneği ile dosyanız için başka
bir yer belirtebilirsiniz.
php.ini-dist yerine php.ini-production (dağıtımın standart .ini dosyası
yerine önerilen yapılandırmalar dosyasını) kullanmayı tercih ederseniz,
değişiklik listesini okumayı ihmal etmeyin, çünkü bunlar PHP'nin
davranışını etkileyecektir.
14. PHP modülünün yüklenmesi için httpd.conf dosyasını düzenlemelisiniz.
LoadModule yönergesinin değeri PHP modülünün sistemdeki yerini
göstermelidir. Yukarıdaki 'make install' bunu sizin yerinize yapmıştır
ama emin olmak için siz yine de bir bakın.
LoadModule php5_module modules/libphp5.so
15. Apache'ye belli dosya uzantılarını PHP uzantıları olarak ele almasını
söyleyin. Örneğin, .php uzantılı dosyaları Apache'nin PHP dosyaları
olarak ele almasını isteyebiliriz. Apache AddType yönergesini kullanmamak
suretiyle, PHP tarafından çalıştırılmak üzere istismar.php.jpg gibi
dosyaların oluşturulması ve yüklenmesi gibi tehlikeli durumlardan
kaçınmak isteyebilirsiniz. Biz örnek olsun diye .phtml uzantısını
ekledik. Başka uzantıları da buraya ekleyebilirsiniz. Bunları aralarında
boşluk bırakarak aynı satıra yazabilirsiniz.
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Veya .php, .php2, .php3, .php4, .php5, .php6 ve .phtml gibi dosyalar
dışında hiçbir dosyanın PHP tarafından çalıştırılmamasını şöyle
sağlayabilirsiniz:
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
PHP kaynak kodlarını renklendirilmiş olarak göstermek için .phps
uzantısını da yapılandırmanıza ekleyebilirsiniz. Bu, şöyle yapılır:
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
.php dosyalarının uzantılarını .phps olarak değiştirmeden kaynak kodlarını
renklendirilmiş olarak göstermek isterseniz bunu şöyle yapabilirsiniz:
RewriteEngine On
RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
PHP kaynak süzgeci, gizli kalması gereken bilgiler içeren genel kullanıma
açık sunucularda kullanılmamalıdır. Aksi takdirde gizli kalması gereken
bilgiler kaynak koda eklenebilir.
16. Artık Apache'yi başlatabilirsiniz. Bunun için Apache'yi her zaman ki gibi
başlatmanız yetecektir:
/usr/local/apache2/bin/apachectl start
- VEYA -
service httpd restart
Yukarıdaki adımları izleyerek PHP'nin bir SAPI modülü olarak çalıştığı bir Apache 2 HTTP sunucusuna sahip olursunuz. Apache ve PHP için şüphesiz birçok farklı yapılandırma seçeneği vardır. Yapılandırma seçeneklerinin listesi için her kaynak ağacında ./configure --help çalıştırabilirsiniz.
Apache derlenirken prefork MPM modülü yerine , worker MPM modülü seçilerek çok evreli derlenebilir. Bunu yapmak için 6. şıkta derleme seçeneklerinize şu seçeneğini ekleyebilirsiniz:
Bunu yapmadan önce, bunun olası sonuçları hakkında bilgi sahibi olmaya, azından ne gibi etkilerinin olacağını anlamaya çalışın. Bu konuda daha ayrıntılı bilgi edinmek için Apache HTTP sunucusunun belgelerinden » Çok Süreçlilik Modülleri (MPM'ler) belgesini okuyunuz.
Bilginize: İçerik dili uzlaşımı kullanmak isterseniz Apache MultiViews SSS'ine bakınız.
Bilginize: Ayrıca, PHP'yi deneysel Zend Thread Safety (ZTS) motoru ile de derleyebilirsiniz. Böyle bir yapılandırmada bütün eklentiler kullanılamayacaktır. Bu bakımdan Apache'yi standart prefork MPM'si ile derlemenizi öneriyoruz.
Bu bölüm PHP'nin Unix sistemlerde Lighttpd 1.4 ile kurulumu hakkında bilgiler ve ipuçları içerir.
Lütfen devam etmeden önce » Lighttpd redmine sitesini ziyaret edip Lighttpd'nin doğru düzgün nasıl kurulacağını öğreniniz.
PHP ve Lighttpd'ye bağlanmak için tercih edilen SAPI Fastcgi'dir. Fastcgi, PHP 5.3'te php-cgi'yi özdevinimli olarak sihirli bir şekilde etkin kılar. Fakat, eski sürümler için PHP'nin --enable-fastcgi ile derlenmesi gerekir. PHP'nin fastcgi için hazır olduğunu doğrulamak için php -v çıktısının PHP 5.2.5 (cgi-fcgi) içermesi gerekir. PHP 5.2.3 öncesinde, fastcgi, php çalıştırılabiliri üzerinde etkindi (php-cgi diye birşey yoktu).
Lighttpd'nin PHP'ye bağlanmasını ve fastcgi süreçlerini çatallamasını sağlamak üzere yapılandırmak için lighttpd.conf dosyasını düzenlemeniz gerekir. Fastcgi süreçlerine yerel sistemden bağlanmak için soketler tercih edilir.
Örnek 1 - lighttpd.conf'tan bir bölüm
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
((
"socket" => "/tmp/php.socket",
"bin-path" => "/usr/local/bin/php-cgi",
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"min-procs" => 1,
"max-procs" => 1,
"idle-timeout" => 20
))
)
bin-path yönergesi lighttpd'nin fastcgi süreçlerini devingen
olarak çatallamasına izin verir. PHP kendi çocuklarını PHP_FCGI_CHILDREN
ortam değişkenine göre çatallayacaktır. PHP, PHP_FCGI_MAX_REQUESTS
değerinin aşılmasına sebep olan çocuk süreci öldürür. PHP'de
min-procs ve max-procs yönergelerinden genel
olarak kaçınılması gerekir. PHP kendi çocuklarını yönetir ve makine kodu
önbelleklerini APC gibi çocukları arasında paylaştırır.
min-procs yönergesine 1'den büyük bir değer atanmışsa PHP
yanıtçılarının sayısı PHP_FCGI_CHILDREN değerinin katları olacaktır (2
min-procs * 16 çocuk eşittir 32 yanıtçı).
Lighttpd, fastcgi süreçlerinin çatallanmasını kolaylaştırmak için spawn-fcgi adında bir programla gelir.
Süreçleri spawn-fcgi kullanmaksızın çatallamak mümkünse de, biraz ağır kaldırma çalışmak gerekir. Gelen istekleri karşılamak için PHP'nin kaç çocuk çatallayacağı PHP_FCGI_CHILDREN ortam değişkeni ile belirlenir. PHP'nin her çocuğunun kaç isteklik yaşayacağını ise PHP_FCGI_MAX_REQUESTS belirler. Aşağıda, PHP yanıtçılarının çatallanmasına yardımcı olan basit bir bash betiği verilmiştir.
Örnek 2 - FastCGI Yanıtçılarının Çatallanması
#!/bin/sh
# php-cgi çalıştırılabilirinin yeri
PHP=/usr/local/bin/php-cgi
# PID dosyasının yeri
PHP_PID=/tmp/php.pid
# Dinlenecek adres
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Dinlenecek soket
FCGI_BIND_ADDRESS=/tmp/php.sock
PHP_FCGI_CHILDREN=16
PHP_FCGI_MAX_REQUESTS=10000
env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \
PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \
$PHP -b $FCGI_BIND_ADDRESS &
echo $! > "$PHP_PID"
Uygulamaları dengelemek için Fastcgi örnekleri çok sayıda uzak makineye çatallanabilir.
Örnek 3 - Uzak FCGI örneklerine bağlanmak
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)
PHP, » Caudium HTTP Sunucusu için bir Pike modülü olarak derlenebilir. PHP'yi Caudium ile kullanmak için aşağıdaki basit kurulum adımlarını izleyerek kurabilirsiniz:
Örnek 1 Caudium Kurulum Adımları
1. PHP 4 kurulumuna başlamadan önce Caudium kurulmuş olmalıdır. PHP 4'ün
düzgün çalışması için Pike 7.0.268 veya daha yenisi gerekir. Bu örneğin
amaçları gereği, Caudium'un /opt/caudium/server/ altında kurulu olduğunu
varsayacağız.
2. php-x.y.z (x.y.z sürüm numarasıdır) dizinine geçin.
3. ./configure --with-caudium=/opt/caudium/server
4. make
5. make install
6. Çalışmaktaysa Caudium'u yeniden başlatın.
7. Çizgesel kurulum arayüzüne oturum açın ve PHP 4 desteği vermek istediğiniz
sanal sunucuya gidin.
8. Add Module'e tıklayın ve PHP4 Betik Destek modülünü bulup ekleyin.
9. Eğer belgeler, PHP 4 yorumlayıcısının kullanılabilir durumda olmadığını
söylüyorsa sunucuyu yeniden başlatmamış olabilirsiniz, yeniden başlatmayı
deneyin. PHP4.so ile ilgili hatalar için
/opt/caudium/logs/debug/default.1'e bakın. Ayrıca,
caudium/server/lib/[pike-version]/PHP4.so
dosyasının varlığından emin olun.
10. Gerekirse PHP Betik Destek modülünü yapılandırın.
Şüphesiz, Caudium modülünüzü PHP 4'te mevcut çeşitli eklentileri desteklemesi için derleyebilirsiniz. Eklentilere özel yapılandırma seçenekleri için eklenti belgelerine bakınız.
Bilginize: PHP 4'ü MySQL desteği ile derlerken normal MySQL istemci kodunun kullanıldığına emin olun. Aksi takdirde, Pike, MySQL desteğine sahipse çelişkili durumlar ortaya çıkabilir. MySQL kurulum dizinini --with-mysql seçeneği ile belirterek bunu sağlayabilirsiniz.
PHP'yi bir fhttpd modülü olarak derlemek için "Build as an fhttpd module?" sorusuna "yes" yanıtı verip (yapılandırmada --with-fhttpd=DİZİN seçeneği) fhttpd kaynak kök dizinini belirtin. /usr/local/src/fhttpd dizini öntanımlıdır. fhttpd ile çalışırsa PHP'yi bir modül olarak derlemek daha iyi denetim ve uzaktan yönetim yeteneği ile daha yüksek başarım sağlar.
Bilginize: PHP 4.3.0'dan itibaren fhttpd desteklenmemektedir.
Bu bölümde, PHP'nin Sun Solaris üzerinde Sun Java Sistem, Sun ONE, iPlanet ve Netscape HTTP Sunucusu kurulumlarına özgü bilgilere ve ipuçlarına yer verilmiştir.
PHP 4.3.3'ten itibaren PHP betikleri NSAPI modülü ile kullanılarak özel dizin listeleri ve hata sayfaları üretebilebilmektedir. Apache uyumluluğu sağlamak için ek işlevler de mevcuttur. Mevcut HTTP sunucuları desteği hakkında bilgi edinmek için alt istekler ile ilgili bölümü okuyunuz.
Netscape Girişimci Sunucusu (NES) için PHP yapılandırması hakkında daha ayrıntılı bilgiyi » http://benoit.noss.free.fr/php/install-php4.html adresinde bulabilirsiniz.
PHP'yi Sun Java Sistem, Sun ONE, iPlanet ve Netscape HTTP sunucularında derlemek için, kurulum dizinini --with-nsapi=[DiZiN] seçeneği ile belirtin; öntanımlı dizin: /opt/netscape/suitespot/. Ayrıca /php-xxx-version/sapi/nsapi/nsapi-readme.txt dosyasını da okuyun.
Aşağıdaki paketleri » http://www.sunfreeware.com/ veya başka bir siteden indirip kurabilirsiniz:
export PATH
ile sisteminizde kullanılabilir
olmasını sağlayın.
gunzip php-x.x.x.tar.gz
(.gz paketi değilse 4'e gidin).
tar xvf php-x.x.x.tar
cd ../php-x.x.x
Netscape sunucunuz /opt/netscape/suitespot/ dizininde kurulu değilse, aşağıdaki seçeneğe bulunduğu yeri yazın:
./configure --with-mysql=/usr/local/mysql \
--with-nsapi=/opt/netscape/suitespot/ \
--enable-libgcc
Temel kurulum bitip ilgili benioku dosyalarını da okuduktan sonra bir kaç adımlık yapılandırma işlemi kalmış olacak.
Öncelikle, sunucunun bütün paylaşımlı kütüphaneleri bulabilmesi için bazı dizinleri LD_LIBRARY_PATH ortam değişkenine eklemeniz gerekebilir. Bunun yapılacağı en uygun yer HTTP sunucunuzu başlatan betiktir. Bu betik genellikle, /bir/yol/server/https-sunucuismi/start gibi bir dosyadır. HTTP sunucunuzun /bir/yol/server/https-sunucuismi/config/ dizininde yer alan yapılandırma dosyalarını da düzenlemeniz gerekecek.
Aşağıdaki satırı mime.types dosyasına ekleyin (bunu yönetim sunucusunda yapabilirsiniz):
type=magnus-internal/x-httpd-php exts=php
magnus.conf (>= 6 sürümü sunucular için) veya obj.conf (< 6 sürümü sunucular için) dosyalarını düzenlemek için açın ve aşağıdaki satırları mime types init satırının sonrasına ekleyin. shlib (paylaşımlı kütüphane) sisteminize göre değişiklik gösterebilir, genellikle /opt/netscape/suitespot/bin/libphp4.so gibi bir dosyadır.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="/opt/netscape/suitespot/bin/libphp4.so" Init fn="php4_init" LateInit="yes" errorString="PHP ilklendirilemedi!" [php_ini="/bir/yol/php.ini"]
(PHP >= 4.3.3) php_ini değiştirgesi isteğe bağlı olsa da oraya HTTP sunucunuzun yapılandırma dizininde bulunan php.ini dosyanızı yerleştirebilirsiniz.
obj.conf dosyasındaki öntanımlı nesneyi yapılandırın (vserver.obj.conf dosyasında sanal sunucu sınıfları [sürüm 6.0+] için):
<Object name="default"> . . . .#DiKKAT: Bu satır tüm 'ObjectType' satırlarından sonra ve .# tüm 'AddLog' satırlarından önce yer almalıdır. Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] . . </Object>
(PHP >= 4.3.3) Bazı özel php.ini değerlerini ek değiştirgeler olarak ekleyebilirsiniz, örneğin php4_execute çağrısı bağlamına özgü docroot="/bir/yol/docroot" atamasını yapabilirsiniz. Mantıksal ini yönergeleri için lütfen "On","Off",... değil (çünkü doğru çalışmayacaktır), 0 ve 1 değerlerini kullanınız. Örneğin, zlib.output_compression="On" yerine zlib.output_compression=1 yazın.
Bu sadece, içinde PHP betiklerinden başka dosya bulunmayan (bir cgi-bin dizini gibi) bir dizini yapılandırmak istediğiniz takdirde gerekir :
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Bundan sonra, Yönetim sunucusunda bir dizini yapılandırıp ona x-httpd-php MIME türünü atayabilirsiniz. Bu dizindeki tüm dosyalar PHP tarafından çalıştırılacağından oradaki dosyaların uzantılarını .html olarak değiştirip PHP kullanıldığını gizleyebilirsiniz.
Kimlik doğrulama ayarları: PHP kimlik doğrulaması diğer kimlik doğrulamalarıyla kullanılamaz. Bu işlem tamamen PHP betikleriniz üzerinden geçer. PHP kimlik doğrulamasını sunucunun tamamı için yapılandırmak isterseniz aşağıdaki satırı öntanımlı nesnenize ekleyiniz:
<Object name="default"> AuthTrans fn=php4_auth_trans . . . </Object>
PHP kimlik doğrulamasını tek bir dizin için kullanmak istiyorsanız şunu ekleyin:
<Object ppath="d:\kimlik\dogrulaması\yapilacak\dizin\*"> AuthTrans fn=php4_auth_trans </Object>
Bilginize: PHP'nin kullanacağı yığıt boyutu HTTP sunucusunun yapılandırmasına bağlıdır. Çok büyük PHP betiklerinin çalışmaması halinde Yönetim sunucusundan ("MAGNUS EDITOR" bölümünden) boyutu arttırmanızı öneririz.
Bir Sun JSWS/Sun ONE WS/iPlanet/Netscape sunucusu çok evreli bir HTTP sunucusu olarak çalıştığı takdirde PHP betiklerinin yazımı özel bir dikkat gerektirir. Bunun sebebi, tüm isteklerin aynı süreç uzayında (HTTP sunucusunun kendi uzayı) çalışması ve bu uzayın (ortam değişkenlerince) tek bir ortama sahip olmasıdır. PATH_INFO, HTTP_HOST gibi CGI ortam değişkenlerini almak isterseniz, bunu getenv() işlevli eski PHP yöntemleriyle veya benzer yollarla ($_ENV gibi küresellerle) yapmaya çalışmak doğru değildir. Geçerli CGI değişkenleri olmaksızın sadece çalışan HTTP sunucusunun ortamını alırsınız!
Bilginize: Soru: Ortamda neden (geçersiz) CGI değişkenleri var?
Yanıt: Bunun sebebi, HTTP sunucusu sürecini Yönetim sunucusundan başlatmanız ve başlatma betiğinin bir CGI betiği olarak çalışmasıdır (yönetim sunucusu içinde bir CGI betiği!!). Başlatılan HTTP sunucusunun bazı CGI ortam değişkenlerine sahip olmasının sebebi budur. HTTP sunucusunu yönetim sunucusunun dışında çalıştırırsanız bunun sebebini daha iyi anlarsınız. HTTP sunucusunu root kullanıcısı olarak komut satırından kendiniz başlatın ve ortamda artık CGI tarzı ortam değişkenlerinin bulunmadığını görün.
CGI değişkenlerini doğru yöntemle almak için betiklerinizde değişiklik yapmalısınız. PHP 4'te bu işlem için $_SERVER süper küreselini kullanabilirsiniz. $HTTP_HOST gibi değişkenleri kullanan eski betikleriniz varsa php.ini içinde register_globals=On yaptıktan başka değişken sırasını da değiştirin (önemli: Artık ortama ihtiyacınız olmayacağından "E"yi silin):
variables_order = "GPCS" register_globals = On
"404 Not Found" ve benzeri durumlarda hata sayfaları üretimi için PHP'yi kullanabilirsiniz. Üzerine yazmak istediğiniz her hata sayfası için obj.conf dosyasındaki nesneye aşağıdaki satırı ekleyiniz:
Error fn="php4_execute" code=XXX script="/bir/yol/betik.php" [inikey=value inikey=value...]
Burada XXX, HTTP hata kodudur. Sizinkiyle çelişen başka Error yönergeleri varsa onları silin. Tüm hatalar için hep aynı sayfayı kullanacaksanız code değiştirgesini belirtmeyin. Betiğiniz hata kodunu $_SERVER['ERROR_TYPE'] ile alacaktır.
Bir diğer olanak, özel yapım dizin listeleri üretimidir. Dizin içeriğini gösteren bir PHP betiği yazdıktan sonra, obj.conf dosyasında öntanımlı type="magnus-internal/directory" Service satırını şöyle değiştirin:
Service fn="php4_execute" type="magnus-internal/directory" script="/bir/yol/betik.php" [inikey=value inikey=value...]
Hata sayfaları ve dizin listeleri için özgün yol ve dönüşmüş yol $_SERVER['PATH_INFO'] ve $_SERVER['PATH_TRANSLATED'] değişkenlerinden alınabilir.
NSAPI modülü, HTTP sunucusunda alt istekler yapmak ve sonuçları bir sayfaya yerleştirmek için artık nsapi_virtual() işlevine sahiptir (rumuz: virtual()). Bu işlev NSAPI kütüphanesinin bazı belgelenmemiş özelliklerini kullanır. Unix üzerinde modül özdevinimli olarak gerekli işlevlerin varlığını araştırır ve kullanılabilecekse kullanır. Aksi takdirde, nsapi_virtual() iptal edilir.
Bilginize: ÖNEMLİ: nsapi_virtual() desteği DENEYSEL'dir!!!
PHP'yi bir CGI programı olarak derlemek öntanımlıdır. Bu sayede HTTP sunucuda çalışmayacak betikleri yorumlamak için veya CGI işlemleri için kullanılabilecek bir komut satırı yorumlayıcısı oluşturulmuş olur.PHP'nin bir modül olarak çalıştığı bir HTTP sunucusu genellikle başarım sorunlarına bir çözüm olarak kullanılır. Bununla birlikte, CGI sürümü, farklı PHP sayfalarını farklı kullanıcı kimlikleriyle çalıştırabilme imkanı sunar.
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
PHP 4.3.0 ve sonrasında, PHP'ye bazı önemli eklemeler yapıldı. Ayrıca, CGI çalıştırılabiliri ile aynı isimde çalıştırılabilire sahip CLI adında yeni bir SAPI geldi. {PREFIX}/bin/php çalıştırılabilirinde kurulu olan şeyler yapılandırmanızı nasıl yaptığınıza bağlıdır ve bu, PHP'nin komut satırından kullanımı bölümünde ayrıntılı olarak açıklanmıştır.
PHP'yi bir CGI programı olarak derlediyseniz, derlemenizi make test komutunu vererek sınayabilirsiniz. Derlemenizi sınamak daima iyidir. Bu yolla sonradan karşılaşabileceğiniz sorunları daha ortaya çıkmadan yakalama şansınız olur.
Bazı sunucu kaynaklı ortam değişkenleri geçerli » CGI/1.1 belirtiminde tanımlanmamıştır; sadece şu değişkenler tanımlıdır: AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL ve SERVER_SOFTWARE. Bunların dışında kalan herşey 'üretici eklentileri' olarak ele alınmalıdır.
Bu bölüm PHP'nin HP-UX sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.
PHP'nin HP-UX sistemlere kurulumunda iki seçenek söz konusudur: Ya kendiniz derlersiniz ya da bir başkasının derlediği çalıştırılabiliri kurarsınız.
Resmi derlenmiş paketleri » http://software.hp.com/ adresinden edinebilirsiniz.
Kılavuzun bu bölümü yazılana kadar, PHP'nin (ve ilgili eklentilerin) HP-UX sistemlerde derlenmesi ile ilgili belgeler kaldırılmıştı. Bunları artık bir dış kaynaktan okuyabileceksiniz: » Building Apache and PHP on HP-UX 11.11
Bu bölüm PHP'nin » OpenBSD 3.6 sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.
PHP'yi OpenBSD üzerine kurmak için ikil paketlerin kullanımı en basit ve önerilen bir yoldur. Temel paket, modül paketlerinden ayrıdır ve her modül paketi diğerlerinden bağımsız olarak kurulup kaldırılabilir. İhtiyaç duyacağınız dosyaları OpenBSD CD'nizde veya FTP sitesinde bulabilirsiniz.
İhtiyacınız olan ana paket php4-core-4.3.8.tgz olup, temel motoru (artı gettext ve iconv) içerir. Modül paketleri ise php4-mysql-4.3.8.tgz veya php4-imap-4.3.8.tgz gibi isimler alırlar. Bu modülleri php.ini dosyanızda etkin ve etkisiz kılmak için phpxs komutuna ihtiyacınız olacak.
Örnek 1 - OpenBSD Paket Kurulum Örneği
# pkg_add php4-core-4.3.8.tgz # /usr/local/sbin/phpxs -s # cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini (add in mysql) # pkg_add php4-mysql-4.3.8.tgz # /usr/local/sbin/phpxs -a mysql (add in imap) # pkg_add php4-imap-4.3.8.tgz # /usr/local/sbin/phpxs -a imap (remove mysql as a test) # pkg_delete php4-mysql-4.3.8 # /usr/local/sbin/phpxs -r mysql (install the PEAR libraries) # pkg_add php4-pear-4.3.8.tgz
OpenBSD'deki ikil paketler hakkında ayrıntılı bilgi edinmek için » packages(7) kılavuz sayfasını okuyunuz.
Ayrıca, PHP'yi kaynak paketinden » port ağacını kullanarak da derleyebilirsiniz. Ancak, bu sadece OpenBSD üzerinde tecrübeli kullanıcılar için önerilebilecek bir yoldur. PHP4 portu iki alt dizine ayrılır: çekirdek ve eklentiler. Eklentilerin bulunduğu dizin desteklenen tüm PHP modülleri için alt paketler üretir. Bu modüllerden üretilmesini istemedikleriniz için no_* FLAVOR'unu kullanınız. Örneğin imap modülünün derlenmeden geçilmesi için FLAVOR'a no_imap atayınız.
OpenBSD'nin eski dağıtımları PHP'yi duruk ilintili derlemek için FLAVORS sistemini kullanırlar. Bu yöntemle ikil paketleri üretmek zor olduğundan artık bu yol önerilmemektedir. İsterseniz hala eski port ağaçlarını kullanabilirsiniz fakat OpenBSD ekibi tarafından artık desteklenmemektedirler. Bu konuda fikirleriniz varsa port'un şu anki sürdürücüsü: Anil Madhavapeddy (avsm at openbsd dot org).
Bu bölüm PHP'nin Solaris sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.
Solaris kurulumlarında sıklıkla C derleyicilerin ve bunlarla ilgili araçların yokluğu sözkonusu olur. Bu araçların GNU sürümlerinin gerekliliği hakkında bilgi edinmek için lütfen SSS'nin bu bölümünü okuyunuz. Gereken yazılımlar:
Bunlara ek olarak, Oracle veya MySQL gibi yapılandırmanıza özgü bir takım ek yazılımların kurulması da gerekebilir.
Kurulması gereken bileşinlerin çoğunu kurmak için pkgadd kullanarak Solaris kurulum işlemlerini kolaylaştırabilirsiniz.
Bu bölüm Unix sistemlerde PHP'nin » Debian GNU/Linux kurulumu hakkında bilgiler ve ipuçları içerir.
PHP'nin Unix üzerinde derlenmesi ile ilgili talimatlar Debian için de geçerli olsa da bu kılavuz sayfasında ayrıca, hem apt-get hem de aptitude komutlarının kullanımı gibi diğer seçeneklere özgü bilgilere de yer verilmiştir. Bu kılavuz sayfasında bu iki komut kimi zaman diğerinin yerine kullanılmıştır.
Öncelikle dikkat edeceğiniz şey, Apache2 ile tümleştirmek için libapache2-mod-php5 ve PEAR ile tümleştirmek için php-pear gibi PHP ile ilgili diğer paketlerinde gerekli olabileceğidir.
İkinci olarak, bir paketi kurmadan önce paket listesini güncellemeniz yerinde bir hareket olacaktır. Bu işlem genellikle apt-get update komutu çalıştırılarık yapılır.
Örnek 1 - Apache2 ile kurulum örneği
# apt-get install php5-common libapache2-mod-php5 php5-cli
APT, Apache2 için hazırlanmış PHP 5 modülünü ve bu modülü etkinleştirmek için bağımlı olduğu diğer paketleri özdevinimli olarak kuracaktır. Yapılan değişikliğin geçerli olması için Apache2 yeniden başlatılmalıdır. Örnek:
Artık herşey yerli yerine oturduğuna göre aşağıdaki örneği izleyerek Apache ve PHP'yi kurabilirsiniz:
Örnek 2 - PHP kurulduktan sonra Apache2'nin dirdirilip yeniden başlatılması
# /etc/init.d/apache2 stop # /etc/init.d/apache2 start
Bir önceki bölümde PHP sadece çekirdek modüllerle kurulmuştu. Çok geçmeden MySQL, cURL, GD ve benzeri modülleri etkinleştirme ihtiyacı duyabilirsiniz. Bunları da apt-get komutuyla kurabilirsiniz.
Örnek 3 - Ek PHP 5 paketleri listesinin alınma yöntemleri
# apt-cache search php5 # aptitude search php5 # aptitude search php5 |grep -i mysql
Bu örnek komutların çıktısından da görebileceğiniz gibi, php5-cgi, php5-cli ve php5-dev gibi özel paketlerde dahil olmak üzere kurabileceğiniz çok sayıda PHP modülü vardır. Listeyi dikkatlice inceleyip ihtiyacınız olanları seçtikten sonra apt-get veya aptitude ile bunları kurabilirsiniz. Debian bunlar içinde bağımlılık denetimleri yapacağından, örneğin MySQL ve cURL kurmak istediğinizde bunların bağımlı olduğu paketleri de kurmayı teklif edecektir:
Örnek 4 - MySQL ve cURL PHP modüllerinin kurulumu
# apt-get install php5-mysql php5-curl
APT özdevinimli olarak farklı php.ini (/etc/php5/apache2/php.ini, /etc/php5/conf.d/pdo.ini ve benzeri) dosyalarına uygun satırları ve eklentinin türüne bağlı olarak extension=foo.so benzeri girdileri ekleyecektir. Bu değişikliklerin de etkili olabilmesi için Apache2'nin yeniden başlatılması gerekir.
Bu bölümde, PHP'nin Mac OS X üzerindeki kurulumlarına özgü bilgilere ve ipuçlarına yer verilmiştir. Mac OS X'in birbirlerinden pek az farklı iki sürümü vardır: İstemci ve Sunucu. Burada PHP'nin her iki sisteme de kurulumundan bahsedilecektir. PHP'nin MacOS 9 ve öncesinde kullanılamadığına dikkat ediniz.
PHP'nin Mac OS X için bir kaç tane paketlenmiş ve derlenmiş sürümü vardır. Standart bir yapılandırma için bunlar yeterlidir, ancak farklı özelliklere ihtiyaç duyarsanız (güvenli sunucu, farklı bir veritabanı sürücüsü gibi), kendi PHP'nizi ve/veya HTTP sunucunuzu derlemeniz gerekebilir. Bu işleri yapacak tecrübeniz yoksa, sizin ihtiyaçlarınıza uygun olarak derlenmiş paketlerin olup olmadığını araştırmalısınız.
Aşağıdakiler, Mac OS üzerinde PHP için paket ve derlenmiş ikillerin kurulumunu kolaylaştıracaktır:
OS X'in 10.0.0 sürümünden itibaren PHP Meklerde standart hale geldi. PHP'yi öntanımlı HTTP sunucusunda etkin kılmak için Apache yapılandırma dosyası httpd.conf'ta bir kaç satırı etkin duruma getirmek gerekir, bunun yanında CGI ve/veya CLI öntanımlı olarak etkin (Terminal programından kolayca erişilebilir) kılınabilir.
Aşağıdaki talimatları kullanarak PHP'yi etkin kılmak demek çabucak bir yerel geliştirme ortamına sahip olmak demektir. Daima PHP'nin en yeni sürümünü kullanmanızı hararetle öneririz. Gelişimi sürmekte olan çoğu yazılım gibi yeni sürümlerde eski hatalar sürekli düzeltilmekte ve yeni özellikler eklenmektedir. Ayrıntılar için MAC OS X kurulum belgelerine bakınız. Aşağıdaki talimatların ayrıntı düzeyi başlangıç düzeyinde bir kullanıcıya göre olup öntanımlı ayarlarla çalışmak üzere düzenlenmiştir. Daha yeni sürümlerin derlenmesi veya daha yeni paketlerin kurulması tüm kullanıcılara tavsiye edilmektedir.
Standard kurulum türü mod_php kullanmak olup Mac OS X üzerinde Apache HTTP Sunucusu için mod_php'yi etkin kılmak (öntanımlı HTTP sunucusuna Sistem Tercihlerinden erişilebilir) amacıyla şu adımlar izlenmelidir:
Bilginize: Dosyayı açmanın tek yolu Terminal'de nano gibi Unix temelli bir metin düzenleyici kullanmaktır. Dosyanın sahibi root olduğundan dosyayı (root olarak) açmak için Terminal'de sudo komutunu kullanmalıyız (root parolası istenecektir): sudo nano /etc/apache2/httpd.conf Önemli nano komutları: ^w (arama), ^o (kayıt), and ^x (çıkış). Burada ^ imi, Ctrl tuşu anlamındadır.
Bilginize: Mac OS X'in 10.5'ten önceki sürümleri PHP ve Apache'nin eski sürümleriyle gelir. Böyle makinelerde Apache yapılandırma dosyası /etc/httpd/httpd.conf olabilir.
Bir metin düzenleyici ile aşağıdaki satırların başlarındaki # imlerini kaldırın (bu iki satır genelde birarada değildir, onları arayıp bulmalısınız):
# LoadModule php5_module libexec/httpd/libphp5.so # AddModule mod_php5.c
PHP olarak yorumlanacak uzantıları belirleyiniz (örnekler: .php .html ve .inc)
(Mac Panther'den itibaren) httpd.conf dosyasında bulunan aşağıdaki deyimden dolayı PHP etkin kılındığı anda .php uzantılı dosyalar özdevinimli olarak PHP tarafından yorumlanır.
<IfModule mod_php5.c>
# php etkinse, .php ve .phps dosyalarını yorumlasın isteriz.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# Çoğu kullanıcı index.php'yi ister
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
Bilginize: OS X 10.5 (Leopard) öncesinde, PHP 5 yerine PHP 4 kullanılırdı; dolayısıyla yukarıdaki 5'leri 4'lere çevirmeniz gerekir.
phpinfo() işlevi PHP ile ilgili bilgileri gösterir. Aşağıdaki içeriğe sahip bir dosyayı belge kök dizininde oluşturun:
<?php phpinfo(); ?>
CLI (veya eski sürümlerde CGI) çalıştırılabilirinin ismi php olup genellikle bulunduğu yer /usr/bin/php'dir. PHP kılavuzunun komut satırı bölümünü okuyun ve Terminal'i açıp PHP çalıştırılabilirinin sürümünü öğrenmek için php -v komutunu çalıştırın. phpinfo() işlevine yapılacak bir çağrı da bu bilgiyi gösterecektir.
Tar paketlerini açıp aşağıdaki gibi Apache configure betiğini çalıştırın:
./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache
Derleyicinin bazı en iyilemeler yapmasını isterseniz şu satırı da ekleyebilirsiniz:
setenv OPTIM=-O2
PHP 4 kaynak dizinine geçin ve PHP'yi yapılandırın:
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--mandir=/usr/share/man \
--with-xml \
--with-apache=/src/apache_1.3.12
Başka eklentilerin de (MySQL, GD, ve benzeri) kurulmasını istiyorsanız onları da buraya ekleyin. --with-apache seçeneğine Apache kaynak dizininizi yazın (örn, /src/apache_1.3.12).
Artık Apache'yi PHP 4 ile birlikte yeniden derleyebilirsiniz:
./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache \ --activate-module=src/modules/php4/libphp4.a
libmodphp4.a dosyasının güncel olmadığına dair bir hata iletisi alabilirsiniz. Bu durumda, Apacha kaynak ağacının src/modules/php4 dizinine geçip şu komutu verin: ranlib libmodphp4.a. Bu, ilintileme tablosunu güncel hale getirecektir. Ardından kaynak ağacının kök dizinine dönüp yukarıdaki configure komutunu tekrar çalıştırın. Ardından tekrar make ve make install yapın.
cp php.ini-development /usr/local/bin/php.ini
veya (/usr/local dizinine kurmuyorsanız)
cp php.ini-development /usr/bin/php.ini
.
Aşağıdaki talimatlar MacOS X'de bir PHP modülünü Apache HTTP sunucusuna kurmanıza yardımcı olacak. Bu sürüm MySQL, PostgreSQL ve iODBC veritabanlarından başka, cURL, GD, PDFLib, LDAP, vs. desteğini de içermektedir. Bu talimatlar » Marc Liyanage tarafından sağlanmıştır.
Bunu yaparken dikkatli olun, yoksa Apache HTTP sunucunuzu bozabilirsiniz!
Bilginize: Bu talimatlar sadece Apple tarafından dağıtılan özgün Apache HTTP sunucusunda çalışır. Apache’yi günceller veya yeniden derlerseniz PHP modülünü de yeniden derleyip kurmanız gerekir.
Kurulumu gerçekleştirmek için:
wget http://www2.entropy.ch/download/entropy-php-5.2.4-1.tar.gz
wget
http://www2.entropy.ch/download/entropy-php-5.2.4-1-apache2.tar.gz
Hepsi bu kadar! Artık PHP çalışıyor olmalı. Bunu ev dizininizdeki Sites dizinine dnm.php adında bir dosyayı yerleştirip deneyebilirsiniz. Bu dosyaya şu satırı yazın: <?php phpinfo() ?>
Şimdi tarayıcınızda 127.0.0.1/~kullanıcı_adınız/dnm.php sayfasını açın. PHP modülünüz hakkında bilgi içeren bir durum tablosu görüyor olmalısınız.
Bu bölümdeki bilgiler Windows 98/Me ve Windows NT/2000/XP/2003 içindir. PHP, Windows 3.1 gibi 16 bitlik platformlarda çalışmaz ve bazen desteklenen Windows platformlarından Win32 olarak bahsederiz. Windows 95, PHP 4.3.0'dan beri desteklenmemektedir.
Bilginize: Windows 98/ME/NT4, PHP 5.3.0'dan beri desteklenmemektedir.
Bilginize: Windows 95, PHP 4.3.0'dan beri desteklenmemektedir.
PHP'yi Windows'a kurmanın başlıca iki yolu vardır: Ya el yordamıyla kurarsınız ya da kurucuyu kullanırsınız.
Microsoft Visual Studio'ya sahipseniz PHP'yi kaynak kodundan da derleyebilirsiniz.
PHP'yi Windows sisteminize kurduktan sonra çeşitli eklentiler yüklemek suretiyle işlevselliğini arttırabilirsiniz.
Genel Ağ'da çeşitli hepsibiyerde kurucular bulabilirsiniz fakat bunların hiçbiri PHP.net tarafından desteklenmez. Sisteminizin güvenliği ve verimliliği açısından en iyi seçimin » http://www.php.net/downloads.php adresinden edinebileceğiniz resmi Windows paketleri olduğuna inanıyoruz.
The Windows PHP installer is available from the downloads page at » http://www.php.net/downloads.php. This installs the CGI version of PHP and for IIS, PWS, and Xitami, it configures the web server as well. The installer does not include any extra external PHP extensions (php_*.dll) as you'll only find those in the Windows Zip Package and PECL downloads.
Bilginize: While the Windows installer is an easy way to make PHP work, it is restricted in many aspects as, for example, the automatic setup of extensions is not supported. Use of the installer isn't the preferred method for installing PHP.
First, install your selected HTTP (web) server on your system, and make sure that it works.
Run the executable installer and follow the instructions provided by the installation wizard. Two types of installation are supported - standard, which provides sensible defaults for all the settings it can, and advanced, which asks questions as it goes along.
The installation wizard gathers enough information to set up the php.ini file, and configure certain web servers to use PHP. One of the web servers the PHP installer does not configure for is Apache, so you'll need to configure it manually.
Once the installation has completed, the installer will inform you if you need to restart your system, restart the server, or just start using PHP.
Be aware, that this setup of PHP is not secure. If you would like to have a secure PHP setup, you'd better go on the manual way, and set every option carefully. This automatically working setup gives you an instantly working PHP installation, but it is not meant to be used on online servers.
The Windows PHP installer for later versions of PHP is built using MSI technology using the Wix Toolkit (» http://wix.sourceforge.net/). It will install and configure PHP and all the built-in and PECL extensions, as well as configure many of the popular web servers such as IIS, Apache, and Xitami.
First, install your selected HTTP (web) server on your system, and make sure that it works. Then proceed with one of the following install types.
Run the MSI installer and follow the instructions provided by the installation wizard. You will be prompted to select the Web Server you wish to configure first, along with any configuration details needed.
You will then be prompted to select which features and extensions you wish to install and enable. By selecting "Will be installed on local hard drive" in the drop-down menu for each item you can trigger whether to install the feature or not. By selecting "Entire feature will be installed on local hard drive", you will be able to install all sub-features of the included feature ( for example by selecting this options for the feature "PDO" you will install all PDO Drivers ).
It is not recommended to install all extensions by default, since many other them require dependencies from outside PHP in order to function properly. Instead, use the Installation Repair Mode that can be triggered thru the 'Add/Remove Programs' control panel to enable or disable extensions and features after installation.
The installer then sets up PHP to be used in Windows and the php.ini file, and configures certain web servers to use PHP. The installer will currently configure IIS, Apache, Xitami, and Sambar Server; if you are using a different web server you'll need to configure it manually.
The installer also supports a silent mode, which is helpful for Systems Administrators to deploy PHP easily. To use silent mode:
msiexec.exe /i php-VERSION-win32-install.msi /q
You can control the install directory by passing it as a parameter to the install. For example, to install to e:\php:
msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
You can also specify what features to install. For example, to install the mysqli extension and the CGI executable:
msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli
The current list of Features to install is as follows:
MainExecutable - php.exe executable ( no longer available as of PHP 5.2.10/5.3.0; it is now included by default ) ScriptExecutable - php-win.exe executable ext_php_* - the various extensions ( for example: ext_php_mysql for MySQL ) apache13 - Apache 1.3 module apache20 - Apache 2.0 module apache22 - Apache 2,2 module apacheCGI - Apache CGI executable iis4ISAPI - IIS ISAPI module iis4CGI - IIS CGI executable iis4FastCGI - IIS CGI executable NSAPI - Sun/iPlanet/Netscape server module netserve - NetServe Web Server CGI executable Xitami - Xitami CGI executable Sambar - Sambar Server ISAPI module CGI - php-cgi.exe executable PEAR - PEAR installer Manual - PHP Manual in CHM Format
For more information on installing MSI installers from the command line, visit » http://msdn.microsoft.com/en-us/library/aa367988.aspx
To upgrade, run the installer either graphically or from the command line as normal. The installer will read your current install options, remove your old installation, and reinstall PHP with the same options as before. It is recommended that you use this method of keeping PHP updated instead of manually replacing the files in the installation directory.
This section contains instructions for manually installing and configuring PHP on Microsoft Windows. For the instructions on how to use PHP installer to setup and configure PHP and a web server on Windows refer to Windows Installer (PHP 5.2 and later).
Download the PHP zip binary distribution from » PHP for Windows: Binaries and Sources. There are several different versions of the zip package - chose the version that is suitable for the web server being used:
If PHP is used with IIS then choose PHP 5.3 VC9 Non Thread Safe or PHP 5.2 VC6 Non Thread Safe;
If PHP is used with Apache 1 or Apache 2 then choose PHP 5.3 VC6 or PHP 5.2 VC6.
Bilginize: VC9 Versions are compiled with the Visual Studio 2008 compiler and have improvements in performance and stability. The VC9 versions require you to have the » Microsoft 2008 C++ Runtime (x86) or the » Microsoft 2008 C++ Runtime (x64) installed.
Unpack the content of the zip archive into a directory of your choice, for example C:\PHP\. The directory and file structure extracted from the zip will look as below:
Örnek 1 PHP 5 package structure
c:\php | +--dev | | | |-php5ts.lib -- php5.lib in non thread safe version | +--ext -- extension DLLs for PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--extras -- empty | +--pear -- initial copy of PEAR | | |-go-pear.bat -- PEAR setup script | |-... | |-php-cgi.exe -- CGI executable | |-php-win.exe -- executes scripts without an opened command prompt | |-php.exe -- Command line PHP executable (CLI) | |-... | |-php.ini-development -- default php.ini settings | |-php.ini-production -- recommended php.ini settings | |-php5apache2_2.dll -- does not exist in non thread safe version | |-php5apache2_2_filter.dll -- does not exist in non thread safe version | |-... | |-php5ts.dll -- core PHP DLL ( php5.dll in non thread safe version) | |-...
Below is the list of the modules and executables included in the PHP zip distribution:
go-pear.bat - the PEAR setup script. Refer to » Installation (PEAR) for more details.
php-cgi.exe - CGI executable that can be used when running PHP on IIS via CGI or FastCGI.
php-win.exe - the PHP executable for executing PHP scripts without using a command line window (for example PHP applications that use Windows GUI).
php.exe - the PHP executable for executing PHP scripts within a command line interface (CLI).
php5apache2_2.dll - Apache 2.2.X module.
php5apache2_2_filter.dll - Apache 2.2.X filter.
After the php package content has been extracted, copy the php.ini-production into php.ini in the same folder. If necessary, it is also possible to place the php.ini into any other location of your choice but that will require additional configuration steps as described in PHP Configuration.
The php.ini file tells PHP how to configure itself, and how to work with the environment that it runs in. Here are a number of settings for the php.ini file that help PHP work better with Windows. Some of these are optional. There are many other directives that may be relevant to your environment - refer to the list of php.ini directives for more information.
Required directives:
extension_dir = <path to extension directory> - The extension_dir needs to point to the directory where PHP extensions files are stored. The path can be absolute (i.e. "C:\PHP\ext") or relative (i.e. ".\ext"). Extensions that are listed lower in the php.ini file need to be located in the extension_dir.
extension = xxxxx.dll - For each extension you wish to enable, you need a corresponding "extension=" directive that tells PHP which extensions in the extension_dir to load at startup time.
log_errors = On - PHP has an error logging facility that can be used to send errors to a file, or to a service (i.e. syslog) and works in conjunction with the error_log directive below. When running under IIS, the log_errors should be enabled, with a valid error_log.
error_log = <path to the error log file> - The error_log needs to specify the absolute, or relative path to the file where PHP errors should be logged. This file needs to be writable for the web server. The most common places for this file are in various TEMP directories, for example "C:\inetpub\temp\php-errors.log".
cgi.force_redirect = 0 - This directive is required for running under IIS. It is a directory security facility required by many other web servers. However, enabling it under IIS will cause the PHP engine to fail on Windows.
cgi.fix_pathinfo = 1 - This lets PHP access real path info following the CGI Spec. The IIS FastCGI implementation needs this set.
fastcgi.impersonate = 1 - FastCGI under IIS supports the ability to impersonate security tokens of the calling client. This allows IIS to define the security context that the request runs under.
fastcgi.logging = 0 - FastCGI logging should be disabled on IIS. If it is left enabled, then any messages of any class are treated by FastCGI as error conditions which will cause IIS to generate an HTTP 500 exception.
Optional directives
max_execution_time = ## - This directive tells PHP the maximum amount of time that it can spend executing any given script. The default for this is 30 seconds. Increase the value of this directive if PHP application take long time to execute.
memory_limit = ###M - The amount of memory available for the PHP process, in Megabytes. The default is 128, which is fine for most PHP applications. Some of the more complex ones might need more.
display_errors = Off - This directive tells PHP whether to include any error messages in the stream that it returns to the Web server. If this is set to "On", then PHP will send whichever classes of errors that you define with the error_reporting directive back to web server as part of the error stream. For security reasons it is recommended to set it to "Off" on production servers in order not to reveal any security sensitive information that is often included in the error messages.
open_basedir = <paths to directories, separated by semicolon>, e.g. openbasedir="C:\inetpub\wwwroot;C:\inetpub\temp". This directive specified the directory paths where PHP is allowed to perform file system operations. Any file operation outside of the specified paths will result in an error. This directive is especially useful for locking down the PHP installation in shared hosting environments to prevent PHP scripts from accessing any files outside of the web site's root directory.
upload_max_filesize = ###M and post_max_size = ###M - The maximum allowed size of an uploaded file and post data respectively. The values of these directives should be increased if PHP applications need to perform large uploads, such as for example photos or video files.
PHP is now setup on your system. The next step is to choose a web server, and enable it to run PHP. Choose a web server from the table of contents.
In addition to running PHP via a web server, PHP can run from the command line just like a .BAT script. See Command Line PHP on Microsoft Windows for further details.
This section contains notes specific to the ActiveScript installation.
ActiveScript is a Windows only SAPI that enables you to use PHP script in any ActiveScript compliant host, like Windows Script Host, ASP/ASP.NET, Windows Script Components or Microsoft Scriptlet control.
As of PHP 5.0.1, ActiveScript has been moved to the » PECL repository. Bu PECL eklentisi için bir DLL mevcut değildir. Ayrıca, Windows üzerinde kurulum bölümüne de bakınız.
Bilginize: You should read the manual installation steps first!
After installing PHP, you should download the ActiveScript DLL (php5activescript.dll) and place it in the main PHP folder (e.g. C:\php).
After having all the files needed, you must register the DLL on your system. To achieve this, open a Command Prompt window (located in the Start Menu). Then go to your PHP directory by typing something like cd C:\php. To register the DLL just type regsvr32 php5activescript.dll.
To test if ActiveScript is working, create a new file, named test.wsf (the extension is very important) and type:
<job id="test">
<script language="PHPScript">
$WScript->Echo("Hello World!");
</script>
</job>
Save and double-click on the file. If you receive a little window saying "Hello World!" you're done.
Bilginize: In PHP 4, the engine was named 'ActivePHP', so if you are using PHP 4, you should replace 'PHPScript' with 'ActivePHP' in the above example.
Bilginize: ActiveScript doesn't use the default php.ini file. Instead, it will look only in the same directory as the .exe that caused it to load. You should create php-activescript.ini and place it in that folder, if you wish to load extensions, etc.
This section contains PHP installation instructions specific to Microsoft Internet Information Services (IIS).
This section contains instructions for manually setting up Internet Information Services (IIS) 5.1 and IIS 6.0 to work with PHP on Microsoft Windows XP and Windows Server 2003. For instructions on setting up IIS 7.0 and later versions on Windows Vista, Windows Server 2008, Windows 7 and Windows Server 2008 R2 refer to Microsoft IIS 7.0 and later.
Download and install PHP in accordance to the instructions described in manual installation steps
Bilginize: Non-thread-safe build of PHP is recommended when using IIS. The non-thread-safe builds are available at » PHP for Windows: Binaries and Sources Releases.
Configure the CGI- and FastCGI-specific settings in php.ini file as shown below:
Örnek 1 CGI and FastCGI settings in php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Download and install the » Microsoft FastCGI Extension for IIS 5.1 and 6.0. The extension is available for 32-bit and 64-bit platforms - select the right download package for your platform.
Configure the FastCGI extension to handle PHP-specific requests by running the command shown below. Replace the value of the "-path" parameter with the absolute file path to the php-cgi.exe file.
Örnek 2 Configuring FastCGI extension to handle PHP requests
cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe"
This command will create an IIS script mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI extension. Also, it will configure FastCGI extension to use the executable php-cgi.exe to process the PHP requests.
Bilginize: At this point the required installation and configuration steps are completed. The remaining instructions below are optional but highly recommended for achieving optimal functionality and performance of PHP on IIS.
It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by the fastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each others' files as long as different user accounts are used for IIS authentication on each web site.
For example IIS 5.1 and IIS 6.0, in its default configuration, has anonymous authentication enabled with built-in user account IUSR_<MACHINE_NAME> used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR_<MACHINE_NAME> account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR_<MACHINE_NAME> account should have write permission to those.
To determine which user account is used by IIS anonymous authentication, follow these steps:
In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
Expand the list of web sites under the "Web Sites" node in the tree view, right-click on a web site that is being used and select "Properties";
Click the "Directory Security" tab;
Take note of a "User name:" field in the "Authentication Methods" dialog
To modify the permissions settings on files and folders, use the Windows Explorer user interface or icacls command.
Örnek 3 Configuring file access permissions
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, follow these steps:
In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
Right-click on the "Web Sites" node in the tree view and select "Properties";
Click the "Documents" tab;
Click the "Add..." button and enter "index.php" for the "Default content page:".
Configure IIS FastCGI extension settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single php-cgi.exe process before FastCGI extension shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTS controls how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGI InstanceMaxRequests setting is less than or equal to the value specified for PHP_FCGI_MAX_REQUESTS.
Örnek 4 Configuring FastCGI and PHP recycling
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000
Increase the timeout settings for FastCGI extension if there are applications that have long running PHP scripts. The two settings that control timeouts are ActivityTimeout and RequestTimeout. Refer to » Configuring FastCGI Extension for IIS 6.0 for more information about those settings.
Örnek 5 Configuring FastCGI timeout settings
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90
PHP searches for php.ini file in several locations and it is possible to change the default locations of php.ini file by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable.
Örnek 6 Changing the location of php.ini file
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:\Some\Directory\"
This section contains instructions for manually setting up Internet Information Services (IIS) 7.0 and later to work with PHP on Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 and Windows Server 2008 R2. For instructions on setting up IIS 5.1 and IIS 6.0 on Windows XP and Windows Server 2003 refer to Microsoft IIS 5.1 and IIS 6.0.
FastCGI module is disabled in default installation of IIS. The steps to enable it differ based on the version of Windows being used.
To enable FastCGI support on Windows Vista SP1 and Windows 7:
In the Windows Start Menu choose "Run:", type "optionalfeatures.exe" and click "Ok";
In the "Windows Features" dialog expand "Internet Information Services", "World Wide Web Services", "Application Development Features" and then enable the "CGI" checkbox;
Click OK and wait until the installation is complete.
To enable FastCGI support on Windows Server 2008 and Windows Server 2008 R2:
In the Windows Start Menu choose "Run:", type "CompMgmtLauncher" and click "Ok";
If the "Web Server (IIS)" role is not present under the "Roles" node, then add it by clicking "Add Roles";
If the "Web Server (IIS)" role is present, then click "Add Role Services" and then enable the "CGI" checkbox under "Application Development" group;
Click "Next" and then "Install" and wait for the installation to complete.
Download and install PHP in accordance to the instructions described in manual installation steps
Bilginize: Non-thread-safe build of PHP is recommended when using IIS. The non-thread-safe builds are available at » PHP for Windows: Binaries and Sources Releases.
Configure the CGI- and FastCGI-specific settings in php.ini file as shown below:
Örnek 1 CGI and FastCGI settings in php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Configure IIS handler mapping for PHP by using either IIS Manager user interface or a command line tool.
Follow these steps to create an IIS handler mapping for PHP in IIS Manager user interface:
In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
In the IIS Manager user interface select the server node in the "Connections" tree view;
In the "Features View" page open the "Handler Mappings" feature;
In the "Actions" pane click "Add Module Mapping...";
In the "Add Module Mapping" dialog enter the following:
Click "Request Restrictions" button and then configure the mapping to invoke handler only if request is mapped to a file or a folder;
Click OK on all the dialogs to save the configuration.
Use the command shown below to create an IIS FastCGI process pool which will use php-cgi.exe executable for processing PHP requests. Replace the value of the fullPath parameter with the absolute file path to the php-cgi.exe file.
Örnek 2 Creating IIS FastCGI process pool
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^ /+[fullPath='c:\PHP\php-cgi.exe']
Configure IIS to handle PHP specific requests by running the command shown below. Replace the value of the scriptProcessor parameter with the absolute file path to the php-cgi.exe file.
Örnek 3 Creating handler mapping for PHP requests
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^ /+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^ scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
This command creates an IIS handler mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI module.
Bilginize: At this point the required installation and configuration steps are completed. The remaining instructions below are optional but highly recommended for achieving optimal functionality and performance of PHP on IIS.
It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by the fastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each other's files as long as different user accounts are used for IIS authentication on each web site.
For example IIS 7, in its default configuration, has anonymous authentication enabled with built-in user account IUSR used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR account should have write permission to those.
To determine what user account is used as an anonymous identity in IIS 7 use the following command. Replace the "Default Web Site" with the name of IIS web site that you use. In the output XML configuration element look for the userName attribute.
Örnek 4 Determining the account used as IIS anonymous identity
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^
/section:anonymousAuthentication
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="IUSR" />
</authentication>
</security>
</system.webServer>
Bilginize: If userName attribute is not present in the anonymousAuthentication element, or is set to an empty string, then it means that the application pool identity is used as an anonymous identity for that web site.
To modify the permissions settings on files and folders, use the Windows Explorer user interface or icacls command.
Örnek 5 Configuring file access permissions
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, use this command:
Örnek 6 Set index.php as a default document in IIS
%windir%\system32\inetsrv\appcmd.exe set config ^ -section:system.webServer/defaultDocument /+"files.[value='index.php']" ^ /commit:apphost
Configure IIS FastCGI settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single php-cgi.exe process before IIS shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTS controls how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGI InstanceMaxRequests setting is less than or equal to the value specified for PHP_FCGI_MAX_REQUESTS.
Örnek 7 Configuring FastCGI and PHP recycling
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^
[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Increase the timeout settings for FastCGI if it is expected to have long running PHP scripts. The two settings that control timeouts are activityTimeout and requestTimeout. Use the commands below to change the timeout settings. Make sure to replace the value in the fullPath parameter to contain the absolute path to the php-cgi.exe file.
Örnek 8 Configuring FastCGI and PHP recycling
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
PHP searches for php.ini file in several locations and it is possible to change the default locations of php.ini file by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable.
Örnek 9 Changing the location of php.ini file
appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^ [name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
This section contains notes and hints specific to Apache 1.3.x installs of PHP on Microsoft Windows systems. There are also instructions and notes for Apache 2 on a separate page.
Bilginize: Please read the manual installation steps first!
There are two ways to set up PHP to work with Apache 1.3.x on Windows. One is to use the CGI binary (php.exe for PHP 4 and php-cgi.exe for PHP 5), the other is to use the Apache Module DLL. In either case you need to edit your httpd.conf to configure Apache to work with PHP, and then restart the server.
It is worth noting here that now the SAPI module has been made more stable under Windows, we recommend it's use above the CGI binary, since it is more transparent and secure.
Although there can be a few variations of configuring PHP under Apache, these are simple enough to be used by the newcomer. Please consult the Apache Documentation for further configuration directives.
After changing the configuration file, remember to restart the server, for example, NET STOP APACHE followed by NET START APACHE, if you run Apache as a Windows Service, or use your regular shortcuts.
Bilginize: Windows üzerinde, Apache yapılandırma dosyalarına c:\dizin\dosya.uzn gibi dosya yollarını eklerken tüm tersbölü çizgilerini normal bölü çizgilerine çevirmeyi unutmayınız: c:/dizin/dosya.uzn. Dizin yollarını eklerken sona da bir bölü çizgisi eklemeniz gerekebilir.
You should add the following lines to your Apache httpd.conf file:
Örnek 1 PHP as an Apache 1.3.x module
This assumes PHP is installed to c:\php. Adjust the path if this is not the case.
For PHP 4:
# Add to the end of the LoadModule section # Don't forget to copy this file from the sapi directory! LoadModule php4_module "C:/php/php4apache.dll" # Add to the end of the AddModule section AddModule mod_php4.c
For PHP 5:
# Add to the end of the LoadModule section LoadModule php5_module "C:/php/php5apache.dll" # Add to the end of the AddModule section AddModule mod_php5.c
For both:
# Add this line inside the <IfModule mod_mime.c> conditional brace AddType application/x-httpd-php .php # For syntax highlighted .phps files, also add AddType application/x-httpd-php-source .phps
If you unzipped the PHP package to C:\php\ as described in the Manual Installation Steps section, you need to insert these lines to your Apache configuration file to set up the CGI binary:
Örnek 2 PHP and Apache 1.3.x as CGI
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # For PHP 4 Action application/x-httpd-php "/php/php.exe" # For PHP 5 Action application/x-httpd-php "/php/php-cgi.exe" # specify the directory where php.ini is SetEnv PHPRC C:/php
Note that the second line in the list above can be found in the actual versions of httpd.conf, but it is commented out. Remember also to substitute the c:/php/ for your actual path to PHP.
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
If you would like to present PHP source files syntax highlighted, there is no such convenient option as with the module version of PHP. If you chose to configure Apache to use PHP as a CGI binary, you will need to use the highlight_file() function. To do this simply create a PHP script file and add this code: <?php highlight_file('some_php_script.php'); ?>.
This section contains notes and hints specific to Apache 2.0.x installs of PHP on Microsoft Windows systems. We also have instructions and notes for Apache 1.3.x users on a separate page.
Bilginize: You should read the manual installation steps first!
Bilginize: Apache 2.2.x Support
Users of Apache 2.2.x may use the documentation below except the appropriate DLL file is named php5apache2_2.dll and it only exists as of PHP 5.2.0. See also » http://snaps.php.net/
Apache 2'nin bir hizmet ortamında evreli MPM'lerle kullanımını önermiyoruz. Bunun yerine prefork MPM'sini veya Apache 1 kullanmanızı öneririz. Bunun sebebini SSS altında Apache ve evreli MPM'ler başlığı altında bulabilirsiniz.
You are highly encouraged to take a look at the » Apache Documentation to get a basic understanding of the Apache 2.0.x Server. Also consider to read the » Windows specific notes for Apache 2.0.x before reading on here.
Bilginize: PHP ve Apache 2.0.x uyumluluk bilgileri
Aşağıdaki PHP sürümlerinin Apache 2.0.x'in en son sürümleri ile çalıştığı bilinmektedir:
- PHP 4.3.0 ve sonrası » http://www.php.net/downloads.php adresinden indirilebilir.
- En son kararlı geliştirme sürümü. Kaynak kod paketini » http://snaps.php.net/php5-latest.tar.gz olarak, Windows çalıştırılabilirlerini ise » http://snaps.php.net/win32/php5-win32-latest.zip olarak indirebilirsiniz.
- Kararlı sürüm adayı sürümü » http://qa.php.net/ adresinden indirebilirsiniz.
- PHP'yi » anonim SVN'den indirme seçeneği elbette daima mevcut.
PHP'nin bu sürümleri Apache 2.0.40 ve sonrası ile uyumludur.
Apache 2.0 SAPI desteği PHP 4.2.0 ile başlamıştır. PHP'nin 4.2.3 sürümü Apache 2.0.39'da çalışır. PHP'nin 4.2.3 sürümünü bundan başka bir Apache sürümü ile kullanmayın. Ancak, PHP'nin 4.3.0 ve sonraki sürümlerini Apache2'nin en son sürümleri ile gönül rahatlığıyla kullanabilirsiniz.
PHP'nin bahsi geçen bütün sürümleri hala Apache 1.3.x ile çalışmaktadır. Apache 2.x.x'in Apache 1.3.x ile uyumlu (tek evreli çok süreçli) yapılandırmaları ile de aynı durum sözkonusudur.
Apache 2.0.x is designed to run on Windows NT 4.0, Windows 2000 or Windows XP. At this time, support for Windows 9x is incomplete. Apache 2.0.x is not expected to work on those platforms at this time.
Download the most recent version of » Apache 2.0.x and a fitting PHP version. Follow the Manual Installation Steps and come back to go on with the integration of PHP and Apache.
There are two ways to set up PHP to work with Apache 2.0.x on Windows. One is to use the CGI binary the other is to use the Apache module DLL. In either case you need to edit your httpd.conf to configure Apache to work with PHP and then restart the server.
Bilginize: Windows üzerinde, Apache yapılandırma dosyalarına c:\dizin\dosya.uzn gibi dosya yollarını eklerken tüm tersbölü çizgilerini normal bölü çizgilerine çevirmeyi unutmayınız: c:/dizin/dosya.uzn. Dizin yollarını eklerken sona da bir bölü çizgisi eklemeniz gerekebilir.
You need to insert these three lines to your Apache httpd.conf configuration file to set up the CGI binary:
Örnek 1 PHP and Apache 2.0 as CGI
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # For PHP 4 Action application/x-httpd-php "/php/php.exe" # For PHP 5 Action application/x-httpd-php "/php/php-cgi.exe"
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
You need to insert these two lines to your Apache httpd.conf configuration file to set up the PHP module for Apache 2.0:
Örnek 2 PHP and Apache 2.0 as Module
# For PHP 4 do something like this: LoadModule php4_module "c:/php/php4apache2.dll" # Don't forget to copy the php4apache2.dll file from the sapi directory! AddType application/x-httpd-php .php # For PHP 5 do something like this: LoadModule php5_module "c:/php/php5apache2.dll" AddType application/x-httpd-php .php # configure the path to php.ini PHPIniDir "C:/php"
Bilginize: Remember to substitute your actual path to PHP for the c:/php/ in the above examples. Take care to use either php4apache2.dll or php5apache2.dll in your LoadModule directive and not php4apache.dll or php5apache.dll as the latter ones are designed to run with Apache 1.3.x.
Bilginize: If you want to use content negotiation, read related FAQ.
Don't mix up your installation with DLL files from different PHP versions. You have the only choice to use the DLL's and extensions that ship with your downloaded PHP version.
This section contains notes and hints specific to Sun Java System Web Server, Sun ONE Web Server, iPlanet and Netscape server installs of PHP on Windows.
From PHP 4.3.3 on you can use PHP scripts with the NSAPI module to generate custom directory listings and error pages. Additional functions for Apache compatibility are also available. For support in current web servers read the note about subrequests.
To install PHP as a CGI handler, do the following:
Make a file association from the command line. Type the following two lines:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
More details about setting up PHP as a CGI executable can be found here: » http://benoit.noss.free.fr/php/install-php.html
To install PHP with NSAPI, do the following:
Make a file association from the command line. Type the following two lines:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Edit magnus.conf (for servers >= 6) or obj.conf (for servers < 6) and add the following: You should place the lines after mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll" Init fn="php4_init" LateInit="yes" errorString="Failed to initialise PHP!" [php_ini="c:/path/to/php.ini"]
(PHP >= 4.3.3) The php_ini parameter is optional but with it you can place your php.ini in your web server configuration directory.
Configure the default object in obj.conf (for virtual server classes [Sun Web Server 6.0+] in their vserver.obj.conf): In the <Object name="default"> section, place this line necessarily after all 'ObjectType' and before all 'AddLog' lines:
Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...]
(PHP >= 4.3.3) As additional parameters you can add some special php.ini-values, for example you can set a docroot="/path/to/docroot" specific to the context php4_execute is called. For boolean ini-keys please use 0/1 as value, not "On","Off",... (this will not work correctly), e.g. zlib.output_compression=1 instead of zlib.output_compression="On"
This is only needed if you want to configure a directory that only consists of PHP scripts (same like a cgi-bin directory):
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
After that you can configure a directory in the Administration server and assign it the style x-httpd-php. All files in it will get executed as PHP. This is nice to hide PHP usage by renaming files to .html.
Bilginize: More details about setting up PHP as an NSAPI filter can be found here: » http://benoit.noss.free.fr/php/install-php4.html
Bilginize: The stacksize that PHP uses depends on the configuration of the web server. If you get crashes with very large PHP scripts, it is recommended to raise it with the Admin Server (in the section "MAGNUS EDITOR").
Important when writing PHP scripts is the fact that Sun JSWS/Sun ONE WS/iPlanet/Netscape is a multithreaded web server. Because of that all requests are running in the same process space (the space of the web server itself) and this space has only one environment. If you want to get CGI variables like PATH_INFO, HTTP_HOST etc. it is not the correct way to try this in the old PHP way with getenv() or a similar way (register globals to environment, $_ENV). You would only get the environment of the running web server without any valid CGI variables!
Bilginize: Why are there (invalid) CGI variables in the environment?
Answer: This is because you started the web server process from the admin server which runs the startup script of the web server, you wanted to start, as a CGI script (a CGI script inside of the admin server!). This is why the environment of the started web server has some CGI environment variables in it. You can test this by starting the web server not from the administration server. Use the command line as root user and start it manually - you will see there are no CGI-like environment variables.
Simply change your scripts to get CGI variables in the correct way for PHP 4.x by using the superglobal $_SERVER. If you have older scripts which use $HTTP_HOST, etc., you should turn on register_globals in php.ini and change the variable order too (important: remove "E" from it, because you do not need the environment here):
variables_order = "GPCS" register_globals = On
You can use PHP to generate the error pages for "404 Not Found" or similar. Add the following line to the object in obj.conf for every error page you want to overwrite:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
where XXX is the HTTP error code. Please delete any other Error directives which could interfere with yours. If you want to place a page for all errors that could exist, leave the code parameter out. Your script can get the HTTP status code with $_SERVER['ERROR_TYPE'].
Another possibility is to generate self-made directory listings. Just create a PHP script which displays a directory listing and replace the corresponding default Service line for type="magnus-internal/directory" in obj.conf with the following:
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
For both error and directory listing pages the original URI and translated URI are in the variables $_SERVER['PATH_INFO'] and $_SERVER['PATH_TRANSLATED'].
The NSAPI module now supports the nsapi_virtual() function (alias: virtual()) to make subrequests on the web server and insert the result in the web page. The problem is, that this function uses some undocumented features from the NSAPI library.
Under Unix this is not a problem, because the module automatically looks for the needed functions and uses them if available. If not, nsapi_virtual() is disabled.
Under Windows limitations in the DLL handling need the use of a automatic detection of the most recent ns-httpdXX.dll file. This is tested for servers till version 6.1. If a newer version of the Sun server is used, the detection fails and nsapi_virtual() is disabled.
If this is the case, try the following: Add the following parameter to php4_init in magnus.conf/obj.conf:
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
where XX is the correct DLL version number. To get it, look in the server-root for the correct DLL name. The DLL with the biggest filesize is the right one.
You can check the status by using the phpinfo() function.
Bilginize: But be warned: Support for nsapi_virtual() is EXPERIMENTAL!!!
This section contains notes and hints specific to » OmniHTTPd on Windows.
Bilginize: You should read the manual installation steps first!
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
You need to complete the following steps to make PHP work with OmniHTTPd. This is a CGI executable setup. SAPI is supported by OmniHTTPd, but some tests have shown that it is not so stable to use PHP as an ISAPI module.
Bilginize: Important for CGI users
Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0.
Install OmniHTTPd server.
Right click on the blue OmniHTTPd icon in the system tray and select Properties
Click on Web Server Global Settings
On the 'External' tab, enter: virtual = .php | actual = c:\php\php.exe (use php-cgi.exe if installing PHP 5), and use the Add button.
On the Mime tab, enter: virtual = wwwserver/stdcgi | actual = .php, and use the Add button.
Click OK
Repeat steps 2 - 6 for each extension you want to associate with PHP.
Bilginize: Some OmniHTTPd packages come with built in PHP support. You can choose at setup time to do a custom setup, and uncheck the PHP component. We recommend you to use the latest PHP binaries. Some OmniHTTPd servers come with PHP 4 beta distributions, so you should choose not to set up the built in support, but install your own. If the server is already on your machine, use the Replace button in Step 4 and 5 to set the new, correct information.
This section contains notes and hints specific to the » Sambar Server for Windows.
Bilginize: You should read the manual installation steps first!
This list describes how to set up the ISAPI module to work with the Sambar server on Windows.
Find the file called mappings.ini (in the config directory) in the Sambar install directory.
Open mappings.ini and add the following line under [ISAPI]:
Örnek 1 ISAPI configuration of Sambar
#for PHP 4 *.php = c:\php\php4isapi.dll #for PHP 5 *.php = c:\php\php5isapi.dll
(This line assumes that PHP was installed in c:\php.)
Now restart the Sambar server for the changes to take effect.
Bilginize: If you intend to use PHP to communicate with resources which are held on a different computer on your network, then you will need to alter the account used by the Sambar Server Service. The default account used for the Sambar Server Service is LocalSystem which will not have access to remote resources. The account can be amended by using the Services option from within the Windows Control Panel Administation Tools.
This section contains notes and hints specific to » Xitami on Windows.
Bilginize: You should read the manual installation steps first!
This list describes how to set up the PHP CGI binary to work with Xitami on Windows.
Bilginize: Important for CGI users
Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0. If you want to use $_SERVER['PHP_SELF'] you have to enable the cgi.fix_pathinfo directive.
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
Make sure the web server is running, and point your browser to xitamis admin console (usually http://127.0.0.1/admin), and click on Configuration.
Navigate to the Filters, and put the extension which PHP should parse (i.e. .php) into the field File extensions (.xxx).
In Filter command or script put the path and name of your PHP CGI executable i.e. C:\php\php.exe for PHP 4, or C:\php\php-cgi.exe for PHP 5.
Press the 'Save' icon.
Restart the server to reflect changes.
This chapter teaches how to compile PHP from sources on windows, using Microsoft's tools. To compile PHP with cygwin, please refer to Unix Sistemlere Kurulum.
This chapter is outdated therefore it's temporarily been removed from the manual. For now, consider the following:
After installing PHP and a web server on Windows, you will probably want to install some extensions for added functionality. You can choose which extensions you would like to load when PHP starts by modifying your php.ini. You can also load a module dynamically in your script using dl().
The DLLs for PHP extensions are prefixed with php_.
Many extensions are built into the Windows version of PHP. This means additional DLL files, and the extension directive, are not used to load these extensions. The Windows PHP Extensions table lists extensions that require, or used to require, additional PHP DLL files. Here's a list of built in extensions:
In PHP 4 (updated PHP 4.3.11): BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC, Overload, PCRE, Session, Tokenizer, WDDX, XML ve Zlib
In PHP 5 (updated PHP 5.0.4), the following changes exist. Built in: DOM, LibXML, Iconv, SimpleXML, SPL ve SQLite. And the following are no longer built in: MySQL and Overload.
The default location PHP searches for extensions is C:\php4\extensions in PHP 4 and C:\php5 in PHP 5. To change this setting to reflect your setup of PHP edit your php.ini file:
You will need to change the extension_dir setting to point to the directory where your extensions lives, or where you have placed your php_*.dll files. For example:
extension_dir = C:\php\extensions
Enable the extension(s) in php.ini you want to use by uncommenting the extension=php_*.dll lines in php.ini. This is done by deleting the leading ; from the extension you want to load.
Örnek 1 Enable Bzip2 extension for PHP-Windows
// change the following line from ... ;extension=php_bz2.dll // ... to extension=php_bz2.dll
Some of the extensions need extra DLLs to work. Couple of them can be found in the distribution package, in the C:\php\dlls\ folder in PHP 4 or in the main folder in PHP 5, but some, for example Oracle (php_oci8.dll) require DLLs which are not bundled with the distribution package. If you are installing PHP 4, copy the bundled DLLs from C:\php\dlls folder to the main C:\php folder. Don't forget to include C:\php in the system PATH (this process is explained in a separate FAQ entry).
Some of these DLLs are not bundled with the PHP distribution. See each extensions documentation page for details. Also, read the manual section titled Installation of PECL extensions for details on PECL. An increasingly large number of PHP extensions are found in PECL, and these extensions require a separate download.
Bilginize: If you are running a server module version of PHP remember to restart your web server to reflect your changes to php.ini.
The following table describes some of the extensions available and required additional dlls.
| Extension | Description | Notes |
|---|---|---|
| php_bz2.dll | bzip2 compression functions | None |
| php_calendar.dll | Calendar conversion functions | Built in since PHP 4.0.3 |
| php_crack.dll | Crack functions | None |
| php_ctype.dll | ctype family functions | Built in since PHP 4.3.0 |
| php_curl.dll | CURL, Client URL library functions | Requires: libeay32.dll, ssleay32.dll (bundled) |
| php_dba.dll | DBA: DataBase (dbm-style) Abstraction layer functions | None |
| php_dbase.dll | dBase functions | None |
| php_dbx.dll | dbx functions | |
| php_domxml.dll | DOM XML functions | PHP <= 4.2.0 requires: libxml2.dll (bundled) PHP >= 4.3.0 requires: iconv.dll (bundled) |
| php_dotnet.dll | .NET functions | PHP <= 4.1.1 |
| php_exif.dll | EXIF functions | php_mbstring.dll. And, php_exif.dll must be loaded after php_mbstring.dll in php.ini. |
| php_fbsql.dll | FrontBase functions | PHP <= 4.2.0 |
| php_fdf.dll | FDF: Forms Data Format functions. | Requires: fdftk.dll (bundled) |
| php_filepro.dll | filePro functions | Read-only access |
| php_ftp.dll | FTP functions | Built-in since PHP 4.0.3 |
| php_gd.dll | GD library image functions | Removed in PHP 4.3.2. Also note that truecolor functions are not available in GD1, instead, use php_gd2.dll. |
| php_gd2.dll | GD library image functions | GD2 |
| php_gettext.dll | Gettext functions | PHP <= 4.2.0 requires gnu_gettext.dll (bundled), PHP >= 4.2.3 requires libintl-1.dll, iconv.dll (bundled). |
| php_hyperwave.dll | HyperWave functions | None |
| php_iconv.dll | ICONV characterset conversion | Requires: iconv-1.3.dll (bundled), PHP >=4.2.1 iconv.dll |
| php_ifx.dll | Informix functions | Requires: Informix libraries |
| php_iisfunc.dll | IIS management functions | None |
| php_imap.dll | IMAP POP3 and NNTP functions | None |
| php_ingres.dll | Ingres functions | Requires: Ingres libraries |
| php_interbase.dll | InterBase functions | Requires: gds32.dll (bundled) |
| php_java.dll | Java functions | PHP <= 4.0.6 requires: jvm.dll (bundled) |
| php_ldap.dll | LDAP functions | PHP <= 4.2.0 requires libsasl.dll (bundled), PHP >= 4.3.0 requires libeay32.dll, ssleay32.dll (bundled) |
| php_mbstring.dll | Multi-Byte String functions | None |
| php_mcrypt.dll | Mcrypt Encryption functions | Requires: libmcrypt.dll |
| php_mhash.dll | Mhash functions | PHP >= 4.3.0 requires: libmhash.dll (bundled) |
| php_mime_magic.dll | Mimetype functions | Requires: magic.mime (bundled) |
| php_ming.dll | Ming functions for Flash | None |
| php_msql.dll | mSQL functions | Requires: msql.dll (bundled) |
| php_mssql.dll | MSSQL functions | Requires: ntwdblib.dll (bundled) |
| php_mysql.dll | MySQL functions | PHP >= 5.0.0, requires libmysql.dll (bundled) |
| php_mysqli.dll | MySQLi functions | PHP >= 5.0.0, requires libmysql.dll (libmysqli.dll in PHP <= 5.0.2) (bundled) |
| php_oci8.dll | Oracle 8 functions | Requires: Oracle 8.1+ client libraries |
| php_openssl.dll | OpenSSL functions | Requires: libeay32.dll (bundled) |
| php_overload.dll | Object overloading functions | Built in since PHP 4.3.0 |
| php_pdf.dll | PDF functions | None |
| php_pgsql.dll | PostgreSQL functions | None |
| php_printer.dll | Printer functions | None |
| php_shmop.dll | Shared Memory functions | None |
| php_snmp.dll | SNMP get and walk functions | NT only! |
| php_soap.dll | SOAP functions | PHP >= 5.0.0 |
| php_sockets.dll | Socket functions | None |
| php_sybase_ct.dll | Sybase functions | Requires: Sybase client libraries |
| php_tidy.dll | Tidy functions | PHP >= 5.0.0 |
| php_tokenizer.dll | Tokenizer functions | Built in since PHP 4.3.0 |
| php_w32api.dll | W32api functions | None |
| php_xmlrpc.dll | XML-RPC functions | PHP >= 4.2.1 requires: iconv.dll (bundled) |
| php_xslt.dll | XSLT functions | PHP <= 4.2.0 requires sablot.dll, expat.dll (bundled). PHP >= 4.2.1 requires sablot.dll, expat.dll, iconv.dll (bundled). |
| php_yaz.dll | YAZ functions | Requires: yaz.dll (bundled) |
| php_zip.dll | Zip File functions | Read only access |
| php_zlib.dll | ZLib compression functions | Built in since PHP 4.3.0 |
This section contains notes and hints specific to getting PHP running from the command line for Windows.
Bilginize: You should read the manual installation steps first!
Getting PHP to run from the command line can be performed without making any changes to Windows.
C:\PHP5\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
But there are some easy steps that can be followed to make this simpler. Some of these steps should already have been taken, but are repeated here to be able to provide a complete step-by-step sequence.
Add the location of the PHP executable (php.exe, php-win.exe or php-cli.exe depending upon your PHP version and display preferences) to the PATH environment variable. Read more about how to add your PHP directory to PATH in the corresponding FAQ entry.
Add the .PHP extension to the PATHEXT environment variable. This can be done at the same time as amending the PATH environment variable. Follow the same steps as described in the FAQ but amend the PATHEXT environment variable rather than the PATH environment variable.
Bilginize: The position in which you place the .PHP will determine which script or program is executed when there are matching filenames. For example, placing .PHP before .BAT will cause your script to run, rather than the batch file, if there is a batch file with the same name.
Associate the .PHP extension with a file type. This is done by running the following command:
assoc .php=phpfile
Associate the phpfile file type with the appropriate PHP executable. This is done by running the following command:
ftype phpfile="C:\PHP5\php.exe" -f "%1" -- %~2
Following these steps will allow PHP scripts to be run from any directory without the need to type the PHP executable or the .PHP extension and all parameters will be supplied to the script for processing.
The example below details some of the registry changes that can be made manually.
Örnek 1 Registry changes
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php] @="phpfile" "Content Type"="application/php" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile] @="PHP Script" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 "AlwaysShowExt"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon] @="C:\\PHP5\\php-win.exe0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell] @="Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open] @="&Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command] @="\"C:\\PHP5\\php.exe\" -f \"%1\" -- %~2"
With these changes the same command can be written as:
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
script -arg1 -arg2 -arg3
Bilginize: There is a small problem if you intend to use this technique and use your PHP scripts as commandline filter, like the example below:
ordir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3You may find that the script simply hangs and nothing is output. To get this operational, you need to make another registry change.dir | script -arg1 -arg2 -arg3Further information regarding this issue can be found in this » Microsoft Knowledgebase Article : 321788.Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer] "InheritConsoleHandles"=dword:00000001
» PECL, » PEAR üzerinden kullanılabililen bir PHP eklentileri deposudur. Kılavuzun bu bölümü PECL eklentilerinin nasıl edinileceği ve nasıl kurulacağını göstermek için tasarlanmıştır.
Bu talimatlarda, PHP kaynak kodunun /php/kaynak/dizininiz/ altında bulunduğu ve PECL eklentisinin isminin eklenti olduğu varsayılacaktır. Hazırlıklarınızı buna göre yapın. Bu talimatlarda ayrıca, » pear komutunu kullanmayı bildiğiniz varsayılacaktır. PEAR kılavuzundaki pear komutu ile ilgili bilgiler pecl komutu için de geçerlidir.
Burada genel olarak eklentinin paylaşımlı olarak derlenmesi, kurulması ve yüklenmesi üzerinde durulacaktır. Sonraki bölümlerde açıklanan yöntemler eklentiyi nasıl derleyip kuracağınızla ilgili çeşitli talimatlar içerir, fakat bunları sizin yerinize özdevinimli olarak yüklemezler. Eklentiler bir extension yönergesi eklenerek yüklenebilirler. Bunun için php.ini dosyasını veya dl() işlevini kullanabilirsiniz.
PHP modüllerini derlerken, derleme için gerekli araçların (autoconf, automake, libtool gibi) birbirleriyle en uyumlu sürümlerini kullanıyor olmak önemlidir. Gerekli araçlar ve bunların gerekli sürümleriyle ilgili ayrıntılı bilgiyi » Anonim SVN Talimatları sayfasında bulabilirsiniz.
PECL eklentilerini indirmek için çeşitli seçenekler vardır:
Windows'ta bir PHP eklentisini yüklemenin iki yolu vardır: Ya eklentiyi PHP içinde derlersiniz ya da DLL olarak yüklersiniz. Derlenmiş bir eklentiyi yüklemek en kolay ve en çok tercih edilen yoldur.
Bir eklentiyi yüklemek için sisteminizde o eklentinin ".dll" dosyasının bulunması gerekir. Tüm eklentiler özdevinimli olarak belirli aralıklarla PHP Grubu tarafından derlenirler (bunları indirmek için sonraki bölüme bakınız).
Bir eklentiyi PHP içinde derlemek için Kaynak kod paketinden derleme belgesine bakınız.
Bir eklentiyi tek başına (yani bir DLL olarak) derlemek için Kaynak kod paketinden derleme belgesine bakınız. Eğer DLL dosyası ne PHP dağıtımınızda ne de PECL sitesinde mevcutsa, eklentiyi kullanmaya başlamadan önce derlemek zorunda kalabilirsiniz.
PHP eklentileri genellikle "php_*.dll" biçeminde isimlendirilirler (yıldız iminin yerine eklentinin ismi gelir) ve "PHP\ext" (PHP 4'te "PHP\extensions") dizini altında bulunurlar.
PHP, geliştiricilerin büyük çoğunluğunca en faydalı bulunan eklentilerle birlikte gelir. Bunlara "çekirdek" eklentiler adı verilir.
Bununla birlikte, çekirdek eklentilerle sağlanmamış bir işlevselliğe ihtiyaç duyarsanız, PECL sitesinde bakabilirsiniz. PHP Eklentileri Halk Kütüphanesi (PECL - PHP Extension Community Library) bir PHP Eklentileri deposu olup PHP eklentilerinin geliştirilmesi ve indirilmesi için barındırma oluşumlarını ve bilinen tüm eklentilerin bir dizinini içerir.
Kendi kullanımınız için bir eklenti geliştiriyorsanız PECL'de barındırılmasını isteyebilirsiniz, böylece ihtiyaçları aynı olan başkaları da eklentinizden yararlanabilir. Bunun bazı olumlu yan etkileri de vardır: Geribildirim, teşekkür, hata bildirimi, hatta düzeltme ve yama alma şansınız olur. Eklentinizi barındırılmak üzere PECL'ye göndermeden önce lütfen http://pecl.php.net/package-new.php adresini ziyaret ediniz.
Çoğu zaman her DLL'nin çok sayıda sürümü vardır:
Şunu aklınızdan çıkarmayın: Eklenti ayarlarınız kullandığınız PHP çalıştırılabilirinin ayarları ile aynı olmalıdır. Aşağıdaki PHP betiği PHP ayarlarınızın tamamını size söyleyecektir:
Örnek 1 phpinfo() kullanımı
<?php
phpinfo();
?>
Ya da komut satırından şunu çalıştırın:
sürücü:\\dizin\yolu\php\executable\php.exe -i
Bir PHP eklentisini yüklemenin en bilinen yolu eklentiyi php.ini dosyasına eklemektir. Dikkatli incelerseniz php.ini dosyanızda bir çok eklentinin zaten ekli olduğunu görürsünüz. Eklentiyi etkin kılmak için tek yapacağınız eklentinin belirtildiği satırın başındaki noktalı virgülü silmek olacaktır.
;extension=php_eklenti.dll
extension=php_eklenti.dll
Bununla birlikte, bazı HTTP sunucuları, PHP çalıştırılabilirinin yanına konmuş php.ini dosyasını kullanmadıklarından eklentinizi göremeyebilirler. HTTP sunucunuzun kullandığı php.ini dosyasının bulunduğu yeri phpinfo() işlevini kullanarak öğrenebilirsiniz:
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
Eklentiyi etkin kıldıktan sonra php.ini dosyanızı kaydedin ve HTTP sunucunuzu yeniden başlattıktan sonra tekrar phpinfo() çıktısına bakın. Yeni eklentiyi artık kendi bölümünde görüyor olmanız gerekir.
Eğer eklenti phpinfo() çıktısında görünmüyorsa sorunun kaynağını bulmak için günlük dosyalarınıza bakmalısınız.
PHP'yi komut satırından kullanıyorsanız (CGI), eklenti yükleme hatasını doğrudan ekranda görebilirsiniz.
PHP'yi bir HTTP sunucusu ile kullanıyorsanız günlük dosyalarının yeri ve biçemi kullandığınız yazılıma göre değişir. Günlüklerin yerini bulmak için kullandığınız HTTP sunucusunun belgelerine bakınız.
Sorunların çoğu DLL dosyasının yeri ile ilgilidir. php.ini içindeki "extension_dir" yönergesinin değeri ile derleme sırasında yapılan ayarlar arasında bir tutarsızlık olabilir.
Eğer sorun derleme sırasında yapılan ayarlarla uyumsuzluktan kaynaklanıyorsa muhtemelen indirdiğiniz DLL dosyasını doğru yere koymamışsınız demektir. Eklentiyi doğru ayarlarla tekrar indirmeyi deneyin. Bunu yaptıktan sonra tekrar phpinfo() çıktısına bakmayı unutmayın.
pecl komutu ile
derlenmesiPECL, paylaşımlı PHP eklentilerinin oluşturulmasını kolaylaştırır. » pecl komutunu şöyle kullanabilirsiniz:
Bu komutla eklentinin kaynak kodu indirilecek, derlenecek ve eklenti.so adıyla extension_dir yönergesinde belirtilen dizine kurulacaktır. Böylece eklenti.so php.ini üzerinden yüklenebilir duruma gelmiş olacaktır.
Öntanımlı olarak, pecl komutu, alfa veya beta olarak imlenmiş paketleri kurmaz. Eklentinin henüz kararlı bir sürümü yoksa, beta sürümü şöyle kurabilirsiniz:
Ayrıca belli bir sürümü şu şekilde kurabilirsiniz:
Bilginize: Eklentiyi php.ini dosyasında etkin kıldıktan sonra değişikliklerin etkin olması için HTTP sunucunuzu (hizmetini) yeniden başlatın.
phpize ile derlenmesi
pecl komutu ile kurulumun mümkün olmadığı durumlar olabilir. Bir güvenlik duvarı arkasındasınızdır veya eklentinin PECL uyumlu paketi yoktur ya da henüz dağıtılmamış SVN sürümünü kurmak istiyorsunuzdur, vs. Böyle bir eklentinin derleme işlemini daha alt seviye derleme araçlarını kullanarak kendiniz gerçekleştirebilirsiniz.
Bir PHP eklentisini derleme işlemine hazırlamak için phpize komutu kullanılır. Aşağıdaki örnekte, eklentinin kaynak kod paketinin eklenti dizininde bulunduğu varsayılmıştır:
$ cd eklenti $ phpize $ ./configure $ make # make install
Başarılı bir kurulum sonucunda eklenti PHP eklentileri dizinine eklenti.so adıyla yerleştirilir. Eklentiyi etkin kılmak için php.ini dosyanıza bir extension=eklenti.so satırı eklemeniz gerekecektir.
Eğer sisteminizde phpize komutu yoksa ve RPM gibi önceden derlenmiş paketleri kullanabiliyorsanız, phpize komutunu ve PHP eklentilerini derlemek için gerekli başlık dosyalarını içermesi muhtemel uygun bir PHP geliştirme sürümünü kurmanız gerekebilir.
Komutun kullanım bilgilerini görmek için phpize --help komutunu verin.
Bazen bir PECL eklentisini PHP çalıştırılabilirinin içinde duruk olarak
derlemeniz gerekebilir. Bunu yapmak için eklentiyi
/php/kaynak/dizininiz/ext/ dizinine yerleştirmeniz
ve PHP kaynak paketinin configure betiğini yeniden
çalıştırmanız gerekir.
$ cd /php/kaynak/dizininiz/ext $ pecl download eklenti $ gzip -d < eklenti.tgz | tar -xvf - $ mv eklenti-x.x.x eklenti
Bu işlemin sonucunda eklenti şöyle bir dizinin altına yerleştirilmiş olacaktır:
Artık PHP kaynak paketinin configure betiğini yeniden
oluşturup PHP'yi her zamanki gibi derleyebilirsiniz:
Bilginize:
buildconfbetiğini çalıştırabilmek için autoconf 2.13 ve automake 1.4+ paketlerinin sisteminizde kurulu olması gerekir (daha yeni autoconf sürümleri de çalışır ama onlar desteklenmemektedir).
--enable-eklenti seçeneğinin mi yoksa
--with-eklenti seçeneğinin mi kullanılacağı eklentiye
bağlıdır. Genellikle harici kütüphanelere ihtiyacı olmayan eklentiler
--enable seçeneğini kullanırlar. Hangisinin
kullanılacağından emin olmak için buildconf'tan sonra şunu
çalıştırın:
Bazı sorunlar diğerlerine göre daha sık karşımıza çıkar. En bilinenlerini bu kılavuzun SSS bölümünde liste halinde bulabilirsiniz.
Hala bir çözüme ulaşamadıysanız, PHP kurulum posta listesinden birileri belki size yardımcı olabilir. Sizin sorununuzla daha önce karşılaşan biri olmuş mu acaba diye önce liste arşivlerini bir araştırın, hala uygun bir çözüm bulamadıysanız sorununuzu listeye yazın, aynı sorunla daha önce karşılaşmış biri size yardımcı olabilir. Liste arşivlerine » http://www.php.net/support.php adresindeki destek sayfasından erişebilirsiniz. PHP kurulum listesine üye olmak için » php-install-subscribe@lists.php.net adresine boş bir ileti gönderiniz. Posta listesinin adresi: » php-install@lists.php.net.
Posta listesinde yardım almak istiyorsanız, ortamınız hakkında gerekli
bilgiler (kullandığınız işletim sistemi, PHP sürümü, HTTP sunucusu,
PHP'yi CGI olarak mı yoksa modül olarak mı çalıştırdığınız, safe_mode,
vs. kullanımı) dikkatlice ve ayrıntılı olarak vermeye
çalışın. Bunun yanında sorununuzu denemeyi veya aynı sorunu üretmeyi
mümkün kılacak kodları veya ayrıntıları vermeye çalışın.
PHP'de bir hata bulduğunuzu düşünüyorsanız, lütfen bize bildirin. Siz bildirmezseniz PHP geliştiricilerinin muhtemelen bundan haberleri olmayacak ve gerekli değişiklikleri yapmayacaklardır. Hataları » http://bugs.php.net/ adresindeki hata izleme sistemini kullanarak bildirebilirsiniz. Hataları lütfen posta listelerine ve kişisel posta adreslerine bildirmeyiniz. Hata izleme sistemine özellik isteklerinizi de bildirebilirsiniz.
Bir hatayı bildirmeden önce lütfen » Hata nasıl bildirilir? sayfasını okuyunuz!
Yapılandırma dosyası (php.ini) PHP başlatıldığında okunur. PHP'nin sunucu modülü sürümlerinde bu işlem bir kereliğine HTTP sunucusu başlatıldığında gerçekleşir. CGI ve CLI sürümlerinde ise PHP'nin her çağrılışında işlem tekrarlanır.
php.ini sırasıyla şuralarda aranır:
SAPI modülüne özgü konum (Apache 2'de PHPIniDir yönergesi, CGI ve CLI için -c komut satırı seçeneği, NSAPI'de php_ini değiştirgesi, THTTPD'de PHP_INI_PATH ortam değişkeni)
PHPRC ortam değişkeni. PHP 5.2.0 öncesinde aşağıda bahsedilen kayıt defteri anahtarından sonra bu değişkene bakılırdı.
PHP 5.2.0'dan itibaren, PHP'nin farklı sürümlerine ait php.ini dosyaları için Windows kayıt defterinde sırayla aşağıdaki yerlere bakılmaktadır: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] ve [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]. Burada x, y ve z harfleri PHP'nin ana, alt ve yama sürümlerini belirtir. Bu anahtarlarda bir IniFilePath değeri varsa ilk bulunan php.ini konumu kullanılır.
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP] anahtarının \IniFilePath değeri. (Windows Kayıt Defteri kaydı)
Geçerli çalışma dizini (CLI dışında)
HTTP sunucusunun dizini (SAPI modülleri için) veya PHP dizini (Windows için)
Windows dizini (C:\windows veya C:\winnt) (Windows için) veya --with-config-file-path derleme seçeneği ile belirtilen dizin.
php-SAPI.ini mevcutsa (burada SAPI, kullanılan SAPI'dir, dolayısıyla php-cli.ini veya php-apache.ini gibi bir dosya ismidir), php.ini yerine bu dosya kullanılır. SAPI ismi php_sapi_name() işlevi ile saptanabilir.
Bilginize: Apache HTTP sunucusunun başlatıldığında kök dizine geçmesi PHP'nin php.ini dosyasını dosya sisteminin kök dizininde aramasına sebep olur.
php.ini yönergelerinin eklentilerle ilgili olanlarının belgeleri her eklentinin kendi belgeleri içindedir. Temel yönergelerin listesini eklerde bulabilirsiniz. Tamamı olmasa da yönergelerin büyük çoğunluğu kılavuzda belgelenmiş durumdadır. Kurulu PHP sürümünüzde geçerli yönergelerin tam listesi için kendi içinde iyi açıklanmış php.ini dosyanızı okuyun. Ayrıca, SVN'de bulunan » en son php.ini dosyası da bu konuda size yardımcı olabilir.
Örnek 1 - php.ini örneği
; bir noktalı virgülden (;) sonra gelen tüm metin parçaları yok sayılır [php] ; bölüm imleyiciler de (köşeli ayraç içindeki metinler) yok sayılır ; Mantıksal değerler için şu değerlerden herhangi biri kullanılabilir: ; true, on, yes ; false, off, no, none register_globals = off track_errors = yes ; Dizgeleri çift tırnak imlerinin arasında belirtebilirsiniz include_path = ".:/usr/local/lib/php" ; tersbölü karakterleri diğer karakterler gibi ele alınır include_path = ".;c:\php\lib"
PHP'nin 5.1.0 sürümünden beri .ini dosyalarında bulunan yönergelere isimleriyle değişken olarak erişilebilmektedir. Örnek: open_basedir = ${open_basedir} ":/new/dir".
PHP 5.3.0'dan beri, dizinler için .htaccess tarzı INI dosyaları desteklenmektedir. Bu dosyalar sadece CGI/FastCGI SAPI tarafından işlenir. Bu işlevsellik ile PECL htscanner eklentisi atıl duruma düşmüştür. Apache kullanıyorsanız aynı etkiyi elde etmek için .htaccess dosyalarını kullanın.
Ana php.ini dosyasına ek olarak, PHP istenen PHP dosyasının bulunduğu dizinden itibaren her dizini INI dosyaları için tarar ve bunları geçerli belge kök dizinine uygulanıyormuş gibi uygular ($_SERVER['DOCUMENT_ROOT'] değişkenine atandığı gibi). .user.ini tarzı INI dosyalarında sadece PHP_INI_PERDIR ve PHP_INI_USER kipindeki INI ayarları işleme sokulur.
Kullanıcı INI dosyalarını denetlemek için iki yeni INI yönergesi kullanılmaktadır: user_ini.filename ve user_ini.cache_ttl.
user_ini.filename ile PHP'nin dizinlerde arayacağı dosyanın ismi belirtilir. .user.ini öntanımlı değerdir.
user_ini.cache_ttl ile kullanıcı INI dosyalarının ne sıklıkta denetleneceği belirtilir. 300 saniye (5 dakika) öntanımlı değerdir.
Bu kipler, bir PHP yönergesinin nerede ve ne zaman atanabileceğini belirlerler ve bu kılavuzdaki her yönerge bu kiplerden biri ile ilişkilidir. Örneğin, bazı ayarlar bir PHP betiğinin içinde ini_set() kullanarak atanabilirken bazıları da php.ini veya httpd.conf dosyasında atanabilirler.
Örneğin, output_buffering ayarı için kip PHP_INI_PERDIR olup ini_set() kullanarak atanamaz. Bununla birlikte, display_errors yönergesinin kipi PHP_INI_ALL olup ini_set() kullanımı dahil her yerde atanabilir.
| Kip | Anlamı |
|---|---|
| PHP_INI_USER | Girdi Windows registry veya kullanıcı betiklerinde atanabilir. |
| PHP_INI_PERDIR | Girdi php.ini, .htaccess veya httpd.conf dosyasında atanabilir. |
| PHP_INI_SYSTEM | Girdi php.ini veya httpd.conf dosyasında atanabilir. |
| PHP_INI_ALL | Girdi herhangi bir yerde atanabilir. |
PHP'yi bir Apache modülü olarak kullanırken, yapılandırma ayarlarını Apache yapılandırma dosyalarındaki (httpd.conf ve .htaccess dosyaları) yönergeleri kullanarak da değiştirebilirsiniz. Bunu yapabilmek için Apache yapılandırmasında "AllowOverride Options" veya "AllowOverride All" olması gerekir.
PHP yapılandırmasını Apache yapılandırma dosyaları içinden değiştirmenize imkan veren çeşitli Apache yönergeleri vardır. PHP_INI_ALL, PHP_INI_PERDIR veya PHP_INI_SYSTEM olarak belirtilebilen yönergeleri eklerdeki php.ini yönergelerinin listesi sayfasında bulabilirsiniz.
php_value
isim
değer
Belirtilen değeri ismi belirtilen yönergeye atar. Sadece PHP_INI_ALL ve PHP_INI_PERDIR türü yönergeler için kullanılabilir. Önceki atanan değeri silmek için değer olarak none kullanın.
Bilginize: Mantıksal değer atamak için
php_valueyönergesini değil,php_flag(aşağıya bakınız) yönergesini kullanmalısınız.
php_flag
isim
on|off
Bir mantıksal yapılandırma yönergesi atamak için kullanılır. Sadece PHP_INI_ALL ve PHP_INI_PERDIR türü yönergeler için kullanılabilir.
php_admin_value
isim
değer
İsmi belirtilen yönergeye belirtilen değeri atar. .htaccess dosyalarında kullanılamaz. Bu yönerge ile atanan hiçbir yönerge türü ini_set() veya .htaccess tarafından geçersiz kılınamaz. Önceki atanan değeri silmek için değer olarak none kullanın.
php_admin_flag
isim
on|off
Bir mantıksal yapılandırma yönergesi atamak için kullanılır. .htaccess dosyalarında kullanılamaz. Bu yönerge ile atanan hiçbir yönerge türü .htaccess tarafından geçersiz kılınamaz.
Örnek 1 - Apache yapılandırma örneği
<IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on </IfModule>
PHP sabitleri PHP dışında mevcut değildir. Örneğin, httpd.conf dosyasında error_reporting yönergesine E_ALL veya E_NOTICE PHP sabitlerini atayamazsınız. Bunu yaparsanız daima 0 olarak değerlendirileceklerdir. Sabitleri kullanmak yerine bunların bit maskelerini kullanın. Bu sabitler php.ini içinde kullanılabilir.
PHP, Windows üzerinde çalışırken, yapılandırma değerleri Windows kayıt defteri kullanılarak her dizin için ayrı ayrı değiştirilebilir. Yapılandırma değerleri defterde HKLM\SOFTWARE\PHP\Per Directory Values anahtarının dizin isimlerine karşılık gelen alt anahtarlarında saklanır. Örneğin, c:\inetpub\wwwroot dizini için yapılandırma değerleri HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot anahtarında saklanır. Dizin ile ilgili ayarlar, dizin içinde ve alt dizinlerde çalıştırılan her betik için geçerli olur. Anahtar altındaki değerler PHP yapılandırma yönergelerinin isimlerini ve dizge değerlerini içermelidir. Değerlerde bulunan PHP sabitleri çözümlenmez. Sadece, PHP_INI_USER türü değişebilir yapılandırma değerleri bu yolla atanabilir, PHP_INI_PERDIR değerleri atanamaz.
PHP'yi nasıl çalıştırdığınızdan bağımsız olarak, belli değerleri betiğinizin çalışması sırasında ini_set() işlevi sayesinde değiştirebilirsiniz. Bu konuda daha ayrıntılı bilgi için ini_set() sayfasına bakınız.
Sistem yapılandırmanızla ilgili ayarlar ve mevcut değerleri ilginizi çekiyorsa phpinfo() işlevini çalıştırabilir ve elde ettiğiniz sayfayı inceleyebilirsiniz. Ayrıca, yapılandırma yönergelerinin her birine çalışma anında ini_get() veya get_cfg_var() işlevini kullanarak erişebilirsiniz.
PHP bir dosyayı çözümlerken, hangi bölümü yorumlayıp hangi bölümü yorumlamadan geçeceğine açılış ve kapanış etiketlerine bakarak karar verir. PHP'nin bu şekilde çalışıyor olması, PHP'nin çesitli türde birçok belgenin içine gömülebilmesini sağlar, çünkü PHP başlangıç ve bitiş etiketlerinin dışında kalan her şey PHP çözümleyicisi tarafından gözardı edilir. Çoğu zaman, bu örnekte olduğu gibi PHP'nin HTML içine gömülmüş olduğunu göreceksiniz.
<p>Bu bölüm gözardı edilecektir.</p>
<?php echo 'Bu bölüm PHP tarafından çözümlenecektir.'; ?>
<p>Bu bölüm de gözardı edilecektir.</p>
Daha gelişmiş yapılar da kullanmanız mümkündür:
Örnek 1 - Gelişmiş önceleme
<?php
if ($ifade) {
?>
<strong>Bu önerme doğrudur.</strong>
<?php
} else {
?>
<strong>Bu önerme yanlıştır.</strong>
<?php
}
?>
Bu beklendiği gibi çalışacaktır, çünkü PHP, ?> kapanış etiketi ile karşılaştığında, tekrar bir açılış etiketi ile karşılaşana kadar bulduğu herşeyi (kapanış etiketinden sonraki satırsonu karakteri hariç - bkz, deyim ayırma) çıktılayacaktır. Buradaki örnek oldukça basit, ancak büyük metin bloklarını görüntülemek istediğimizde PHP'yi çözümleme kipinden çıkartmak çoğu zaman tüm metni echo() ya da print() ile görüntülemekten daha verimlidir.
PHP ile kullanılabilecek dört farklı açılış ve kapanış etiketi çifti vardır. Bunlardan ikisi, <?php ?> ve <script language="php"> </script> her zaman kullanılabilir durumdadır. Diğer ikisi, kısa etiketler ve ASP tarzı etiketler olup php.ini yapılandırma dosyası içersinden açılıp kapatılabilirler. Bazı kişiler kısa etiketleri ve ASP tarzı etiketleri daha kullanışlı bulmaktadır, ancak bu ikisi daha az taşınabilir olduklarından genellikle tavsiye edilmemektedir.
Bilginize: Bir diğer önemli nokta, PHP'yi XML ya da XHTML içine gömmek istiyorsanız standartlarla uyumlu kalabilmek için <?php ?> etiketlerini kullanmanız gerektiğidir.
Örnek 2 - PHP Açılış ve Kapanış Etiketleri
1. <?php echo 'XHTML ya da XML belgeleri sunacaksanız, böyle yapın'; ?>
2. <script language="php">
echo 'bazı düzenleyiciler (FrontPage gibi) işlem
yönergelerini sevmezler';
</script>
3. <? echo 'Bu en basit, SGML işlem yönergesidir'; ?>
<?= ifade ?> Bu "<? echo ifade ?>" için bir kısayoldur.
4. <% echo 'İsterseniz ASP tarzı etiketler kullanabilirsiniz'; %>
<%= $degisken; # Bu "<% echo . . ." %> için bir kısayoldur.
Bir ve iki numaralı örneklerde gözüken etiketler her zaman kullanılabilirler. Bu ikisinden birincisi en geniş kullanıma sahip olanı ve en çok tercih edilenidir.
Kısa etiketler (üçüncü gibi) yalnızca php.ini içersinde short_open_tag yapılandırma
yönergesiyle etkinleştirilmişlerse ya da PHP,
--enable-short-tags derleme seçeneği ile
yapılandırılmışsa kullanılabilirler.
ASP tarzı etiketler (dördüncü örnek) php.ini dosyasında asp_tags yapılandırma yönergesiyle etkinleştirilmişlerse kullanılabilirler.
Bilginize: Geliştirdiğiniz uygulamaları ya da kütüphaneleri başkalarına dağıtacaksanız ya da bu uygulamaları denetiminizde olmayan PHP sunucularına kuracaksanız kısa etiketleri kullanmaktan kaçınmalısınız, çünkü hedef sunucu kısa etiketleri desteklemiyor olabilir. Kodlarınızın taşınabilir ve yeniden dağıtılabilir olması için, alışkanlıkla kısa etiketleri kullanmadığınızdan emin olun.
C ya da Perl'de olduğu gibi, PHP de deyimlerin birbirlerinden her bir deyimin sonuna konulacak noktalı virgülle ayrılmasını gerektirir. Bir PHP kod bloğunun sonunda yer alan kapanış etiketi kendinden önceki deyim için noktalı virgül işlevi görür; yani, bir PHP bloğunun son satırının sonuna noktalı virgül koymak zorunda değilsiniz. Kapanış etiketi aynı zamanda satırsonu karakterini de kendisi ekleyecektir.
<?php
echo 'Bu bir denemedir';
?>
<?php echo 'Bu bir denemedir' ?>
<?php echo 'Son kapanış etiketini koymadık';
Bilginize: Dosya sonunda PHP kapanış etiketini kullanmak isteğe bağlıdır, hatta dosya sonlarında istemdışı boş satırlar oluşması gibi durumlarda include(), require() gibi işlevlerin kullanımında yararlı bile olabilir, dahası sonradan yanıta başlık eklemeye devam edebilirsiniz. Bu özellik ayrıca, çıktı tamponlama kullanıyorsanız ve betiğe include() ile eklediğiniz dosyalar tarafından üretilen kısımların sonunda gereksiz boş satırların oluşmasını istemediğinizde de işe yarar.
PHP, 'C', 'C++' ve Unix kabuk tarzı (Perl tarzı) açıklamaların hepsini destekler. Örnegin:
<?php
echo 'Bu bir denemedir'; // Bu tek satırlık c++ tarzı açıklamadır
/* Bu, C tarzı çok satırlı
bir açıklamadır */
echo 'Bir deneme daha';
echo 'Bu da sonuncusu'; # Bu tek satırlık kabuk tarzı açıklamadır
?>
"Tek satırlık" bir açıklamanın etki alanı yalnızca satır sonuna ya da PHP
kod bloğunun sonuna kadardır. Yani, // ... ?> ya da
# ... ?> kullanımından sonra gelecek HTML kodu
YAZDIRILACAKTIR: ?> etiketi PHP kipinden çıkılmasına ve
HTML kipine dönülmesini sağlar, // ya da
# kullanımı bunu etkileyemez asp_tags yapılandırma yönergesi etkinse,
asp tarzı // %> ve # %>
kullanımı da böyle çalışır. Bununla birlikte,
</script> etiketi tek satırlık açıklama için
böyle duruma yol açmaz.
<h1>Bu <?php # echo 'basit';?> bir örnektir.</h1>
<p>Yukarıdaki başlık 'Bu bir örnektir' diye gösterilecektir.</p>
Bir 'C' tarzı açıklama ilk */ ile karşılaşıldığı noktada sona erer. 'C' tarzı açıklamaları iç içe kullanmamalısınız. Büyük miktarda kod bloğunu açıklama haline getirirken bu yanlış genellikle yapılır.
<?php
/*
echo 'Bu bir denemedir'; /* Bu açıklama sorun çıkaracak. */
*/
?>
PHP sekiz ilkel veri türü destekler.
Dört sayıl tür:
İki bileşik tür:
Ve son olarak iki özel tür:
Bu kılavuzda ayrıca, okunabilirliği arttırmak için bazı sözde türlere de yer verilmiştir:
Ve sözde değişken: $... .
Kılavuzun bazı yerlerinde tür ismi olarak "double" hala kalmış olabilir. Bunları "float" olarak ele alın; iki isminde varlık sebebi tamamen tarihseldir.
Normal olarak, değişken türünü programcı belirlemez; çalışma anında değişkenin bulunduğu bağlama göre buna PHP karar verir.
Bilginize: Bir ifadenin değerinin ve türünün ne olduğuna bakmak için var_dump() işlevini kullanabilirsiniz. Hata ayıklama amacıyla bir değişkenin türünü öğrenmek için gettype() işlevini kullanın. Belli bir türü sınamak için gettype() değil is_tür işlevlerini kullanın. Bazı örnekler:
<?php
$a_bool = TRUE; // boolean türünde
$a_str = "foo"; // string türünde
$a_str2 = 'foo'; // string türünde
$an_int = 12; // integer türünde
echo gettype($a_bool); // boolean basar
echo gettype($a_str); // string basar
// Değişken bir tamsayı ise değeri dört arttır
if (is_int($an_int)) {
$an_int += 4;
}
// $bool bir dizge ise değeri çıktıla
// (hiçbir şey çıktılanmayacaktır)
if (is_string($a_bool)) {
echo "Dizge: $a_bool";
}
?>
Bir değişkenin türünün mutlaka belli bir türe dönüşmesini isterseniz ya tür çarpıtma yapın ya da settype() işlevini kullanın.
Yerine göre bazı durumlarda bir değişkenin değeri farklı değerlendirilir. Daha ayrıntılı bilgi için Tür Dönüşümü bölümüne bakınız. Ayrıca, türlerle ilgili çeşitli karşılaştırmaların listelendiği Tür karşılaştırma tabloları da yararlı olabilir.
booleanEn basit türdür. Bir mantıksal ifadenin sonucu TRUE veya FALSE olan bir doğruluk değeridir.
Bilginize: boolean türü PHP 4'ten beri vardır.
Bir boolean sayılını belirtmek için TRUE veya FALSE anahtar sözcüğü kullanılır. Her ikisi de harf büyüklüğüne duyarsızdır.
<?php
$foo = True; // $foo değişkenine TRUE değeri atanır.
?>
Genelde, boolean türünde bir değer döndüren bir çeşit işleç vardır ve bu değer bir denetim yapısına aktarılır.
<?php
// == işleci, eşitliği sınar ve
// boolean türünde bir değer döndürür
if ($eylem == "sürümü göster") {
echo "Sürüm numarası 1.23'tür.";
}
// Bu gereksizdir...
if ($ayırıcı_göster == TRUE) {
echo "<hr>\n";
}
// ... böylesi daha iyidir:
if ($ayırıcı_göster) {
echo "<hr>\n";
}
?>
boolean türüne dönüşümBir değeri doğrudan boolean türüne dönüştürmek için (bool) veya (boolean) çarpıtmalarını kullanabilirsiniz. Ancak, bir boolean değiştirge gerektiren bir işleç, işlev veya denetim yapısı dönüşümün özdevinimli olarak yapılmasını sağladığından çoğu durumda tür çarpıtma gereksizdir.
Ayrıca, Tür Dönüşümü bölümüne de bakınız.
Aşağıdaki değerler boolean türüne dönüşümde FALSE olarak ele alınırlar:
Bunların dışında kalan tüm değerler TRUE olarak ele alınır (resource türler dahil).
-1 ve sıfırdan farklı diğer değerler (pozitif veya negatif) TRUE olarak ele alınır.
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
integerBir integer türünde değer şu kümeden bir tamsayıdır: Z = {..., -2, -1, 0, 1, 2, ...}.
Bunlara da bakınız:
integer türünde değerler onluk, sekizlik veya onaltılık tabanda belirtilebilirler ve önlerinde isteğe bağlı bir + veya - işareti bulunabilir.
Sekizlik gösterimde sayıların önüne 0 (sıfır), onaltılık gösterimde ise 0x getirilir.
Örnek 1 - Tamsayı sayıllar
<?php
$a = 1234; // onluk tabanda bir sayı
$a = -123; // negatif bir sayı
$a = 0123; // sekizlik tabanda bir sayı (onluk: 83)
$a = 0x1A; // onaltılık tabanda bir sayı (onluk: 26)
?>
Biçimsel olarak integer sayılların yapısı:
onluk : [1-9][0-9]*
| 0
onaltılık : 0[xX][0-9a-fA-F]+
sekizlik : 0[0-7]+
tamsayı : [+-]?onluk
| [+-]?onaltılık
| [+-]?sekizlik
Bir integer türün genişliği platforma göre değişir. 32 bit genişliğinde olduğunda olası değeri 2 milyon civarındadır. PHP işaretsiz tamsayıları (C'deki unsigned) desteklemez. integer türün genişliği PHP 4.4.0'da PHP_INT_SIZE sabitine ve olası en büyük değeri ise PHP 5.0.5'te PHP_INT_MAX sabitine atanmıştır.
Sekizlik bir değer içinde geçersiz bir rakam kullanılmışsa (8, 9 gibi) o ve kalan tüm rakamlar yok sayılır.
Örnek 2 - Sekizlik garabeti
<?php
var_dump(01090); // sekizlik: 010, onluk: 8
?>
PHP, integer türünde bir değerin bellekte integer türüne ayrılan genişliğe sığmadığını saptarsa float türünde bir değer olarak ele alır ve bu durum yapılan bir işlem sırasında ortaya çıkmışsa işlemden dönen değer float türünde olur.
<?php
$büyük_sayı = 2147483647;
var_dump($büyük_sayı);
// çıktısı: int(2147483647)
$büyük_sayı = 2147483648;
var_dump($büyük_sayı);
// çıktısı: float(2147483648)
// aynısı 2^31 ve 2^32-1 arasındaki onaltılık değerler için de geçerlidir:
var_dump( 0xffffffff );
// çıktısı: float(4294967295)
// ancak 2^32-1'den büyük onaltılık değerler için geçersizdir:
var_dump( 0x100000000 );
// output: int(2147483647)
$milyon = 1000000;
$büyük_sayı = 50000 * $million;
var_dump($büyük_sayı);
// çıktısı: float(50000000000)
?>
Ne yazık ki, bunun negatif sayılar için her zaman çalışmaması şeklinde kendini gösteren bir PHP yazılım hatası mevcuttu. Örneğin, -50000 * $milyon işleminin sonucu -429496728 olmaktadır. Ancak, her iki terimin işareti pozitif olduğunda hiçbir sorun çıkmamaktadır.
Bu hata PHP 4.1.0'da düzeltilmiştir.
PHP'de sonucun integer türünde elde edileceği bir bölme işlemi mevcut değildir. 1/2 işleminin sonucu float türünde 0.5 değeridir. Bu değer (integer) ile çarpıtılarak aşağı yuvarlamak suretiyle bir tamsayıya dönüştürülebilirse de round() işlevini kullanırsanız dönüşümün nasıl yapılacağını kendiniz belirleyebilirsiniz.
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
integer türüne dönüşümBir değeri doğrudan integer türüne dönüştürmek için (int) veya (integer) çarpıtmasını kullanabilirsiniz. Ancak, çoğu durumda türü çarpıtmak gerekmez, bir tamsayı değer gerektiren bir işlev veya denetim yapısı, değeri özdevinimli olarak integer türüne dönüştürecektir. Ayrıca, bir değer integer türüne intval() işleviyle de dönüştürülebilir.
Ayrıca, Tür Dönüşümü bölümüne de bakınız.
boolean türünden dönüşümFALSE, 0'a (sıfır); TRUE, 1'e (bir) dönüştürülür.
float türünden dönüşümfloat türünden integer türüne dönüşümde sayı sıfıra yaklaştırılarak yuvarlanır.
Dönüşüm sonucu integer türüne ayrılan genişliğe (normalde +/- 2.15e+9 = 2^31) sığmıyorsa, float türün hassasiyeti integer türünde tam bir sonuç vermeyeceğinden sonuç tanımsızdır. Bu durumda ne bir uyarı ne de bir bilgi verilir!
Ondalık kısmı integer türüne asla dönüştürmeyin, yoksa beklenmedik sonuçlar elde edebilirsiniz.
<?php
echo (int) ( (0.1+0.7) * 10 ); // çıktısı: 7!
?>
Ayrıca bakınız: Kayan noktalı sayılarda hassasiyet uyarısı.
string türünden dönüşümDizgelerin sayılara dönüşümü bölümüne bakınız.
Diğer türlerden integer türüne dönüşümün nasıl davranacağı henüz kesin olarak tanımlanmamıştır. Gözlemlediğiniz bir davranışın doğruluğuna güvenmeyiniz, ileride bu davranış hiçbir bilgi verilmeden değiştirilebilir.
floatGerçek sayılar (veya kayan noktalı sayılar) şu sözdizimleri ile belirtilebilir:
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
Biçimsel olarak:
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
USTEL_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
Bir gerçek sayının bellekte kapladığı genişlik platforma göre değişmekteyse de kabaca 14 hanelik bir hassasiyetle ~1.8e308'lik olası bir en büyük değer (64 bitlik IEEE biçemi) hepsi için sağlanır.
Normal olarak, 0.1 veya 0.7 gibi
basit ondalık sayılar az da olsa bir kayıp olmaksızın dahili ikil
karşılıklarına dönüştürülemezler. Bunun şöyle bir sonucu olur: örneğin,
floor((0.1+0.7)*10) işlevinden beklendiği gibi
8 değil, 7 döner; bunun sebebi
dahili gösterimin aslında 7.9 gibi bir
değer olmasıdır.
Bunun asıl sebebi, noktanın sağındaki rakam sayısı sonsuz olan bazı ondalık sayıları ifade etmekteki zorluktur. Örneğin, 1/3 ifadesinin ondalık sonucu 0.3'tür.
Bu bakımdan, son ondalık hanesine bakarak sonucun ne olacağına karar verilemez, bu bakımdan kayan noktalı sayılar arasında asla eşitlik karşılaştırmaları yapılmaz. Eğer daha yüksek hassasiyet isteniyorsa keyfi hassasiyetli matematik işlevleri ve gmp işlevleri kullanılabilir.
float türüne dönüşümstring türleri float türlere dönüştürmek için gereken bilgileri Dizgelerin sayılara dönüşümü bölümünde bulabilirsiniz. Diğer türlerden float türüne dönüşüm için değer önce integer türüne dönüştürülür. Daha fazla bilgi için integer türüne dönüşüm bölümüne bakınız. PHP 5 itibariyle, bir object tür float türe dönüştürülmeye çalışılırsa bir uyarı üretilir.
stringBir dizge string türünde bir sayıl değer olup bir dizi karakterden oluşur. PHP 6 öncesi her karakter tek bayt ile ifade ediliyordu. Yani, olası karakter sayısı 256'dan ibaretti. Bu yüzden PHP Evrenkod için yerleşik desteğe sahip olamıyordu. Temel Evrenkod işlevselliği hakkında bilgi edinmek için utf8_encode() ve utf8_decode() işlevlerine bakınız.
Bilginize: Bir dizgenin çok büyük olması bir sorun teşkil etmez. PHP, string türünde bir değer için boyut sınırlaması yapmaz; tek sınırlama PHP'nin çalıştığı makinede PHP'nin kullanımına ayrılan bellek miktarıdır.
string türünde bir sayıl dört şekilde belirtilebilir:
Bir dizgeyi belirtmenin en basit yolu dizgeyi tek tırnak (') imlerinin arasına almaktır.
Tek tırnaklı bir dizge içinde tek tırnağı sayıl değeriyle kullanmak isterseniz önüne bir tersbölü imi getirmelisiniz (\). Bir tersbölü imini sayıl değeriyle kullanmak isterseniz onun da önüne bir tersbölü imi getirmelisiniz (\\). Tersbölü imini bunlardan başka bir karakterin önünde kullanırsanız, tersbölü imi karakterle birlikte basılır.
Bilginize: Diğer iki sözdiziminin aksine, değişkenler ve özel karakterlerin öncelemleri tek tırnaklı dizgelerin içinde kullanıldıklarında yorumlanmazlar.
<?php
echo 'Bu basit bir dizgedir';
echo 'Dizgelerin içinde satırsonu karakterlerini
tıpkı buradaki gibi
kullanabilirsiniz';
// Çıktısı: Arnold dedi ki: "I'll be back"
echo 'Arnold dedi ki: "I\'ll be back"';
// Çıktısı: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// Çıktısı: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// Çıktısı: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// Çıktısı: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
Eğer bir dizge çift tırnak (") içine alınmışsa PHP, aşağıdaki özel karakter öncelemlerini yorumlayacaktır:
| Öncelem | Anlamı |
|---|---|
| \n | satırsonu (LF veya ASCII 10 (0x0A)) |
| \r | satırbaşı (CR veya ASCII 13 (0x0D)) |
| \t | yatay sekme (HT veya ASCII 9 (0x09)) |
| \v | düşey sekme (VT veya ASCII 11 (0x0B)) (PHP 5.2.5 ve sonrası) |
| \f | sayfa ileri (FF veya ASCII 12 (0x0C)) (PHP 5.2.5 ve sonrası) |
| \\ | tersbölü |
| \$ | dolar imi |
| \" | çift tırnak |
| \[0-7]{1,3} | Bu düzenli ifade ile eşleşen dizilim, karakterin sekizlik gösterimidir. |
| \x[0-9A-Fa-f]{1,2} | Bu düzenli ifade ile eşleşen dizilim, karakterin onaltılık gösterimidir. |
Tersbölü imini bunlardan başka bir karakterin önünde kullanırsanız, tersbölü imi karakterle birlikte basılır. PHP 5.1.1'den önce, \{$var} içindeki tersbölü imi basılmıyordu.
Çift tırnaklı dizgelerin en önemli özelliği içerdiği değişkenlerin yorumlanmasıdır. Bu konuda daha ayrıntılı bilgi edinmek için Değişken çözümleme bölümüne bakınız.
Bir dizgenin sınırlarını belirlemenin üçüncü yolu, yorumlu metin sözdizimidir. Bir yorumlu metin daima <<< karakterleri ile başlar ve hemen ardından bir betimleyici ve bir satırsonu karakteri gelir. Asıl dizge satırsonu karakterinden sonra yer alır. Dizgenin sonunu belirtmek üzere dizgenin sonuna, baştaki betimleyici konur.
Kapanış betimleyicisinin dizgeden sonraki satırın başında olması gerekir. Ayrıca, betimleyici PHP'deki diğer isimlere uygulanan kurallara uygun olmalıdır: Sadece bir harfle veya alt çizgi imi ile başlayabilir; sadece harfler, rakamlar veya alt çizgi imleri içerebilir.
Kapanış betimleyicisinin bulunduğu satırda betimleyicinin hemen ardına konan noktalı virgül (;) dışında hiçbir karakter bulunmaması çok önemli olup buna özellikle dikkat etmelisiniz. Yani, betimleyici özellikle girintilenmemeli; noktalı virgülden önce ve sonra herhangi bir boşluk karakteri bulunmamalıdır. Ayrıca, kapanış betimleyicisinden hemen önce gelen karakterin yerel işletim sistemine özgü satırsonu karakteri olması çok önemlidir. Bu karakter Unix ve Mac OS X için \n'dir. Kapanış betimleyicisinden (ve olası noktalı virgül karakterinden) sonraki karakter de böyle bir satırsonu karakteri olmalıdır.
Eğer bu kurallara uyulmaz ve kapanış betimleyicisinin etrafı temiz tutulmazsa kapanış betimleyicisi algılanamayacağından PHP kapanış betimleyicisini aramaya devam edecektir. Eğer dosyanın sonuna kadar uygun bir kapanış betimleyicisi bulunamazsa son satırda bir çözümleme hatası oluşacaktır.
Yorumlu metinler sınıf özelliklerini ilklendirmek için kullanılamazlar. PHP 5.3'ten beri bu sınırlama sadece değişken içeren yorumlu metinler için geçerlidir. Bunun yerine yorumsuz metinler kullanılabilir.
Örnek 1 - Geçersiz örnek
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Yorumlu metinler tıpkı çift tırnaklı dizgeler gibi davranırlar. Yorumlu metin çift tırnaklar arasına alınmaz ve metin içindeki çift tırnak imlerinin tersbölü ile öncelenmesi gerekmez, ancak yukarıda çift tırnaklı dizgeler için belirtilen öncelem kodları kullanılabilir. Değişkenler yorumlanır, fakat yorumlanan metin içinde yer alan karmaşık değişkenler ifade edilirken dizgelerde dikkate alınması gerekenler yorumlu metinlerde de dikkate alınmalıdır.
Örnek 2 - Yorumlu metin örneği
<?php
$str = <<<EOD
Yorumlu metin sözdizimi
kullanılarak çok sayıda
satıra bölünmüş dizge örneği.
EOD;
/* Değişkenlerin de kullanıldığı daha karmaşık bir örnek */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Kimimben';
echo <<<EOT
Adım "$name" ve işim $foo->foo basmak.
Şimdi {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41\n
EOT;
?>
Yukarıdaki örneğin çıktısı:
Adım "Kimimben" ve işim Foo basmak. Şimdi Bar2 basıyorum. Bu büyük 'A' basmalı: A
Ayrıca işlev değiştirgesinde veri aktarırken de yorumlu metin kullanılabilir:
Örnek 3 - Değiştirgelerde yorumlu metin kullanımı
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
PHP 5.3.0'dan itibaren, duruk değişkenleri ve sınıf özelliklerini veya sabitlerini yorumlu metin sözdizimini kullanarak ilklendirmek mümkündür:
Örnek 4 - Duruk değer olarak yorumlu metin kullanımı
<?php
// Duruk değişkenler
function foo()
{
static $bar = <<<LABEL
Burada hiçbir şey yok...
LABEL;
}
// Sınıf özellikleri ve sabitleri
class foo
{
const BAR = <<<FOOBAR
Sınıf sabiti örneği
FOOBAR;
public $baz = <<<FOOBAR
Özellik örneği
FOOBAR;
}
?>
PHP 5.3.0 ile ayrıca, yorumlu metinlerin bildiriminde çift tırnak kullanımı olasılığı da dikkate alınmıştır:
Örnek 5 - Yorumlu metin bildiriminde çift tırnak kullanımı
<?php
echo <<<"TIRNAKLI"
Merhaba Dünya!
TIRNAKLI;
?>
Bilginize: Yorumlu metin desteği PHP 4'te eklenmiştir.
Yorumlu metinlerin çift tırnaklı dizgelere karşılık gelmesi gibi yorumsuz metinler de tek tırnaklı dizgelere karşılık gelir. Yorumsuz metinler de yorumlular gibi belirtilir ama, yorumsuz metin içinde çözümleme yapılmaz. Yorumsuz metinler, PHP kodlarını veya büyük metin bloklarını herhangi bir önlem almaksızın içine yerleştirmek için elverişlidirler. Belirtilen metin bloğunun çözümlenmemesinden dolayı SGML'nin <![CDATA[ ]]> oluşumu ile benzer özelliklere sahiptir.
Yorumsuz metin de yorumlu metindeki <<< dizgesini kullanır fakat betimleyicisi tek tırnak içine alınır; yani, şuna benzer: <<<'EOT'. Yorumlu metin için geçerli tüm diğer kurallar yorumsuz metin için de geçerlidir; özellikle de kapanış betimleyici ile ilgili olanlar.
Örnek 6 - Yorumsuz metin örneği
<?php
$str = <<<'EOD'
Yorumlu metin sözdizimi
kullanılarak çok sayıda
satıra bölünmüş dizge örneği.
EOD;
/* Değişkenli daha karmaşık bir örnek. */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Kimimben';
echo <<<'EOT'
İsmim "$name" ve işim $foo->foo basmak.
Artık {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41
EOT;
?>
Yukarıdaki örneğin çıktısı:
İsmim "$name" ve işim $foo->foo basmak.
Artık {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41Bilginize: Yorumlu metinlerin aksine yorumsuz metinler herhangi bir duruk veri bağlamında kullanılabilirler. Sınıf özelliklerini veya sabitlerini yorumsuz metin kullanarak ilklendirme örneği:
Örnek 7 - Duruk veri örneği
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Bilginize: Yorumlu metin desteği PHP 5.3.0'da eklenmiştir.
Bir dizge çift tırnaklar arasında veya bir yorumlu metin olarak belirtilmişse içindeki değişkenler çözümlenir.
İki sözdizimi türü vardır: Biri basit, diğeri karmaşık. Basit sözdizimi en çok kullanılanı ve elverişli olanıdır; bir değişken, bir dizi değeri veya bir nesne özelliğini bir dizge içinde en az çabayla kullanmayı sağlar.
Karmaşık sözdizimi PHP4'ten itibaren kullanılmakta olup ifadeyi sarmalayan kaşlı ayraçlar biçiminde kendini gösterir.
Çözümleyici, bir dolar imine ($) rastlandığında, geçerli bir değişken ismi oluşturmak için alabildiği bütün dizgecikleri açgözlülükle toplar. Değişken isminin kaşlı ayraçlar arasına alınması ismin sonunun açıkça belirtilmesini sağlar.
<?php
$bira = 'Bira';
echo "$bira'nın tadı berbattır"; // çalışır; "'" değişken adında geçersizdir
echo "$biralar geldi"; // çalışmaz; 'lar' değişken isminde geçerlidir
// ama değişken "$biralar" değildir.
echo "${bira}lar geldi"; // çalışır
echo "{$bira}lar geldi"; // çalışır
?>
Bir dizi indisi veya bir nesne özelliği de benzer şekilde çözümlenebilir. Dizi indislerinde indis sonunu, kapayan köşeli ayraç (]) belirler. Aynı kural, basit değişkenler olarak nesne özelliklerine de uygulanır.
<?php
// Bu örnekler dizge içinde dizi kullanımına özgüdür.
// Dizilerin dizgesel anahtarları daima tırnak içine alınır,
// bu amaçla kaşlı ayraçlar kullanılmaz.
// Bütün hataları görelim
error_reporting(E_ALL);
$meyve = array('çilek' => 'kırmızı', 'muz' => 'sarı');
// Çalışır, fakat bunun dizge dışında farklı çalışacağına dikkat edin
echo "Bir muz $meyve[muz] renktedir.";
// Çalışır
echo "Bir muz {$meyve['muz']} renktedir.";
// çalışır, fakat PHP aşağıda açıklandığı gibi önce muz adında bir sabit arar
echo "Bir muz {$meyve[muz]} renktedir.";
// Çalışmaz, kaşlı ayraç kullanın. Bir çözümleme hatasına yol açar.
echo "Bir muz $meyve['muz'] renktedir.";
// Çalışır
echo "Bir muz " . $meyve['muz'] . " renktedir.";
// Çalışır
echo "Bu karenin bir kenarı $square->width metre uzunluktadır.";
// Çalışmaz. Çözüm için karmaşık sözdizimine bakın.
echo "Bu karenin bir kenarı $square->width00 santimetre uzunluktadır.";
?>
Bunlardan daha karmaşık herşey için karmaşık sözdizimini kullanmalısınız.
Buna karmaşık denmesinin sebebi sözdiziminin karmaşıklığı değil, karmaşık ifadelerin kullanımını mümkün kılmasıdır.
Aslında, isim alanındaki her değer, bir dizge içinde bu sözdizimi ile yer alabilir. İfade basitçe dizge dışındaki gösterimiyle yazılıp { ve } arasına alınır. { öncelenemeyeceğinden bu sözdizimi sadece $ iminin { iminin hemen ardında yer aldığı durumlarda tanınır. {\$ kullanımı bir sayıl {$ alınmasıyla sonuçlanır. Bazı örnekler:
<?php
// Tüm hataları görelim
error_reporting(E_ALL);
$şahane = 'harika';
// Çalışmaz, çıktısı: Bu çok { harika}
echo "Bu çok { $şahane}";
// Çalışır, çıktısı: Bu çok harika
echo "Bu çok {$şahane}";
echo "Bu çok ${şahane}";
// Çalışır
echo "Bu karenin bir kenarı {$square->width}00 santimetre uzunluktadır.";
// Çalışır
echo "Bu çalışır: {$arr[4][3]}";
// $foo[bar] bir dizge dışında neden yanlışsa bu da o yüzden yanlıştır.
// Yani, bu yine de çalışır fakat PHP önce foo adında bir sabit
// arayacağından çalışır; bununla birlikte E_NOTICE seviyesinde
// bir hata oluşacaktır (tanımsız sabit).
echo "Bu yanlış: {$arr[foo][3]}";
// Çalışır. Çok boyutlu dizileri dizgelerin içinde kullanılırken,
// dizileri daima kaşlı ayraçlar arasına alın.
echo "Bu çalışır: {$arr['foo'][3]}";
// Çalışır.
echo "Bu çalışır: " . $arr['foo'][3];
echo "Bu da çalışır: {$obj->values[3]->name}";
echo "$name adlı değişkenin değeri: {${$name}}";
echo "Adı getName() işlevinin dönüş değeri olan değişkenin değeri: {${getName()}}";
echo "Adı \$object->getName() yönteminin dönüş değeri olan değişkenin değeri: {${$object->getName()}}";
?>
Bu sözdizimini kullanan dizgeler içindeki değişkenler üzerinden de sınıf özelliklerine erişmek mümkündür.
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
Yukarıdaki örneğin çıktısı:
Bilginize: İşlev ve yöntem çağrılarının, duruk sınıf değişkenlerinin ve sınıf sabitlerinin {$} içinde çağrılması PHP 5'ten beri çalışmaktadır. Erişilen değer, dizgenin tanımlandığı etki alanındaki bir değişkenin ismi olarak yorumlanır. Kaşlı ayraçların tek başına kullanımı ({}), duruk sınıf değişkenlerinin veya sınıf sabitlerinin değerlerine veya işlev ve yöntemlerin dönüş değerlerine erişim için kullanılmaz.
<?php
// Tüm hatalar gösterilsin.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// Bu çalışır; çıktısı: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// Bu da çalışır; çıktısı: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
Dizgelerin içindeki karakterlere, dizilerin köşeli ayraçları arasında karakterin dizinin başlangıcından itibaren (ilk karakterin indisi sıfır olmak üzere) kaçıncı karakter olduğu belirtilerek ($dizge[42] gibi) erişilebilir veya o karakterde değişiklik yapılabilir. Dizgeler bu nedenle bir karakter dizisi olarak düşünülür.
Bilginize: Dizge karakterlerine ayrıca $str{42} biçeminde kaşlı ayraçlar kullanılarak da erişilebilirse de bu sözdiziminin kullanımı PHP 5.3.0 itibariyle önerilmemektedir. Bu amaçla kaşlı ayraçları değil, daima köşeli ayraçları tercih edin; örnek: $str[42].
Karakter indisi olarak dizgenin uzunluğundan büyük bir değer belirtmek, dizgenin sonuna boşlukların eklenmesine sebep olur. Tamsayı olmayan indis değerleri tamsayıya dönüştürülür. Kuraldışı indis belirtimi E_NOTICE'e sebep olur. Yazma sırasında negatif indisler bir E_NOTICE çıktılanmasına sebep olurken okuma işlemi boş dizge okunmasıyla sonuçlanır. Atanmış bir dizgenin sadece ilk karakteri kullanılır. Boş dizge atamak NULL atamasıyla sonuçlanır.
Örnek 8 - Bazı dizge örnekleri
<?php
// Dizgenin ilk karakterini alalım
$str = 'This is a test.';
$first = $str[0];
// Dizgenin üçüncü karakterini alalım
$third = $str[2];
// Dizgenin son karakterini alalım
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Dizgenin son karakterini değiştirelim
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
Bilginize: Diğer türlerdeki değişkenlere [] veya {} kullanarak erişme çabası NULL dönmesiyle sonuçlanır.
Dizgeler '.' (nokta) işleci kullanılarak ardarda eklenebilir. '+' (toplama) işlecinin bu amaçla kullanımının yararsız oluşuna dikkat ediniz. Daha ayrıntılı bilgi edinmek için Dizge İşleçleri belgesine bakınız.
Dizgelerde değişiklik yapmak için çok sayıda yararlı işlev mevcuttur.
Genel işlevler için Dizge İşlevlerine, ileri düzey bul ve değiştir işlevselliği için düzenli ifade işlevlerine veya Perl uyumlu düzenli ifade işlevlerine bakınız.
Ayrıca, URL dizgeleri için işlevler ve dizgeleri şifrelemek veya şifrelerini çözmek için mcrypt ve mhash işlevleri vardır.
Son olarak, karakter türü işlevlerine de bakabilirsiniz.
Bir değer bir dizgeye (string) tür çarpıtması veya strval() işleviyle dönüştürülür. Bir dizgenin gerekli olduğu ifade bağlamlarında dizgeye dönüşüm özdevinimli olarak gerçekleşir. Bu genellikle, echo() veya print() işlevleri kullanılırken veya bir değişken bir dizge ile karşılaştırılırken gerçekleşir. Aşağıdakilere, Türler ve Tür Dönüşümü bölümlerinde daha ayrıntılı değinilmiştir. Ayrıca, settype() işlevine de bakabilirsiniz.
boolean türündeki TRUE değeri string türündeki "1" değerine dönüştürülür. boolean türündeki FALSE değeri string türündeki "" değerine (boş dizgeye) dönüştürülür. Bu şekilde, boolean ve string değerler arasında her iki yönde de dönüşüm yapılabilmektedir.
integer veya float türünde bir değerin string türüne dönüşümü sayının dizgesel gösterimiyle (üstel gösterim dahil) sonuçlanır. Kayan noktalı sayılar üstel gösterim kullanılarak dönüştürülebilir (4.1E+6 gibi).
Bilginize: Ondalık nokta karakteri betiğin çalıştığı yerele (LC_NUMERIC) özgüdür. Bakınız: setlocale() işlevi.
Diziler daima "Array" dizgesine dönüştürülür; bundan dolayı echo() ve print() bir dizinin içeriğini kendiliklerinden gösteremezler. Tek bir dizi elemanını görüntüleyebilmek için echo $arr['foo'] gibi bir oluşum kullanınız. İçeriğin tamamının görüntülenebilmesiyle ilgili ipuçları için aşağıya bakınız.
object türler PHP 4'te daima "Object" dizgesine dönüştürülür. Nesne özelliklerinin değerlerini hata ayıklama amacıyla basmak için aşağıdaki paragrafı okuyunuz. Nesne sınıfının ismini öğrenmek için get_class() işlevini kullanınız. PHP 5 itibariyle, uygulanabildiği takdirde, __toString yöntemi kullanılır.
resource türler daima "Resource id #1" benzeri bir dizgeye dönüştürülürler; buradaki 1, özkaynağa PHP tarafından çalışma anında atanan eşsiz bir sayıdır. Bu yapıya güvenmeseniz iyi olur; ilerde değişebilir. Özkaynağın türünü öğrenmek için get_resource_type() işlevini kullanınız.
NULL daima boş bir dizgeye dönüştürülür.
Yukarıda bahsedildiği gibi, bir diziyi, nesneyi veya özkaynağı doğrudan dönüştürmek, bunların değerleri hakkında işe yarar hiçbir bilgi sağlamaz. Bu tür içerikleri daha verimli şekilde incelemek isterseniz print_r() ve var_dump() işlevlerine bakınız.
Çoğu PHP değeri kalıcı olarak saklamak amacıyla dizgelere dönüştürülebilir. Bu yönteme dizgeleştirme adı verilir ve serialize() işlevi tarafından gerçekleştirilir. Eğer PHP motoru WDDX desteğiyle derlenmişse PHP değerleri ayrıca iyi biçimli XML metin olarak da dizgeleştirilebilir.
Bir dizge, sayısal bir bağlamda değerlendirildiğinde sonuçlanacak değer ve türün nasıl belirleneceği aşağıda açıklanmıştır.
Dizge, '.', 'e' veya 'E' karakterlerini içermiyorsa ve sayısal değeri PHP_INT_MAX ile tanımlanan genişlikte bir tamsayı ise string tür bir integer tür olarak, aksi takdirde bir float olarak değerlendirilir.
Değerin dizgenin başında belirtileceği varsayılır. Eğer dizge geçerli bir sayısal veri ile başlıyorsa sayısal değer olarak bu kullanılır. Aksi takdirde değer 0 (sıfır) olacaktır. Geçerli sayısal veri isteğe bağlı bir işaret ile başlar, bir veya daha fazla sayıda rakam ile isteğe bağlı bir ondalık nokta içerebilir ve isteğe bağlı bir üstel gösterimle sona erer. Üs, 'e' veya 'E' harfini takibeden bir veya daha fazla rakamdan oluşur.
<?php
$foo = 1 + "10.5"; // $foo float'tır (11.5)
$foo = 1 + "-1.3e3"; // $foo float'tır (-1299)
$foo = 1 + "bob-1.3e3"; // $foo integer'dir (1)
$foo = 1 + "bob3"; // $foo integer'dir (1)
$foo = 1 + "10 Small Pigs"; // $foo integer'dir (11)
$foo = 4 + "10.2 Little Piggies"; // $foo float'tır (14.2)
$foo = "10.0 pigs " + 1; // $foo float'tır (11)
$foo = "10.0 pigs " + 1.0; // $foo float'tır (11)
?>
Bu dönüşüm nakkında daha ayrıntılı bilgi edinmek için strtod(3) Unix kılavuz sayfasına bakınız.
Bu bölümdeki örneklerden birini denemek isterseniz örnekleri kopyala/yapıştır yöntemiyle aşağıdaki satıra yerleştirip neler olup bittiğini görebilirsiniz:
<?php
echo "\$foo==$foo; " . gettype ($foo) . " türündedir<br />\n";
?>
Tamsayıya dönüştürerek C'deki gibi bir karakterin kodunu alabilmeyi beklemeyin. Karakter/ASCII kod dönüşümleri için ord() ve chr() işlevlerini kullanınız.
arrayPHP'de bir dizi aslında sıralı bir eşlemdir. Bir eşlem, değerleri anahtarlarla ilişkilendiren bir veri türüdür. Bu veri türü farklı kullanım amaçları için en iyilenebilir; bir dizi, bir yöneysel liste, bir isim-değer çiftleri tablosu, bir sözlük, bir nesne listesi, yığıt, kuyruk ve daha bir sürü başka şey olarak ele alınabilir. Dizilerin değerleri, ağaçlar, diziler ve hatta çok boyutlu diziler bile olabilir.
Tüm bu veri yapılarının açıklanması bu kılavuzun amacını aşar. Fakat, en azından her biri için birer örnek verilebilir. Bu konuda daha fazla bilgi edinmek için bu konuyla ilgili olarak yayımlanmış eserleri inceleyiniz.
Bir dizi array() işlevi kullanılarak belirtilebilir. Değiştirge olarak, birbirlerinden virgüllerle ayrılmış çok sayıda anahtar => değer çifti alabilir.
array( anahtar => değer , ... ) // anahtar sadece integer veya string türünde olabilir. // değer herhangi bir türde herhangi bir değer olabilir.
<?php
$dizi = array("fu" => "bar", 12 => true);
echo $dizi["fu"]; // bar
echo $dizi[12]; // 1
?>
Bir anahtar ya integer ya da string türünde olabilir. Bir anahtar, sadece onluk tamsayı gösterimiyle belirtilmişse bir tamsayı anahtar olarak yorumlanır. Yani, "8" belirtilmeşse bu tamsayı 8 olarak ele alınacak ama "08" belirtilmişse dizge "08" olarak ele alınacaktır. float türünde belirtilen bir anahtar integer türüne aşağı yuvarlanır. PHP için indisli ve ilişkisel diziler, her ikisi de integer ve string türünde indisler içerebildiğinden aynı çeşitten dizilerdir.
değer herhangi bir PHP türünde herhangi bir değer olabilir.
Bilginize: Tanımlanmamış bir dizi anahtarına erişmeye çalışmakla tanımsız bir değişkene erişmeye çalışmak arasında fark yoktur: E_NOTICE seviyesinde bir hata iletisi çıktılanır ve sonuç NULL olur
<?php
$dizi = array("birdizi" => array(6 => 5, 13 => 9, "a" => 42));
echo $dizi["birdizi"][6]; // 5
echo $dizi["birdizi"][13]; // 9
echo $dizi["birdizi"]["a"]; // 42
?>
Bir anahtar belirtmeksizin bir değer atanıyorsa değer, mevcut tamsayı anahtarların en büyüğüne bir eklenerek elde edilen tamsayı anahtarlı elemana atanır. Bir anahtar mevcut anahtarlardan biriyle değer atıyorsa, yeni değer mevcut eleman değerinin üzerine yazılır.
<?php
// Bu iki dizi birbirinin aynıdır:
array(5 => 43, 32, 56, "b" => 12);
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>
PHP 4.3.0 öncesinde, en büyük indisi bir negatif tamsayı olan bir diziye anahtarsız değer atanması durumunda değere anahtarı yukarıda açıklandığı gibi atanırdı. PHP 4.3.0 ve sonrasında ise böyle bir durumda yeni değer 0 anahtarına atanmaktadır.
anahtar olarak TRUE belirtilirse bu tamsayı 1 olarak, FALSE belirtilirse tamsayı 0 olarak yorumlanır. anahtar olarak NULL kullanımı bir boş dizge olarak yorumlanır. Boş dizgeyle anahtar belirtimi, yeni değerin boş dizge anahtarlı olarak atanmasına sebep olur ve bu, anahtar belirtmeksizin (boş köşeli ayraçlarla) atama yapmak anlamında değerlendirilmez.
array veya object türünde anahtar belirtilemez. Aksi takdirde şöyle bir uyarı alırsınız: Illegal offset type (Kuraldışı konumlama türü).
Mevcut bir dizi, doğrudan değer atamak suretiyle değiştirilebilir.
Bu işlem, diziye köşeli ayraçlar arasında belirtilen bir anahtar kullanılarak değer atamak biçeminde yapılır. Diziye yeni bir değer atamak için köşeli ayraçlar boş olarak ([]) belirtilebilir.
$dizi[anahtar] = değer; $dizi[] = değer; // anahtar sadece integer veya string türünde olabilir. // değer herhangi bir türde herhangi bir değer olabilir.
$dizi mevcut değilse oluşturulur, dolayısıyla bu da yeni bir dizi oluşturma yöntemidir. Belli bir değeri değiştirmek için yeni değer elemana mevcut anahtar kullanılarak atanır. Belli bir elemanı (anahtar/değer çiftini) diziden silmek için unset() işlevi kullanılır.
<?php
$dizi = array(5 => 1, 12 => 2);
$dizi[] = 56; // Betiğin bu noktasında bu atama
// $dizi[13] = 56; ile aynıdır
$dizi["x"] = 42; // "x" anahtarlı yeni bir eleman atar
unset($dizi[5]); // Elemanı diziden siler
unset($dizi); // Dizinin tamamını siler
?>
Bilginize: Yukarıda değinildiği gibi, bir diziye yeni değeri bir anahtar belirtmeden atamak, mevcut en büyük tamsayı indisine bir eklenerek elde edilen anahtar kullanılarak gerçekleşir. Dizide henüz bir tamsayı indis yoksa anahtar olarak 0 (sıfır) kullanılır.
Dikkat ederseniz, dizinin mevcut olması halinde, yeni bir değer atamak için en büyük tamsayı indisli anahtar kullanmaya gerek yoktur. Buna sadece dizi yeniden indislenmişse gerek olabilir. Aşağıdaki örnek anlatımı pekiştirecektir:
<?php
// Basit bir dizi oluşturalım.
$dizi = array(1, 2, 3, 4, 5);
print_r($dizi);
// Şimdi bütün elemanları silelim ama dizi kalsın:
foreach ($dizi as $i => $value) {
unset($dizi[$i]);
}
print_r($dizi);
// Bir eleman ekleyelim (dikkat: yeni anahtar 0 değil 5 olacak!)
$dizi[] = 6;
print_r($dizi);
// Yeniden indisleyelim:
$dizi = array_values($dizi);
$dizi[] = 7;
print_r($dizi);
?>Yukarıdaki örneğin çıktısı:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Dizilerle çalışmak için kullanılabilecek işlevlerin tamamını Dizi İşlevleri bölümünde bulabilirsiniz.
Bilginize: unset() işlevi bir diziden anahtar silmeyi mümkün kılar. Ama bu silme işlemi dizinin yeniden indislenmesiyle sonuçlanmaz. Eğer silme işleminin gerçekten "sil ve kaydır" yapmasını istiyorsanız, anahtarı sildikten sonra array_values() işlevini kullanarak diziyi yeniden indislemelisiniz.
<?php
$a = array(1 => 'bir', 2 => 'iki', 3 => 'üç');
unset($a[2]);
/* Bu silme işlemi dizi şöyle tanımlanmış gibi sonuçlanacaktır:
$a = array(1 => 'bir', 3 => 'üç');
böyle DEĞİL:
$a = array(1 => 'bir', 2 =>'üç');
*/
$b = array_values($a);
// $b artık array(0 => 'bir', 1 =>'üç') olmuştur
?>
foreach denetim yapısı özellikle diziler için tasarlanmıştır. Diziler üzerinde hareket edilmesini kolaylaştırır.
Bir dizge sayıllı indis daima tırnak içinde kullanılır. Örneğin, $foo[bar] yanlışken $foo['bar'] doğrudur. Ama, neden? Eski betiklerde şu sözdizimine sıkça rastlanır:
<?php
$foo[bar] = 'düşman';
echo $foo[bar];
// ve saire
?>
Bu yanlıştır, ama çalışır. Bunun sebebi, bu kodun bir dizgeden ziyade tanımsız bir sabit (bar) belirtiyor olmasıdır. PHP ilerde şans eseri ismi aynı zamanda değeri olan bir sabit tanımlayabilir. PHP özdevinimli olarak bir çıplak dizgeyi (tırnak içine alınmamış bir dizgeyi), bu çıplak dizgeyi içeren bir dizgeye dönüştüreceğinden bu çalışır. Örneğin, bar isminde tanımlanmış bir sabit yoksa, PHP bar sabitine 'bar' dizgesini yerleştirecek ve bunu kullanacaktır.
Bilginize: Bu, "anahtarlar daima tırnak içine alınır" demek değildir. sabitleri ve değişkenleri tek tırnak içine almayın, çünkü o zaman yorumlanmazlar.
<?php
error_reporting(E_ALL);
ini_set('hataları_göster', true);
ini_set('html_hataları', false);
// Basit bir dizi:
$dizi = array(1, 2);
$sayaç = count($dizi);
for ($i = 0; $i < $sayaç; $i++) {
echo "\n$i indisi inceleniyor: \n";
echo "Kötü: " . $dizi['$i'] . "\n";
echo "İyi: " . $dizi[$i] . "\n";
echo "Kötü: {$dizi['$i']}\n";
echo "İyi: {$dizi[$i]}\n";
}
?>Yukarıdaki örneğin çıktısı:
0 indisi inceleniyor: Notice: Undefined index: $i in /dosya/yolu/betik.php on line 10 Kötü: İyi: 1 Notice: Undefined index: $i in /dosya/yolu/betik.php on line 12 Kötü: İyi: 1 1 indisi inceleniyor: Notice: Undefined index: $i in /dosya/yolu/betik.php on line 10 Kötü: İyi: 2 Notice: Undefined index: $i in /dosya/yolu/betik.php on line 12 Kötü: İyi: 2
Bu davranışla ilgili diğer örnekler:
<?php
// Tüm hataları görelim
error_reporting(E_ALL);
$dizi = array('meyve' => 'elma', 'sebze' => 'havuç');
// Doğru
print $dizi['meyve']; // elma
print $dizi['sebze']; // havuç
// Yanlış. Bu çalışır, fakat meyve tanımlanmamış bir sabit
// olmadığından E_NOTICE seviyesinde bir PHP hatası oluşur
//
// Notice: Use of undefined constant meyve - assumed 'meyve'...
print $dizi[meyve]; // elma
// Bu, neler olup bittiğini gösteren bir sabit tanımlar;
// 'sebze' değeri meyve sabitine atanır.
define('meyve', 'sebze');
// Şimdi farkı görelim
print $dizi['meyve']; // elma
print $dizi[meyve]; // havuç
// Bir dizge içinde olduğundan bu da doğrudur.
// Dizge içinde kalan sabitler, sabit olarak ele alınmazlar;
// dolayısıyla burada bir E_NOTICE oluşmaz.
print "Turfanda $dizi[meyve]"; // Turfanda elma
// Bir istisna: Dizge içinde kaşlı ayraç içine alınmış
// sabitler, sabit olarak ele alınırlar.
print "Turfanda {$dizi[meyve]}"; // Turfanda havuç
print "Turfanda {$dizi['meyve']}"; // Turfanda elma
// Bu çalışmaz ve şöyle bir çözümleme hatasıyla sonuçlanır:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Bu, dizgeler içindeki süper küresellere de uygulanır.
print "Turfanda $dizi['meyve']";
print "Turfanda $_GET['foo']";
// Ard arda eklemek de bir seçenektir
print "Turfanda " . $dizi['meyve']; // Turfanda elma
?>
error_reporting yönergesine E_NOTICE seviyesinden hataları gösterecek bir atama yapılırsa (örneğin, E_ALL atanarak), böyle kullanımlar hemen görünür duruma gelir. error_reporting yönergesinin öntanımlı değeriyle E_NOTICE seviyesinden hatalar gösterilmez.
Sözdizimi bölümünde değinildiği gibi, köşeli ayraçlar ('[' ve ']') içinde belirtilenlerin birer ifade olması gerekir. Yani, aşağıdaki gibi bir kod çalışacaktır:
<?php
echo $dizi[birişlev($bar)];
?>
Bu, bir işlevin dönüş değerinin dizi indisi olarak kullanımına bir örnektir. PHP kendi sabitlerini de tanır:
<?php
$error_descriptions[E_ERROR] = "Ölümcül bir hata oluştu";
$error_descriptions[E_WARNING] = "PHP bir uyarı verdi";
$error_descriptions[E_NOTICE] = "Bu sadece bilgilendirici bir uyarı";
?>
E_ERROR sabitinin de ilk örnekteki bar kadar geçerli bir betimleyici oluşuna dikkat ediniz. Fakat, E_ERROR eşittir 1, vb. olduğundan aşağıdaki örnek de aynı işi yapar:
<?php
$error_descriptions[1] = "Ölümcül bir hata oluştu";
$error_descriptions[2] = "PHP bir uyarı verdi";
$error_descriptions[8] = "Bu sadece bilgilendirici bir uyarı";
?>
Bilinmeyen bir gelecekte PHP ekibi başkalarının kodlarıyla çelişen bir
sabit, bir anahtar sözcük veya bir değişken eklemek isteyebilir.
Örneğin, empty ve default birer anahtar sözcük olduklarından bu amaçla
kullanılmaları yanlıştır.
Bilginize: Yinelemek gerekirse, çift tırnak imleri arasına alınmış bir dizge, dizi indisini tırnak içine almadığından geçerlidir; yani, "$foo[bar]" geçeridir. Yukarıdaki örnekleri bu gözle tekrar inceleyin ve ayrıca dizgelerin içinde değişken çözümleme bölümüne de bakın.
integer, float, string, boolean veya resource türünde bir değeri array türünde bir değere dönüştürme işlemi, sıfır indisli bir elemana bu değerin atanması ile sonuçlanır. Başka bir deyişle, (array)$sayılDeğer ile array($sayılDeğer) arasında bir fark yoktur.
Bir object türü array türüne dönüştürme işlemi, elemanları nesnenin üyeleri olan bir dizi ile sonuçlanır. Anahtarlar, bir kaç istisnai durum dışında üyelerin isimleridir: Tamsayı özellikler erişilebilir değildir; private değişkenlerin önüne sınıf isimleri getirilir; public değişkenlerin önünde bir '*' olur. Diğer taraftan, başlarına birşeyler eklenmiş böyle değişkenlerin değerleri NULL olur. Bu durum beklenmedik davranışlara yol açabilir:
<?php
class A {
private $A; // Bu '\0A\0A' haline gelir.
}
class B extends A {
private $A; // Bu '\0B\0A' haline gelir.
public $AA; // Bu 'AA' haline gelir.
}
var_dump((array) new B());
?>
Bu örneğin çıktısı 'AA' isimli iki anahtar görüntülerse de onlardan birinin ismi aslında '\0A\0A''dır.
NULL, bir diziye dönüştürülmek istenirse sonuç boş bir dizi olur.
Dizileri array_diff() işleviyle veya dizi işleçleri kullanılarak karşılaştırmak mümkündür.
PHP'nin array türü çok yeteneklidir. Bazı örnekler:
<?php
// Bu:
$a = array( 'renk' => 'kırmızı',
'lezzet' => 'tatlı',
'şekil' => 'yuvarlak',
'isim' => 'elma',
4 // anahtarı 0 olacaktır
);
$b = array('a', 'b', 'c');
// . . . buna tamamen eşdeğerdir:
$a = array();
$a['renk'] = 'kırmızı';
$a['lezzet'] = 'tatlı';
$a['şekil'] = 'yuvarlak';
$a['isim'] = 'elma';
$a[] = 4; // anahtarı 0 olacaktır
$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// Yukarıdaki kod çalıştırıldığında $a, array('renk' => 'kırmızı',
// 'lezzet' => 'tatlı', 'şekil' => 'yuvarlak', 'isim' => 'elma', 0 => 4)
// dizisiyle, $b ise array(0 => 'a', 1 => 'b', 2 => 'c') veya basitçe
// array('a', 'b', 'c') dizisiyle sonuçlanacaktır.
?>
Örnek 1 - array() kullanımı
<?php
// Özellik eşlemeli dizi
$map = array( 'sürüm' => 4,
'sistem' => 'Linux',
'dil' => 'english',
'kısaltma' => true
);
// tamamen sayısal anahtarlar
$dizi = array( 7,
8,
0,
156,
-10
);
// Bu, array(0 => 7, 1 => 8, ...) ile aynıdır
$geçişli = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // anahtar = 6 (en büyük tamsayı indis 5 idi)
'8' => 2, // anahtar = 8 (tamsayı!)
'02' => 77, // anahtar = '02'
0 => 12 // 10 değerinin üzerine 12 yazılacak
);
// boş dizi
$boş = array();
?>
Örnek 2 - Derlem
<?php
$renkler = array('Turuncu', 'Pembe', 'Mor', 'Turkuaz');
foreach ($renkler as $renk) {
echo "$renk rengi sever misiniz?\n";
}
?>
Yukarıdaki örneğin çıktısı:
Turuncu rengi sever misiniz? Pembe rengi sever misiniz? Mor rengi sever misiniz? Turkuaz rengi sever misiniz?
PHP5'ten beri dizi değerleri gönderimli aktarıldıklarından dizi değerlerini doğrudan değiştirmek mümkündür. Fakat arada bazı şeyler yapmak gerekir:
Örnek 3 - Derlem
<?php
<?php
$renkler = array('Turuncu', 'Pembe', 'Mor', 'Turkuaz');
// PHP 5
foreach ($renkler as &$renk) {
$renk = strtoupper($renk);
}
unset($renk); /* Aşağıdaki atamalarda $renk son
dizi elemanını değiştirmesin */
// Eski sürümü yeniden elde edelim
foreach ($renkler as $anahtar => $renk) {
$renkler[$anahtar] = strtoupper($renk);
}
print_r($renkler);
?>
Yukarıdaki örneğin çıktısı:
Array
(
[0] => TURUNCU
[1] => PEMBE
[2] => MOR
[3] => TURKUAZ
)
Bu örnekte dizi indisleri 1'den başlatılmaktadır.
Örnek 4 - İndisi 1'den başlatmak
<?php
$ilkçeyrek = array(1 => 'Ocak', 'Şubat', 'Mart');
print_r($ilkçeyrek);
?>
Yukarıdaki örneğin çıktısı:
Array
(
[1] => Ocak
[2] => Şubat
[3] => Mart
)
Örnek 5 - Diziyi doldurmak
<?php
// bir diziyi bir dizin'in içeriği ile dolduralım
$tutamak = opendir('.');
while (false !== ($dosya = readdir($tutamak))) {
$dosyalar[] = $dosya;
}
closedir($tutamak);
?>
Diziler sıralıdır. Sıralama çeşitli sıralama işlevleri ile değiştirilebilir. Daha fazla bilgi için Dizi İşlevleri bölümüne bakınız. Bir dizinin eleman sayısını öğrenmek için count()işlevi kullanılabilir.
Örnek 6 - Dizi elemanlarının sıraya sokulması
<?php
sort($dosyalar);
print_r($dosyalar);
?>
Bir dizinin elemanlarına her türlü değer atanabileceğinden başka bir dizi de atanabilir. Böylece iç içe ve çok boyutlu dizilerin oluşturulması mümkün olur.
Örnek 7 - İç içe ve çok boyutlu diziler
<?php
$yemişler = array ( "yemişler" => array ( "a" => "iğde",
"b" => "badem",
"c" => "ceviz"
),
"sayılar" => array ( 1,
2,
3,
4,
5,
6
),
"yuvalar" => array ( "birinci",
5 => "ikinci",
"üçüncü"
)
);
// Yukarıdaki dizinin değerlerinin kullanıldığı bazı örnekler
echo $yemişler["yuvalar"][5]; // "ikinci" basar
echo $yemişler["meyveler"]["a"]; // "iğde" basar
unset($yemişler["yuvalar"][0]); // "birinci" silinir
// Yeni bir çok boyutlu dizi oluşturalım
$meyveler["elma"]["yeşil"] = "ekşi";
?>
Dizi atamaları daima değerleri kopyalamak şeklinde gerçekleşir. Bir diziyi gönderimli olarak kopyalamak için gönderim işleci kullanılır.
<?php
$dizi1 = array(2, 3);
$dizi2 = $dizi1;
$dizi2[] = 4; // $dizi2 değişti,
// $dizi1 hala array(2, 3)
$dizi3 = &$dizi1;
$dizi3[] = 4; // şimdi $dizi1 ve $dizi3 aynı
?>
objectYeni bir nesne oluşturmak için (bir sınıfın bir örneğini oluşturmak için) new deyimi kullanılır:
<?php
class kediler
{
function birŞeySöyle()
{
echo "Miyav.";
}
}
$kedi = new kediler;
$kedi->birŞeySöyle();
?>
Çok daha ayrıntılı bilgiyi Sınıflar ve Nesneler faslında bulabilirsiniz.
object türüne dönüşümEğer object türünde bir değer object türüne dönüştürülürse bir değişiklik olmaz. Başka türde bir değer object türüne dönüştürülürse yerleşik stdClass sınıfının yeni bir örneği oluşturulmuş olur. Eğer değer NULL ise yeni örnek boş olur. Bir dizi object türüne dönüştürülürse dizi elemanlarının isimleri değerleriyle birlikte nesnenin özellikleri haline gelirler. Diğer değerler ise, scalar adlı üye değişkenin değeri haline gelirler.
<?php
$nesne = (object) 'heyo';
echo $nesne->scalar; // çıktısı: 'heyo'
?>
resourceresource türünde bir değişken harici bir özkaynağa bir gönderim içeren özel bir değişkendir. Özkaynaklar özel işlevler tarafından oluşturulur ve kullanılırlar. resource türüyle ilişkilendirilebilen özkaynakların ve özel işlevlerin bir listesini eklerde bulabilirsiniz.
Bilginize: resource türü PHP 4'ten itibaren mevcuttur.
Ayrıca, get_resource_type() işlevine de bakınız.
resource türüne dönüşümAçık dosyalara, veritabanı bağlantılarına, resim tuval alanlarına ve benzerlerine birer tanıtıcı sağlayan değişkenleri resource türüne dönüştürmenin bir anlamı yoktur.
PHP 4'ün Zend Motoru sayesinde gönderimsiz kalan özkaynaklar özdevinimli olarak saptanarak bunlara ayrılan bellek çöp toplayıcı tarafından serbest bırakılmaktadır. Bu sebeple bir özkaynağa ayrılan belleği serbest bırakmak ihtiyacı nadiren ortaya çıkar.
Bilginize: Kalıcı veritabanı bağlantıları bu kuralın bir istisnasıdır. Çöp toplayıcı tarafından yok edilmezler. Bu konuda daha ayrıntılı bilgi edinmek için kalıcı bağlantılar bölümüne bakınız.
NULLÖzel NULL değeri, değeri olmayan bir değişken anlamına gelir. NULL değerinin olası tek türü NULL'dur.
Bilginize: NULL türü PHP 4'ten itibaren mevcuttur.
Bir değişken NULL türündeyse:
Kendisine NULL sabiti atanmış demektir.
Kendisine herhangi bir değer atanmamış demektir.
unset() işlevine aktarılmış demektir.
NULL türünde, büyük-küçük harfe duyarlı olarak tek bir değer vardır: NULL.
<?php
$var = NULL;
?>
Bir değişkenin türü (null) ile çarpıtılırsa değişken değersiz bırakılarak tanımsız hale getirilmiş olur.
mixedmixed anahtar sözcüğü, bir değiştirgenin çok sayıda tür (ama hepsini değil) kabul edebileceğini belirtir.
Örneğin, str_replace() işlevi sadece string veya array türünde değer kabul ederken, gettype() işlevi tüm PHP türlerini kabul eder.
numbernumber anahtar sözcüğü, bir değiştirgenin integer veya float türünde değer kabul edeceğini belirtir.
callbackcall_user_func(), usort() gibi işlevler değiştirge olarak kullanıcı tanımlı geriçağırım işlevlerini kabul ederler. Geriçağırım işlevleri her zaman basit işlevler olmayabilir, nesne yöntemleri ve hatta duruk sınıf yöntemleri bile olabilirler.
Bir PHP işlevi, string türündeki ismiyle aktarılır. Şu dil oluşumları dışında herhangi bir yerleşik veya kullanıcı tanımlı işlev kullanılabilir: array(), echo(), empty(), eval(), exit(), isset(), list(), print() veya unset().
Örneklenmiş bir nesnenin bir yöntemi, nesnenin ismi 0. indiste, yöntem ismi 1. indiste yer alan bir dizi olarak aktarılır.
Duruk sınıf yöntemleri de sınıf ismi 0. indiste içerilerek, sınıf bir nesne olarak örneklenmeksizin aktarılabilir.
create_function() işlevi bildik kullanıcı tanımlı işlevlerden başka, bir anonim geriçağırım işlevi oluşturmak için de kullanılabilir. PHP 5.3.0'dan itibaren işleve değiştirge olarak bir anonim işlev aktarmak mümkün oldu.
Örnek 1 - Geriçağırım işlevi örnekleri
<?php
// Bir geriçağırım işlevi örneği
function geriçağırım_işlevim() {
echo 'merhaba dünya!';
}
// Bir geriçağırım yöntemi örneği
class Sınıfım {
static function geriçağırımYöntemim() {
echo 'Merhaba Dünya!';
}
}
// 1. tür: Basit geriçağırım
call_user_func('geriçağırım_işlevim');
// 2. tür: Duruk sınıf yöntemi çağrısı
call_user_func(array('Sınıfım', 'geriçağırımYöntemim'));
// 3. tür: Nesne yöntemi çağrısı
$nesne = new Sınıfım();
call_user_func(array($nesne, 'geriçağırımYöntemim'));
// 4. tür: Duruk sınıf yöntemi çağrısı (PHP 5.2.3 ve sonrası)
call_user_func('Sınıfım::geriçağırımYöntemim');
// 5. tür: Göreli duruk sınıf yöntemi çağrısı (PHP 5.2.3 ve sonrası)
class A {
public static function kimsin() {
echo "A\n";
}
}
class B extends A {
public static function kimsin() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::kimsin')); // A
?>
Örnek 2 - Anonim işlev kullanan bir geriçağırım işlevi örneği
<?php
// Anonim işlevimiz
$double = function($a) {
return $a * 2;
};
// Sayı aralığımız
$numbers = range(1, 5);
// Aralık içindeki her elemanın boyutunu
// ikiye katlamak için geriçağırım işlevi
// olarak burada anonim bir işlev kullanalım
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
Yukarıdaki örneğin çıktısı:
2 4 6 8 10
Bilginize: PHP4'te, kopyayı değil de asıl nesneyi işaret eden bir geriçağırım oluşturmak için gönderim kullanmak gerekir. Daha fazla bilgi için Gönderimler Hakkında bölümüne bakınız.
voidvoid bir dönüş türü olarak dönüş değerinin yararsız olduğu anlamına gelir. void bir değiştirge listesinde kullanıldığında işlevin değiştirge kabul etmediği anlamına gelir.
$... değiştirgesi işlev bildirimlerinde "ve benzerleri" anlamına gelir. Bu değişken ismi bir işlevde kullanıldığında işlev sonsuz sayıda değiştirge alabilir.
PHP değişken bildiriminde tür tanımlamayı gerektirmez (veya desteklemez); bir değişkenin türü kullanıldığı bağlama göre saptanır. Yani, string türünde bir değer $var değişkenine atanırsa $var, string türünde bir değişken haline gelir. $var değişkenine bir integer değer atanırsa $var, integer türünde bir değişken haline gelir.
Toplama işleci '+', PHP'nin özdevinimli tür dönüşümüne iyi bir örnektir. Bir toplama işleminde terimlerden biri float türündeyse her iki terim float olarak ele alınır ve sonuç float türünde olur. Aksi takdirde, terimler integer olarak yorumlanır ve sonuç integer türünde olur. Yalnız dikkat edin, bu işlem ne terimlerin kendi türlerini ne de ifadenin kendi türünü değiştirir.
<?php
$foo = "0"; // $foo string türündedir (ASCII 48)
$foo += 2; // $foo integer türündedir (2)
$foo = $foo + 1.3; // $foo float türündedir (3.3)
$foo = 5 + "10 Little Piggies"; // $foo integer türündedir (15)
$foo = 5 + "10 Small Pigs"; // $foo integer türündedir (15)
?>
Eğer yukarıdaki son iki örnek size tuhaf geldiyse Dizgelerin sayıya dönüşümü konusuna bakınız.
Bir değişkeni belli bir türe dönüşmeye zorlamak istiyorsanız Tür Çarpıtma konusuna bakınız. Bir değişkenin türünü değiştirmek istiyorsanız settype() işlevine bakınız.
Bu bölümdeki örnekleri sınamak için var_dump() işlevini kullanınız.
Bilginize: array türüne özdevinimli dönüşüm şimdilik tanımsızdır.
Ayrıca, PHP dizgelerde konumlar üzerinden indislemeyi dizi indislemede kullanılan sözdizimiyle desteklediğinden aşağıdaki örnek tüm PHP sürümleri için geçerli bir örnektir:
<?php
$a = 'car'; // $a string türündedir
$a[0] = 'b'; // $a hala string türündedir
echo $a; // -> bar
?>Daha fazla bilgi edinmek için Karakterinden dizgeye erişim konusuna bakınız.
PHP'de tür çarpıtma (type casting) C'deki gibi çalışır: İstenen türün ismi parantez içinde türü çarpıtılacak değişkenin önüne yazılır.
<?php
$foo = 10; // $foo integer türündedir
$bar = (boolean) $foo; // $bar boolean türündedir
?>
İzin verilen çarpıtmalar:
(binary) çarpıtması ve b önekinin ileriye dönük desteği PHP 5.2.1'de eklenmiştir.
Parantezler içinde sekmelere ve boşluklara izin verildiğinden aşağıdaki iki deyim eşdeğerdir:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Normal dizgelerin ikil dizgelere dönüştürülmesi:
<?php
$binary = (binary) $string;
$binary = b"ikil dizge";
?>
Bilginize: Bir değişkenin türünü string türüne çarpıtmak yerine değişkeni çift tırnak içine almak aynı sonucu sağlar:
<?php
$foo = 10; // $foo integer türündedir
$str = "$foo"; // $str string türündedir
$fst = (string) $foo; // $fst de string türündedir
// Bu, "bunlar aynı" basar
if ($fst === $str) {
echo "bunlar aynı";
}
?>
Belli türler arasında çarpıtma yapılırken tam olarak ne olup bittiği açıkça belli olmayabilir. Daha fazla bilgi için şu bölümlere bakınız:
PHP'de değişkenler dolar işaretini takip eden bir değişken adı ile gösterilir. Değişken adı büyük-küçük harf duyarlıdır.
Değişken isimleri PHP'deki diğer yaftalarla aynı kurallara tabidir. Geçerli bir değişken ismi bir harf veya alt çizgi imi ile başlar, herhangi sayıda harf, sayı veya alt çizgi iminden oluşur. Düzenli ifade olarak, şu şekilde ifade edilebilir: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Bilginize: Burada kastedilen harf a-z veya A-Z arasındaki ASCII harfler ve 127 ile 255 (0x7f-0xff) arasındaki baytlardır.
Bilginize: $this atama yapılamayan özel bir değişkendir.
Ayrıca Kullanıcı Alanı İsimlendirme Kılavuzu belgesine de bakınız.
Değişkenlerle ilgili işlevler hakkında bilgi için, Değişkenlerle ilgili işlevler belgesine bakınız.
<?php
$var = 'Kemal';
$Var = 'gel';
echo "$var, $Var"; // "Kemal, gel" yazdırır
$4site = 'dene bakalım'; // geçersiz; sayı ile başlar
$_4site = 'dene bakalım'; // geçerli; alt çizgi ile başlar
$diğer = 'gerekirse diye'; // geçerli; ISO-8859-9'da 'ğ' harfi 127-255
// arasında, UTF-8'de ise iki baytı 127-255
// arasındadır.
?>
Öntanımlı olarak, değişkenler her zaman değerleriyle atanır. Başka bir deyişle, bir değişkene bir ifade atandığında özgün ifade bütün değeriyle hedef değişkene kopyalanır. Bu demektir ki, örneğin, bir değişkenin değerini başka bir değişkene atadıktan sonra, değişkenlerden birisinin değerini değiştirmenin diğeri üzerinde etkisi olmayacaktır. Bu çeşit atama hakkında daha fazla bilgi için, İfadeler bölümüne bakınız.
PHP değişkenlere değer atamak için başka bir yol daha sunar: Gönderimli atama. Yani, yeni değişken sadece asıl değişkene gönderim yapar (diğer bir deyişle, "onun takma adı olur" veya "onu gösterir") Gönderim yapılan değişkendeki değişiklikler aslını da etkiler, tersi de geçerlidir.
Gönderimli atama için, gönderim yapılacak (daha önce değer atanmış) değişkenin başına ve imi (&) ekleyin. Örneğin, aşağıdaki kod parçası iki kez 'Benim adım Mustafa' yazar:
<?php
$foo = 'Mustafa'; // 'Mustafa' değerini $foo değişkenine ata
$bar = &$foo; // $foo değişkenini $bar değişkenine gönderimli ata
$bar = "Benim adım $bar"; // $bar değişkenini değiştir ...
echo $bar;
echo $foo; // $foo değişkeninin değeri de değişti.
?>
Dikkat edilmesi gereken önemli bir şey de sadece isimli değişkenlerin gönderimle atanabileceğidir.
<?php
$foo = 25;
$bar = &$foo; // Bu geçerli bir atamadır.
$bar = &(24 * 7); // Geçersiz; isimlendirilmemiş bir ifadeye gönderim yapıyor
function test()
{
return 25;
}
$bar = &test(); // Geçersiz.
?>
PHP'de değişkenleri ilklendirmek gerekmez ancak baştan bir değer atamak oldukça iyi bir alışkanlıktır. İlklendirilmeyen değişkenlerin kullanıldıkları bağlamda türlerine bağlı olarak öntanımlı değerleri vardır; öntanımlı değer boolean için FALSE, integer ve float için sıfır, string için boş metin (örnekte echo() da kullanıldı), array için ise boş bir dizidir.
Örnek 1 - İlklendirilmemiş değişkenlerin öntanımlı değerleri
<?php
// Herhangi bir bağlamda tanımlanmamış veya
// gönderim yapılmamış değişken; NULL sonuç verir.
var_dump($tanımsız_değişken);
// Mantıksal değer kullanımı; 'false' çıktısı verir
// (Bu sözdizimi için üç terimli işlecine bakınız)
echo($tanımsız_mantıksallık ? "true\n" : "false\n");
// Dizge kullanımı; çıktısı: 'string(3) "abc"'
$tanımsız_metin .= 'abc';
var_dump($tanımsız_metin);
// Tamsayı kullanımı; 'int(25)' çıktılar.
$tanımsız_tamsayı += 25; // 0 + 25 => 25
var_dump($tanımsız_tamsayı);
// Gerçek sayı kullanımı; 'float(1.25)' çıktılar.
$tanımsız_sayı += 1.25;
var_dump($tanımsız_sayı);
// Dizi kullanımı; çıktısı: array(1) { [3]=> string(3) "def" }
$tanımsız_dizi[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($tanımsız_dizi);
// Nesne kullanımı; yeni stdClass nesnesi oluşturur
// (Öntanımlı sınıflar belgesine bakınız:
// http://www.php.net/manual/tr/reserved.classes.php)
// Çıktısı: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$tanımsız_nesne->foo = 'bar';
var_dump($tanımsız_nesne);
?>
İlklendirilmemiş bir değişkenin öntanımlı değerine güvenmek, içinde aynı değişken isminin kullanıldığı bir dosyayı betiğe dahil ettiğinizde sorun çıkarır. Bunun aynı zamanda büyük bir güvenlik riski omuşturmaması için register_globals yönergesine 'on' değeri atanmalıdır. İlklendirilmemiş değişken kullanımı E_NOTICE seviyesinde hata oluşturur, ancak ilklendirilmemiş bir diziye eleman eklenmesi halinde hata oluşmaz. isset() dil oluşumu bir değişkenin ilklendirilip ilklendirilmediğini öğrenmek için kullanılabilir.
PHP çalıştırdığı herhangi bir betiğe çok sayıda önceden tanımlı değişken sağlar. Ancak, bu değişkenlerin çoğu hangi sunucunun çalıştığına, sunucunun sürümüne ve kurulumuna ve başka bir çok şeye bağlı olduğu için tam olarak belgelendirilememektedir. Bu değişkenlerden bazıları PHP komut satırından çalıştığında mevcut olmayacaktır. Bu değişkenlerin listesi için, lütfen Öntanımlı Değişkenler kısmına bakınız.
PHP 4.2.0 ve sonrasında, register_globals PHP yönergesinin öntanımlı değeri off'tur. Bu PHP'de büyük bir değişikliktir. register_globals'ın off olması betik genelinde geçerli önceden tanımlı bir gurup değişkeni etkiler. Örneğin, DOCUMENT_ROOT'u almak için $DOCUMENT_ROOT yerine $_SERVER['DOCUMENT_ROOT'], http://mesela.dom/dnm.php?id=3 adresi için $id yerine $_GET['id'] veya $HOME yerine $_ENV['HOME'] kullanmalısınız.
Bu değişiklikle ilgili bilgi için, register_globals yapılandırma yönergesini, güvenlik bölümündeki Küresel Kayıtların Kullanımı belgesini, PHP » 4.1.0 ve » 4.2.0 sürüm duyurularını okuyun.
Süper küresel diziler gibi PHP'nin Önceden Tanımlı Değişkenlerinin de kullanımı önerilmektedir.
PHP, 4.1.0 sürümünden sonra, ortam değişkenleri ve kullanıcı girdi değişkenleri ile HTTP sunucusundaki değişkenleri (eğer uygulanabiliyorsa) içeren bir takım önceden tanımlı diziler sağlamaktadır. Bu yeni diziler özel olmaktan ziyade özdevinimli olarak küreseldir, yani, özdevinimli olarak her etki alanında bulunurlar. Bu nedenle, "Süper küreseller" olarak bilinirler. (PHP'de kullanıcı-tanımlı süper küreseller için bir mekanizma yoktur.) Süper küreseller aşağıda listelenmiştir; PHP önceden tanımlı değişkenlerin açıklamaları ve doğaları ise Öntanımlı Değişkenler bölümünde listelenmiştir. Ayrıca, eskiden kalma öntanımlı değişkenlerin de ($HTTP_*_VARS) hala mevcut olduğunu bilmenizde yarar var. PHP 5.0.0'dan itibaren öntanımlı değişken dizileri register_long_arrays yönergesi ile iptal edilebilmektedir.
Bilginize: Değişken değişkenler
İşlevler veya sınıf yöntemleri içinde süper küreseller değişken değişkenleri olarak kullanılamazlar.
Bilginize: Süper küreseller ve HTTP_*_VARS aynı anda var olabilirlerse de birbirlerinin yerine kullanılamazlar, yani birini değiştirmekle diğerini değiştirmiş olmazsınız.
Eğer variables_order yönergesine uygun değişkenler atanmamışsa, ilgili oldukları PHP önceden tanımlı dizileri de boş bırakılır.
Bir değişkenin etki alanı içinde tanımlandığı bağlamdır. Hemen her PHP değişkeninin sadece tek bir etki alanı vardır. Bu tek etki alanı betiğe include() ve require() ile dahil edilen dosyalara da uzanır. Örneğin:
<?php
$a = 1;
include 'b.inc';
?>
Burada $a değişkeni içerilen b.inc betiğinin içinde mevcut olacaktır. Fakat, kullanıcı tanımlı işlevlerin etki alanı işleve özeldir. Yani, bir işlev içinde kullanılan herhangi bir değişkenin etki alanı öntanımlı olarak işlevin yerel etki alanı ile sınırlıdır. Örneğin:
<?php
$a = 1; /* küresel etki alanı */
function deneme()
{
echo $a; /* işlevin etki alanı */
}
deneme();
?>
Bu betik herhangi bir çıktı üretmeyecektir, çünkü echo ifadesi $a değişkeninin yerel sürümüne atıf yapmakta olup bu etki alanı içinde değişkene bir değer atanmamıştır. Bunun C dilinden bir miktar farklı olduğuna dikkat etmiş olabilirsiniz, C dilinde küresel değişkenler, özellikle yerel bir tanımla geçersiz kılınmadıkları sürece, işlevler tarafından özdevinimli olarak erişilebilir olacaktır. Bu bazı sorunlara neden olabilir, öyle ki birileri dikkatsizlikle küresel değişkeni değiştirebilir. PHP'de küresel değişkenler eğer bir işlev içinde kullanılacaksa, o işlev içinde global sözcüğü ile bildirilmeleri gerekir.
İlk olarak, global kullanımına bir örnek verelim:
Örnek 1 - global kullanımı
<?php
$a = 1;
$b = 2;
function topla()
{
global $a, $b;
$b = $a + $b;
}
topla();
echo $b;
?>
Yukarıdaki betik 3 çıktısı verecektir. $a ve $b işlev içinde küresel tanımlanarak, her iki değişkene yapılan bütün atıflar küresel sürüme yapılmış olacaktır. Bir işlev tarafından işlenebilecek küresel değişken sayısında bir sınır yoktur.
Küresel etki alanındaki değişkenlere erişimin ikinci yolu PHP tarafından tanımlanmış özel $GLOBALS dizisini kullanmaktır. Önceki örnek şu şekilde yazılabilir:
Örnek 2 - global yerine $GLOBALS kullanımı
<?php
$a = 1;
$b = 2;
function topla()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
topla();
echo $b;
?>
$GLOBALS dizisi, anahtarı küresel değişkenin ismi, elemanının değeri değişkenin içeriği olan bir ilişkisel dizidir. $GLOBALS dizisinin her etki alanında mevcut oluşuna dikkat edin, bunun sebebi$GLOBALS dizisinin bir süper küresel olmasıdır. Süper küresellerin gücünü gösteren bir örnek aşağıda verilmiştir:
Örnek 3 - Süper küreselleri ve etki alanlarını gösteren örnek
<?php
function test_global()
{
// Çoğu öntanımlı değişken "süper" değildir ve işlev etki
// alanında geçerli olmak 'global' olmayı gerektirir.
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['isim'];
// Süper küreseller her etki alanında geçerlidirler ve
// 'global' olarak bildirilmeleri gerekmez. Süper küreseller
// PHP 4.1.0'dan beri mevcutturlar ve HTTP_POST_VARS'ın
// kullanımı artık önerilmemektedir.
echo $_POST['isim'];
}
?>
Değişken etki alanı ile ilgili önemli özelliklerden biri duruk değişkenlerdir. Bir duruk bir değişken sadece işlevin etki alanında geçerli olup, programın çalışması bu etki alanını terkettiği zaman değerini kaybetmez. Aşağıdaki örneğı ele alalım:
Örnek 4 - Duruk değişkenlere ihtiyacı gösteren örnek
<?php
function dene()
{
$a = 0;
echo $a;
$a++;
}
?>
Bu işlev her çağrıldığında $a'yı 0 yapar ve 0 yazdırır, bu nedenle oldukça kullanışsızdır. Değişkeni artıran $a++ bir işe yaramaz çünkü işlev çıktığı gibi $a değişkeni kaybolur. Kaldığı değeri kaybetmeyecek kullanışlı bir sayaç işlevi yapması için $a değişkeni aşağıda static olarak bildirilmiştir.
Örnek 5 - Duruk değişkenlerin kullanım örneği
<?php
function dene()
{
static $a = 0;
echo $a;
$a++;
}
?>
Artık, $a değişkeni sadece dene() işlevinin ilk çağrılışında ilklendirilecek ve işlevin her çağrılışında $a değişkeninin değerini bastıktan sonra değerini bir artıracaktır.
Duruk değişkenler aynı zamanda kendini çağıran işlevlerle çalışmak için de bir yol sunar. Kendini çağıran (recursive) işlev kendi kendini çağırır. Böyle bir işlev dikkatli yazılmazsa sonsuza kadar kendi kendini çağırır. Kendini çağırmayı bir noktada sonlandıracak uygun bir yönteminiz olmalıdır. Aşağıdaki basit işlev, kendini çağırmayı nerede durduracağını bilerek 10'a kadar sayar:
Örnek 6 - Kendini çağıran işlevlerle duruk değişkenler
<?php
function say()
{
static $sayaç = 0;
$sayaç++;
echo "$sayaç\n";
if ($sayaç < 10) {
say();
}
$sayaç--;
}
say();
?>
Bilginize: Duruk değişkenler yukarıdaki örneklerde yapıldığı gibi tanımlanabilir. Bu değişkenlere ifadelerin sonuçlarını değer olarak atamaya çalışmak çözümleme hatasına neden olacaktır.
Örnek 7 - Duruk değişken bildirimi
<?php
function foo(){
static $int = 0; // doğru
static $int = 1+2; // yanlış (ifade olduğu için)
static $int = sqrt(121); // yanlış (bu da ifade olduğu için)
$int++;
echo $int;
}
?>
PHP 4'ün işletmeni olan Zend Motoru 1, static ve global değişken niteleyicilerini gönderim olarak gerçeklemiştir. Örneğin, global deyimi ile bir işlevin etki alanında geçerli kılınan bir küresel değişken aslında kendine bir gönderim oluşturur. Bu durum aşağıdaki örnekte de görüldüğü gibi beklenmedik davranışlara yol açabilir:
<?php
function gönderimli_küresel_dene() {
global $nesne;
$nesne = &new stdclass;
}
function gönderimsiz_küresel_dene() {
global $nesne;
$nesne = new stdclass;
}
gönderimli_küresel_dene();
var_dump($nesne);
gönderimsiz_küresel_dene();
var_dump($nesne);
?>
Yukarıdaki örneğin çıktısı:
Aynı davranış static deyimine de uyar. Gönderimler duruk olarak saklanmazlar:
<?php
function &gönderimli_örnek() {
static $obj;
echo 'Duruk nesne: ';
var_dump($obj);
if (!isset($obj)) {
// Duruk değişkene gönderim atayalım
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}
function &gönderimsiz_örnek() {
static $obj;
echo 'Duruk nesne: ';
var_dump($obj);
if (!isset($obj)) {
// Duruk değişkene nesne atayalım
$obj = new stdclass;
}
$obj->property++;
return $obj;
}
$nesne1 = gönderimli_örnek();
$bu_da_nesne1 = gönderimli_örnek();
echo "\n";
$nesne2 = gönderimsiz_örnek();
$bu_da_nesne2 = gönderimsiz_örnek();
?>
Yukarıdaki örneğin çıktısı:
Bu örnek, bir duruk değişkene gönderimli atama yapılması halinde, &gönderimli_örnek() işlevi ikinci kez çağrıldığında değişkene atanan değerin saklanmadığını gösterir.
Bazen değişken değişken isimlerine sahip olabilmek kullanışlı olur. Bu, devingen olarak belirtilebilen ve kullanılabilen bir değişken ismidir. Normal bir değişken şöyle bir deyimle atanır:
<?php
$a = 'merhaba';
?>
Bir değişken değişken bir değişkenin değerini alır ve bir değişkenin ismi gibi davranır. Yukarıdaki örnekteki, merhaba, iki tane dolar imi ile bir değişken ismi olarak kullanlabilir
<?php
$$a = 'dünya';
?>
Bu noktada PHP sembol ağacında iki değişken tanımlanmış ve saklanmış olur: $a "merhaba" içerirken $merhaba ise "dünya" içerir. Bu nedenle, aşağıdaki iki örnek aynı sonucu üretir:
<?php
echo "$a ${$a}";
?>
<?php
echo "$a $merhaba";
?>
Her ikisi de 'merhaba dünya' üretir.
Değişken değişkenleri dizilerle kullanmak için, bir anlam karmaşası sorununu çözümlemeniz gerekir. $$a[1] yazdığınızda değişken olarak $a[1]'i mi kastettiğiniz, yoksa $$a'nın değişken olmasını isteyip [1] ile o değişkenin indisini mi kastettiğinizi çözümleyicinin bilmesi gerekir. Bu anlam karmaşasını çözümleyen söz dizimi, birinci durum için ${$a[1]} ve ikinci için ${$a}[1]'dir.
Sınıf özelliklerine değişken özellik isimlerinden de erişilebilir. Değişken özellik ismi çağrının yapıldığı etki alanı içinde çözümlenir. Örneğin, $foo->$zam gibi bir değişkeniniz olsun; burada $zam'ın etki alanı incelenir ve $foo özelliğinin ismi olarak kullanılır. $zam, bir diziye erişim için kullanılıyorsa yine aynı durum geçerlidir.
Örnek 1 - Değişken işlevi örneği
<?php
class foo {
var $zam = 'Buna zam derler.';
}
$foo = new foo();
$zam = 'zam';
$maz = array('foo', 'zam', 'maz', 'para');
echo $foo->$zam . "\n";
echo $foo->$maz[1] . "\n";
?>
Yukarıdaki örneğin çıktısı:
Değişken değişkenlerin işlev ve sınıf yöntemleri içinde PHP'nin Süper küresel dizileri ile kullanılamayacağını unutmayınız. $this değişkeni de devingen olarak gönderimli olamayan özel bir değişkendir.
Bir PHP betiğine bir form gönderildiğinde o formdaki bilgi betik tarafından özdevinimli olarak kullanılır. Bu bilgiye erişmek için birçok yol vardır, örneğin:
Örnek 1 - Basit bir HTML formu
<form action="foo.php" method="post">
Name: <input type="text" name="kullanici_adi" /><br />
Email: <input type="text" name="eposta" /><br />
<input type="submit" name="submit" value="Beni gönder!" />
</form>
Kurulumunuza ve kişisel tercihlerinize bağlı olarak, HTML formlarınızdaki bilgiye erişimin birçok yolu vardır. Bazı örnekler:
Örnek 2 - Basit bir POST HTML formundan bilgiye erişim
<?php
// PHP 4.1.0'dan beri vardır
echo $_POST['kullanici_adi'];
echo $_REQUEST['kullanici_adi'];
import_request_variables('p', 'p_');
echo $p_kullanici_adi;
// PHP 6'dan beri yoktur. PHP 5.0.0'dan itibaren, bu uzun öntanımlı
// değişkenler register_long_arrays yönergesi ile etkisiz kılınabilir.
echo $HTTP_POST_VARS['kullanici_adi'];
// Eğer PHP yönergesi register_globals = on ise kullanılabilir.
// PHP 4.2.0'dan itibaren register_globals'ın öntanımlı değeri off'dur.
// Bu yöntemin kullanımı/güvenilmesi tercih edilmez.
echo $kullanici_adi;
?>
Bunun yerine önceden tanımlı uygun bir GET değişkeni kullanmak dışında, GET formunun kullanımı aynıdır. GET ayrıca QUERY_STRING (Bir URL'de '?' iminden sonraki bilgi) sorgu dizgesine de uygulanır. Bu bakımdan örneğin, http://mesela.dom/dnm.php?id=3 $_GET['id'] ile erişilebilen GET verisini içerir. Ayrıca, $_REQUEST değişkenine ve import_request_variables() işlevine de bakınız.
Bilginize: $_POST ve $_GET gibi Süper küresel diziler PHP 4.1.0'dan itibaren vardır.
Bahsedildiği gibi, PHP 4.2.0'dan önce register_globals yönergesinin öntanımlı değeri on'du. PHP topluluğu herkesi bu yönergeye güvenmemeleri, off olarak kabul ederek kodu buna göre yazmaları konusunda teşvik etmektedir.
Bilginize: magic_quotes_gpc yapılandırma yönergesi Get, Post ve Cookie değerlerini etkiler. Eğer değeri 'on' yapılırsa, (It's "PHP!") değeri özdevinimli olarak (It\'s \"PHP!\") olur. Veritabanına kayıt için önceleme gerekir. Ayrıca, addslashes(), stripslashes() ve magic_quotes_sybase işlevlerine de bakınız.
PHP form değişkenleri bağlamında dizileri de anlar (ilgili SSS'ye bakınız). Örneğin, ilgili değişkenleri birlikte gruplayabilir veya bu özelliği çoklu seçim girdisinden değerleri almak için kullanabilirsiniz. Örneğin, bir formu kendine gönderelim ve gönderilen veriyi gösterelim:
Örnek 3 - Daha karmaşık form değişkenleri
<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Adı: <input type="text" name="personal[isim]" /><br />
Eposta: <input type="text" name="personal[eposta]" /><br />
Bira: <br />
<select multiple name="bira[]">
<option value="efes">Efes</option>
<option value="tuborg">Tuborg</option>
<option value="venus">Venüs</option>
</select><br />
<input type="submit" value="Gönder!" />
</form>
Bir formu gönderirken, şöyle bir etiketle standart gönder düğmesi yerine resim kullanılabilir:
<input type="image" src="image.gif" name="sub" />
Kullanıcı resim üzerinde bir yere tıkladığında, eşlik eden form iki ek değişkenle sunucuya iletilmiş olur: sub_x ve sub_y. Bunlar kullanıcın resim üzerinde tıkladığı noktanın koordinatlarını içerir. Deneyimliler tarayıcı tarafından gönderilen asıl değişken isimlerinin alt çizgi yerine nokta içerdiğine dikkat etmiş olabilirler, fakat PHP noktaları özdevinimli olarak alt çizgiye çevirir.
Genellikle, PHP bir betiğe aktarılan değişken isimlerini değiştirmez. Fakat, nokta iminin PHP'de değişken isimlerinde geçerli bir karakter olmadığına dikkat edilmelidir. Örnek:
<?php
$varname.ext; /* geçersiz değişken ismi */
?>
Burada, yazım denetleyicinin gördüğü $varname isimli bir değişkeni takip eden bir dizge birleştirme işlemi ve çıplak bir (tırnaklarla çevrilmemiş, herhangi bir anahtar veya anahtar sözcük ile eşleşmeyen dizge) 'ext' metnidir. Açıkça görülüyor ki, bu istenen sonucu vermemektedir.
Bu nedenle, PHP'nin gelen değişken isimlerindeki nokta imlerini alt çizgi imi ile değiştirdiğini bilmekte yarar vardır.
Değişken türlerini PHP belirlediği ve (genellikle) gerektiği gibi değiştirdiği için, verilen bir değişkenin herhangi bir anda hangi türde olduğu sorgulanmadan bilinemez. PHP'de bir değişkenin hangi türde olduğunu bulan birçok işlev vardır. Örnek: gettype(), is_array(), is_float(), is_int(), is_object() ve is_string(). Ayrıca Türler bölümüne de bakınız.
Bir sabit basit bir değerin betimleyicisidir (ismidir). İsminden de anlaşılacağı gibi, betiğin çalışması sırasında bu değer değiştirilemez (aslında birer sabit olmayan sihirli sabitler hariç). Sabitler öntanımlı olarak büyük-küçük harf duyarlıdır. Geleneksel olarak, sabit isimleri daima büyük harfle yazılır.
Bir sabite verilen isim PHP'de varolan diğer tüm isimlerle aynı kurallara tabidir. Geçerli bir sabit ismi bir harfle ya da alt çizgi imi ile başlar, herhangi bir sayıda harf, rakam ya da alt çizgi ile devam eder. Bir sabit ismi düzenli ifade olarak, şu şekilde ifade edilebilir: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Ayrıca Kullanıcı Alanı İsimlendirme Kılavuzu belgesine de bakınız.
Örnek 1 - Geçerli ve geçersiz sabit isimleri
<?php
// Geçerli sabit isimleri
define("FOO", "bir şey");
define("FOO2", "başka bir şey");
define("FOO_BAR", "daha başka bir şey");
// Geçersiz sabit isimleri
define("2FOO", "bir şey");
// Bu geçerli olmasına rağmen kullanmaktan kaçınılmalıdır.
// PHP bir gün betiğinizin çalışmasını bozacak bir sihirli
// sabit kullanmaya karar verebilir.
define("__FOO__", "bir şey");
?>
Bilginize: Burada bir harften söz ettiğimiz zaman, ASCII a-Z veya A-Z arasındaki ki bir karakterden veya karakter kodu 127-255 (0x7f-0xff) arasındaki bir karakterden bahsetmiş oluyoruz.
Süper küresellerde olduğu gibi, sabitlerin etki alanı da betiklerin genelidir. "Etki alanı" hakkında daha ayrıntılı bilgi edinmek için Değişken Etki Alanı bölümünü okuyunuz.
Bir sabiti define() işlevini kullanarak veya PHP 5.3.0'dan itibaren sınf tanımlarının dışında const anahtar sözcüğünü kullanarak tanımlayabilirsiniz. Bir sabit tanımlandıktan sonra, asla değiştirilemez ya da tanımsız yapılamaz.
Bir sabit ismine yalnızca bir sayıl değer (boolean, integer, float veya string) atanabilir. Sabitleri resource olarak kayıt altına almak mümkündür, fakat umulmadık sonuçlara yol açabileceğinden bundan kaçınılmalıdır.
Bir sabitin değerini basitçe ismini belirterek alabilirsiniz. Değişkenlerin aksine, sabitlerin önüne $ imi eklemeniz gerekmez. Bunun yanında, bir sabitin ismini devingen şekilde elde etmek isterseniz, sabitin değerini okumak için constant() işlevini de kullanabilirsiniz. Tanımlanmış sabitlerin tamamının bir listesini almak için, get_defined_constants() işlevini kullanabilirsiniz.
Bilginize: Sabitlerin ve (genel) değişkenlerin isim alanları farklıdır. Bu, örneğin TRUE ile $TRUE değerlerinin farklı olabilecekleri anlamına gelir.
Tanımlanmamış bir sabit ismi kullanırsanız, PHP, bir sabit değil bir
sayıl değer kullanmak istediğinizi varsayar ve sabiti string
türünde bir değer (SABIT yerine "SABIT" ) olarak ele alır. Böyle bir
durumda E_NOTICE seviyesinde bir
hata çıktılanır. Ayrıca, $foo[bar] kullanımının (evvelce
define() işleviyle bar isminde bir
sabit tanımlamamışsanız) neden yanlış olduğuyla ilgili açıklamayı $foo[bar] neden
yanlıştır? başlığı altında bulabilirsiniz. Bir sabitin tanımlı
olup olmadığını defined() işlevi sayesinde kolayca
öğrenebilirsiniz.
Sabitler ve değişkenler arasındaki farklar:
Örnek 1 - Sabitlerin Tanımlanması
<?php
define("CONSTANT", "Merhaba dünya.");
echo CONSTANT; // "Merhaba dünya" çıktılar.
echo Constant; // "Constant" çıktılar ve bir bilgi iletisi gösterir.
?>
Örnek 2 - Sabitlerin const ile tanımlanması
<?php
// PHP 5.3.0 ve sonrasında çalışır
const CONSTANT = 'Merhaba Dünya';
echo CONSTANT;
?>
Ayrıca, Sınıf Sabitleri belgesine de bakınız.
PHP, çalışan her betiğin erişebileceği çok sayıda öntanımlı sabit'e sahiptir. Öte yandan, bu sabitlerin çoğu, çeşitli eklentiler tarafından tanımlandığından, sadece eklenti bir modül olarak veya PHP içinde derlenmişse kullanılabilir.
Değerleri kullanıldıkları yere göre değişen beş sihirli sabit vardır. Örneğin, __LINE__ sabitinin değeri betiğin hangi satırında kullanıldığına bağlıdır. Bu özel sabitler büyük-küçük harf farkına duyarsızdır ve aşağıda listelenmişlerdir:
| İsim | Açıklama |
|---|---|
| __LINE__ | Dosyada bu sabitin bulunduğu satırın numarası. |
| __FILE__ | Dosyanın tam dosya yolu ve dosya ismi. include() işlevi ile betiğe eklenen bir dosyanın içinde kullanıldığında betiğin ismini değil, eklenen dosyanın ismini içerir. PHP 4.0.2'den itibaren, __FILE__ değeri daima sembolik bağları çözümlenmiş olarak mutlak dosya yolunu içerirken, daha eski sürümler bazı durumlarda göreli dosya yolunu içerebilir. |
| __DIR__ | Dosyanın bulurduğu dizin. Dahil edilen bir dosyanın içinde kullanıldığında dahil edilen dosyanın dizini döner. Bu dirname(__FILE__) işlevine eşdeğerder. Bu dizin isminin sonuna bir kök dizin olmadıkça bir bölü imi konmaz. (PHP 5.3.0'da eklenmiştir.) |
| __FUNCTION__ | İşlev ismi. (PHP 4.3.0 ile eklenmiştir). PHP 5 itibariyle bu sabit, işlev ismini bildirimindeki haliyle (büyük-küçük harf duyarlı) içerir. PHP 4 sürümünde ise bu değer her zaman küçük harflerden oluşur. |
| __CLASS__ | Sınıf ismi. (PHP 4.3.0 ile eklenmiştir). PHP 5 itibariyle bu sabit, sınıf ismini bildirimindeki haliyle (büyük-küçük harf duyarlı) içerir. PHP 4 sürümünde ise bu değer her zaman küçük harflerden oluşur. |
| __METHOD__ | Yöntem ismi. (PHP 5.0.0 ile eklenmiştir). Bu sabit, yöntem ismini daima bildirimindeki haliyle (büyük-küçük harf duyarlı) içerir. |
| __NAMESPACE__ | Geçerli isim alanının adı (harf büyüklüğüne duyarlı). Bu sabit derleme anında tanımlanır (PHP 5.3.0'da eklenmiştir). |
Ayrıca bakınız: get_class(), get_object_vars(), file_exists() ve function_exists().
İfadeler, PHP'nin en önemli yapı taşlarındandır. PHP'de, hemen hemen yazdığınız her şey bir ifadedir. Bir ifadenin en basit ama en etkili tanımı şudur: "Bir değere sahip olan herşey".
İfadelerin en basit şekli sabitler ve değişkenlerdir. "$a = 5" yazdığınızda, '5' değerini $a değişkenine atamış olursunuz. '5', açık bir şekilde, 5 değerine sahiptir, ya da başka bir deyişle '5', değeri 5 olan bir ifadedir (bu durumda, '5' bir tamsayı sabittir).
Bu atamadan sonra, $a'nın değerinin 5 olmasını beklersiniz, dolayısıyla $b = $a yazdığınızda, bunun $b = 5 yazmışsınız gibi davranmasını beklersiniz. Başka bir deyişle, $a da değeri 5 olan ifadedir. Her şey doğru çalışırsa, olması gereken de tam budur.
İşlevler, ifadelerin biraz daha karmaşık örnekleridir. Örneğin, aşağıdaki işleve bakalım:
<?php
function foo ()
{
return 5;
}
?>
İşlev kavramına aşina iseniz (değilseniz, işlevler bölümünü inceleyebilirsiniz), şu örnekten hareketle $c = foo() yazmak ile $c = 5 yazmak arasında bir fark olmadığını bilirsiniz. İşlevler, değeri dönüş değeri olan ifadelerdir. foo() işlevi 5 değerini döndürdüğünden, "foo()" ifadesinin değeri 5'tir. İşlevlerin amacı normalde duruk bir değer döndürmek değildir, bir hesaplamanın sonucunu döndürürler.
Elbette, PHP'deki değerlerin hep tamsayılar olması gerekmez, zaten çoğunlukla değildirler. PHP dört çeşit sayıl değer destekler: Tamsayı (integer) değerler, kayan noktalı (float) değerler, dizge (string) değerler ve mantıksal boolean değerler (sayıl değerler, dizilerin aksine daha küçük parçalara bölemeyeceğiniz değerlerdir). PHP ayrıca iki bileşik (sayıl olmayan) tür destekler: Diziler ve nesneler. Bu değer türlerinden her biri bir değişkene atanabilir ya da bir işlevden döndürülebilir.
PHP, birçok başka dilin yaptığı gibi ifadeleri çok ileriye götürmüştür. PHP ifade-yönelimli bir dildir, bunun sebebi hemen hemen her şeyin bir ifade olmasıdır. Az önce üzerinde çalıştığımız '$a = 5' örneğini ele alalım. Burada iki değer kullanımı sözkonusudur, bir tamsayı sabit olan '5' ve 5 olarak değiştirilmiş $a'nın değeri. Ancak gerçek şu ki, burada bu ikiliye ek olarak başka bir değer daha vardır, o da atamanın kendi değeridir. Atamanın kendisi atanan değerle değerlendirilir, bu örnekte bu 5'tir. Uygulamada, ne yaptığından bağımsız olarak "$a = 5", değeri 5 olan bir ifadedir. Böylece, "$b = ($a = 5)" yazmak, "$a = 5; $b = 5;" yazmak gibidir (noktalı virgül deyimin sonlandırıldığını gösterir). Atamalar sağdan sola doğru işlendiğinden, "$b = $a = 5" de yazabilirsiniz.
İfade yönelimi ile ilgili diğer güzel bir örnek atama öncesi ve sonrası arttırma ve eksiltme işlemleridir. PHP ve diğer birçok dilin kullanıcıları, değişken++ ve değişken-- gösterimine az çok aşinadır. Bunlar arttırma ve eksiltme işleçleridir. PHP/FI 2'de, $a++ deyiminin bir değeri yoktur (bir ifade değildir), bu yüzden onu atayamaz ya da herhangi bir yerde kullanamazsınız. PHP, arttırma/eksiltme ifadelerinin yeteneklerini, bu ifadeleri C dilindekine benzer şekilde iyileştirerek genişletmiştir. PHP'de, C'de olduğu gibi önceden arttırma ve sonradan arttırma diye iki tür arttırma vardır. Bunların her ikisi de değişkenin değerini bir arttırır ve değişken üzerindeki etkileri aynıdır. Fark, arttırma ifadesinin değerindedir. Önceden arttırma, ++$değişken olarak yazılır ve arttırılmış değer öncelik alır (PHP değişkenin değerini önce arttırır, sonra okur, bu sebeple önceden arttırma ismi verilmiştir). Sonradan arttırma ise, $değişken++ olarak yazılır ve değer arttırılmadan önceki özgün değer önceliklidir (PHP değişkenin değerini okuduktan sonra değerini arttırır, bu sebeple sonradan arttırma ismi verilmiştir).
Çok geniş bir kullanıma sahip olan ifade türlerinden birisi de karşılaştırma ifadeleridir. Bu ifadeler FALSE ya da TRUE değerlerinden birini alırlar. PHP > (büyüktür), >= (büyüktür ya da eşittir), == (eşittir), != (eşit değildir), < (küçüktür) ve <= (küçüktür ya da eşittir) gösterimlerini destekler. Dil aynı zamanda aynılık işleçlerini de destekler: === (eşit ve aynı türdedir) ve !== (ne eşit ne de aynı türdedir). Bu ifadeler çoğunlukla if deyimleri gibi koşula bağlı işlemlerde kullanılmaktadırlar.
Vereceğimiz son ifade örneği işleçli atama ifadeleridir. $a'nın değerini 1 arttırmak istediğinizde, basitçe '$a++' ya da '++$a' yazmanızın yeterli olduğunu zaten biliyorsunuz. Ama ya birden daha büyük bir değer, örneğin 3 eklemek isterseniz? '$a++' ifadesini birkaç kez yazabilirsiniz, ama bunun pek verimli ya da kullanışlı yöntem olmadığı oldukça açık. '$a = $a + 3' çok daha yaygın bir kullanımdır. '$a + 3' ifadesi $a'nın değerini önce 3 arttırır sonra sonucu $a'ya atar, böylece $a'nın değeri 3 arttırılmış olur. PHP'de, birkaç dilde olduğu gibi C benzeri, daha temiz gözükecek ve daha kısa biçimde yazabileceğiniz bir gösterim daha vardır. $a'nın mevcut değerine 3 ekleme işlemi '$a += 3' biçiminde yazılabilir. Bunun anlamı tam olarak "$a'nın değerini al, 3 ekle ve yeni değeri $a'ya ata" olacaktır. Daha kısa ve temiz olmasının yanında, bu kod daha hızlı çalıştırılacaktır. '$a += 3' işleminin değeri, normal bir atama işleminde olduğu gibi, atanan değerdir. Bu değerin 3 OLMADIĞINA dikkat edin, bu değer $a ile 3'ün toplamıdır ($a’ya bu değer atanır). İşleçli atama kipinde herhangi bir iki terimli işleç kullanılabilir, örneğin '$a -= 5' ($a'nın değerinden 5 çıkarılır), '$b *= 7' ($b'nin değeri 7 ile çarpılır), vs.
Diğer dillerde görmediyseniz size farklı gözükebilecek bir ifade daha vardır, o da üç terimli koşul işlecidir:
<?php
$birinci ? $ikinci : $üçüncü
?>
İlk alt ifadenin değeri TRUE (sıfırdan farklı) ise, ikinci alt ifade değerlendirilir ve koşullu ifadenin sonucu bu olur. Aksi takdirde, üçüncü alt ifade değerlendirilir ve koşullu ifadenin sonucu bu olur.
Aşağıdaki örnek, önceden ve sonradan arttırma işleçlerini ve ifadelerini genelde biraz daha iyi anlamanıza yardımcı olacaktır:
<?php
function double($i)
{
return $i*2;
}
$b = $a = 5; /* beş değerini $a ve $b değişkenlerine atar */
$c = $a++; /* sonradan arttırma, $a'nın özgün değerini (5) $c'ye atar */
$e = $d = ++$b; /* önceden arttırma, $b'nin arttırılmış değerini (6) $d
ve $e'ye atar */
/* bu noktada, $d ve $e 6'ya eşittir */
$f = double($d++); /* $d'nin değerini arttırmadan önce $d'nin değerinin iki
katını $f'ye atar, 2*6 = 12 */
$g = double(++$e); /* $e'nin değerini arttırdıktan sonra iki katını alıp
$g'ye atar, 2*7 = 14 */
$h = $g += 10; /* önce, $g 10 arttırılır ve değeri 24 olur. Sonra bu
değer (24) $h'ye atanır ve onun da değeri 24 olur. */
?>
Bazı ifadeler deyim olarak ele alınabilir. Bu durumda, deyim 'ifade' ';' şeklinde, noktalı virgülle sonlandırılmış bir ifade şeklinde olacaktır. '$=$a=5;' olduğunda, $a=5 geçerli bir ifadedir, ancak kendi başına bir deyim değildir. '$b=$a=5;' ise geçerli bir deyimdir.
Son olarak bahsetmemiz gereken bir konu da ifadelerin gerçek değeridir. Birçok olayda, çoğunlukla da koşula bağlı çalışmalarda ve döngülerde, ifadenin kendi değeri ile değil, TRUE ya da FALSE olması ile ilgileniyor olacaksınız. TRUE ve FALSE sabitleri (büyük-küçük harf duyarsız) olası iki mantıksal değerdir. Gerektiğinde, bir ifade özdevinimli olarak mantıksal değere dönüştürülür. Tür çarpıtma bölümünde bunun nasıl gerçekleştiği ayrıntılı olarak anlatılmıştır.
PHP ifadeleri tümüyle ve çok güçlü bir biçimde uygulamaya geçirmiştir ve bunların tamamını belgelemek bu kılavuzun kapsamının dışında kalır. Yukarıdaki örnekler hangi ifadelerle nasıl kullanışlı ifadeler oluşturabileceğiniz hakkında yeterli fikir verecektir. Bu kılavuzun geri kalanında, geçerli herhangi bir PHP ifadesini belirtmek için ifade sözcüğünü kullanacağız.
Bir işleç, başka bir değer üretmek üzere bir veya daha fazla değerle (programcı dilinde ifadeyle) beslenen bir şeydir (yani, değerler işleçle birlikte bir ifade haline gelir). Bu bakımdan, bir değer döndüren işlevler ve benzeri oluşumlar (print gibi) ya da belirtilenden başka bir şey döndürmeyen (echo gibi) oluşumlar birer işleç olarak düşünülebilir.
Üç tür işleç vardır. İlki tek bir değerle çalışan tek terimli işleç olup ! (olumsuzlama işleci) veya ++ (arttırım işleci) buna birer örnektir. İkinci işleç grubu iki terimlilerdir; PHP'nin desteklediği işleçlerin çoğunluğu bu grupta olup aşağıda İşleç Önceliği bölümünde liste halinde verilmişlerdir.
Üçüncü grupta üç terimli işleç yer alır: ?:. Bir ifadeye bağlı olarak iki deyim veya çalıştırma yolunu seçmekten ziyade diğer iki ifadeden birini seçmek için kullanılır. İşlecin üç ifadesini parantez içinde belirtmek iyi bir uygulamadır.
İşleç önceliği iki ifadenin birbirine hangi sıkılıkta bağlı olduğunu belirtir. Örneğin, 1 + 5 * 3 ifadesinin sonucu 18 değil, 16'dır. Çünkü, çarpma ("*") işlecinin önceliği toplama ("+") işlecinden yüksektir. Önceliği arttırmak için gerekirse parantezler kullanılabilir. Örneğin, (1 + 5) * 3 ifadesinin sonucu 18 olacaktır. Eğer işleç önceliklerinde eşitlik sözkonusu olursa soldaki işleç sağdakinden öncelikli olur.
Aşağıdaki listede işleçler en yüksek öncelikliden başlayıp en düşük öncelikliye doğru sıralanmışlardır. Aynı satırda yer alan işleçler eşöncelikli olup hangi sırada ele alınacaklarına değerlendirme sırasında karar verilir.
| İlişkilendirme | İşleçler | Ek bilgi |
|---|---|---|
| yönsüz | clone new
|
clone ve new |
| soldan | [
|
array() |
| yönsüz | ++ --
|
arttırım/eksiltim |
| yönsüz | ~ - (int) (float) (string) (array) (object) (bool)
@ |
Türler |
| yönsüz | instanceof
|
Türler |
| sağdan | !
|
mantıksal |
| soldan | * / %
|
aritmetik |
| soldan | + - .
|
aritmetik ve dizge |
| soldan | << >>
|
bitsel |
| yönsüz | < <= > >= <>
|
karşılaştırma |
| yönsüz | == != === !==
|
karşılaştırma |
| left | &
|
bitsel ve gönderimler |
| soldan | ^
|
bitsel |
| soldan | |
|
bitsel |
| soldan | &&
|
mantıksal |
| soldan | ||
|
mantıksal |
| soldan | ? :
|
üç terimli |
| sağdan |
= += -= *= /= .= %= &= |= ^= <<= >>=
|
atama |
| soldan | and
|
mantıksal |
| soldan | xor
|
mantıksal |
| soldan | or
|
mantıksal |
| soldan | ,
|
birçok kullanım |
Soldan ilişkilendirme, ifadenin soldan sağa, sağdan ilişkilendirme ise sağdan sola değerlendirileceği anlamına gelir.
Örnek 1 - Öncelik yönü
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>
Parantezleri kodun okunabilirliğini arttırmak için kullanın.
Bilginize: Eşitlik (=) işleci çoğu işleçten daha düşük önceliğe sahip olduğundan PHP halen şuna benzer ifadelere izin vermektedir: foo() işlevinin dönüş değerini $a değişkenine atayan if (!$a = foo()) ifadesi.
Okulda öğrendiğiniz temel aritmetiği hatırlıyor musunuz? Bu işleçler tam da öyle çalışır.
| Örnek | İsim | Sonuç |
|---|---|---|
-$a
|
Olumsuzlama | $a'nın eksi işaretlisi. |
$a + $b
|
Toplama | $a ile $b'nin toplamı. |
$a - $b
|
Çıkarma | $a'nın $b'den farkı. |
$a * $b
|
Çarpma | $a ile $b'nin çarpımı. |
$a / $b
|
Bölme | $a'nın $b'ye bölümü. |
$a % $b
|
Kalan | $a'nın $b'ye bölümünden kalan. |
Bölme işlecinin tamsayı bölüm vermesi için iki teriminin de tamsayı (veya dönüşüm sonucu tamsayı olan dizge) olması ve birbirlerine tam olarak bölünmesi gerekir, aksi takdirde bölüm gerçek sayı olacaktır.
Kalan işlecinin (%) terimleri gerçek sayılarsa ondalık kısımları atılarak tamsayıya dönüştürülürler.
Bilginize: $a % $b işleminin sonucu, $a negatifse negatif olacaktır.
Matematik işlevleri bölümüne de bakınız.
Temel atama işleci "=" imidir. Programlamaya yeni başlayanlar bu işleci"eşittir" diye okurlar. Aslında yapılan işlem bir şeyleri birbirlerine eşitlemek değildir. Yaptığı iş sağındaki ifadenin değerini solundaki terimin değeri haline getirmektir, yani imleci içeren ifadeyi birşey'in değeri diye okumak daha doğrudur.
Bir atama ifadesinin değeri atanan değerdir. Yani, "$a = 3" ifadesinin değeri 3'tür. Bunun bir takım yan sonuçları da vardır:
<?php
$a = ($b = 4) + 5; // $a'nın değeri 9, $b'nin değeri 4 olur.
?>
Temel atama işlecinden başka atama işlemini temel aritmetik, ikil aritmetik işlemleriyle veya dizi ya da dizge birleştirme işlemleriyle birleştiren, "birleşik atama işleçleri" vardır. Örnek:
<?php
$a = 3;
$a += 5; // $a'nın değeri 8 olur, asıl işlem: $a = $a + 5;
$b = "Herkese ";
$b .= "Merhaba!"; // $b'nin değeri "Herkese Merhaba!" olur.
// asıl işlem: $b = $b . "Merhaba!";
?>
Atama işleminin özgün değişkeni yeni değişkene kopyaladığına (değeriyle atadığına) dikkat ediniz. Dolayısıyla birinde yapılan değişiklik diğerini etkilemeyecektir. Kapalı bir döngü içinde büyükçe bir diziye atama işlemleri yapma ihtiyacı duyarsanız bu ayrı bir anlam kazanır. Gönderimli atama $değişken = &$diğerdeğişken; sözdizimi ile desteklenmektedir. 'Gönderimli atama' denince, iki değişkenin aynı veriyi gösterdiğini ve birbirlerinden birşeyler kopyalamadıklarını anlıyoruz. Gönderimler hakkında daha ayrıntılı bilgi edinmek için Gönderimlerle ilgili herşey bölümüne bakınız. PHP 5'ten itibaren, clone anahtar sözcüğü ile yeni bir nesneye atama yapılmadıkça, nesneler gönderimli olarak atanırlar.
Bitsel işleçler, bir tamsayının içindeki belli bitleri 0 ya da 1 yaparlar.
| Örnek | İsim | Sonuç |
|---|---|---|
$a & $b
|
Ve | Hem $a hem de $b'de 1 olan bitler sonuçta 1 yapılır. |
$a | $b
|
Veya | $a veya $b'de 1 olan bitler sonuçta 1 yapılır. |
$a ^ $b
|
Ayrıcalıklı Veya | Hem $a hem de $b'de 0 veya 1 olan bitler sonuçta 0, diğerleri 1 yapılır. |
~ $a
|
Değil | $a'nın 0 olan bitleri 1, 1 olanları 0 yapılır. |
$a << $b
|
Sola kaydırma | $a'nın bitleri $b adım sola kaydırılır (her adım ikiyle çarpma işlemine denktir). |
$a >> $b
|
Sağa kaydırma | $a'nın bitleri $b adım sağa kaydırılır (her adım ikiye bölme işlemine denktir). |
PHP'de bit kaydırma bir aritmetik işlemdir. Kaydırma sonucu her iki uçtan da taşan bitler silinir. Sola kaydırmada sağdan eksilen bitler sıfırlarla doldurulur, bu arada işaret biti soldan taşarak silinir, yani sola kaydırmada terimin işareti korunmaz. Sağa kaldırmada ise işaret biti yerinden oynatılmaz, yani sağa kaydırmada terimin işareti korunur.
Bir işlemin öncelik almasını istiyorsanız yaylı ayraçları kullanın. Örneğin, $a & $b == true işleminde önce eşitlik sonra bitsel VE uygulanırken ($a & $b) == true işleminde ise önce bitsel VE sonra eşitlik uygulanır.
Veri türü dönüşümlerinde dikkatli olun. Eğer sol ve sağ taraf değiştirgelerinin ikisi de dizge ise bitsel işleçler terimlerdeki karakterlerin ASCII değerleri üzerinde işlem yapacaktır.
PHP'nin error_reporting yönergesi gerçekte neler olup bittiğini göstermek
için bitsel değerler kullanır. Sadece bilgilendirmeleri değil hataların
tümünü görmek isterseniz php.ini dosyasında ilgili yere şunu yazın:
E_ALL & ~E_NOTICE
Bu E_ALL için şöyle çalışır:00000000000000000111011111111111Keza E_NOTICE...00000000000000000000000000001000... ve ~ ile ters çevrilerek:11111111111111111111111111110111Son olarak, her iki değer üzerinde etkin bitleri bulmak için VE (&) işlecini kullanır:00000000000000000111011111110111
Bunu sağlamanın bir başka yolu da sadece bir değerde veya diğerinde etkin
bitleri bulmak için XOR (^) kullanmaktır:
E_ALL ^ E_NOTICE
error_reporting yönergesi bitleri etkin kılmayı göstermek için de
kullanılabilir. Sadece hataları ve kurtarılabilir göstermenin yolu:
E_ERROR | E_RECOVERABLE_ERROR
Bu işlem etkin bitleri almak için00000000000000000000000000000001ve00000000000000000001000000000000E_ERROR'ları üzerinde VEYA (|) işlecini kullanır:00000000000000000001000000000001
Örnek 1 - Tamsayılar üzerinde bitsel işlemler
<?php
/*
* Üstteki bölümü yoksayın,
* çıktıyı iyileştirmek için biçemlemekten başka birşey yapmıyor.
*/
$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";
echo <<<EOH
--------- --------- -- ---------
sonuç değer işl dnm
--------- --------- -- ---------
EOH;
/*
* Örnekler burada.
*/
$değerler = array(0, 1, 2, 4, 8);
$dnm = 1 + 4;
echo "\n Bitsel VE \n";
foreach ($değerler as $değer) {
$sonuç = $değer & $dnm;
printf($format, $sonuç, $değer, '&', $dnm);
}
echo "\n Bitsel Ayrıcalıklı VEYA \n";
foreach ($değerler as $değer) {
$sonuç = $değer | $dnm;
printf($format, $sonuç, $değer, '|', $dnm);
}
echo "\n Bitsel Ayrıcalıklı VEYA (XOR) \n";
foreach ($değerler as $değer) {
$sonuç = $değer ^ $dnm;
printf($format, $sonuç, $değer, '^', $dnm);
}
?>
Yukarıdaki örneğin çıktısı:
--------- --------- -- --------- sonuç değer işl dnm --------- --------- -- --------- Bitsel VE ( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) Bitsel Ayrıcalıklı VEYA ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitsel Ayrıcalıklı VEYA (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
Örnek 2 - Dizgeler üzerinde bitsel işlemler
<?php
echo 12 ^ 9; // '5' çıktılar
echo "12" ^ "9"; // Gerisilme karakterini çıktılar (ASCII 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = ASCII 8
echo "hallo" ^ "hello"; // Çıktılanan ASCII değerler #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
echo 2 ^ "3"; // 1 çıktılar
// 2 ^ ((int)"3") == 1
echo "2" ^ 3; // 1 çıktılar
// ((int)"2") ^ 3 == 1
?>
Örnek 3 - Tamsayılarda bit kaydırma
<?php
/*
* Bunlar örnektir.
*/
echo "\n--- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA ---\n";
$dgr = 4;
$hane = 1;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'işaret bitinin kopyası sola kaydırıldı');
$dgr = 4;
$hane = 2;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane);
$dgr = 4;
$hane = 3;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'bitler sağa kaydırıldı');
$dgr = 4;
$hane = 4;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'yukarıdakiyle aynı; 0\'dan sonrası kaydırılamaz');
echo "\n--- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA ---\n";
$dgr = -4;
$hane = 1;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'işaret bitinin kopyası sola kaydırıldı');
$dgr = -4;
$hane = 2;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'bitler sağa kaydırıldı');
$dgr = -4;
$hane = 3;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'yukarıdakiyle aynı; -1\'dan sonrası kaydırılamaz');
echo "\n--- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA ---\n";
$dgr = 4;
$hane = 1;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'sağ taraf sıfırlarla doldurulur');
$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 4;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane);
$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 3;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'işaret bitleri dışa kaydırılır');
$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 2;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'bitler sola kaydırıldı');
echo "\n--- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA ---\n";
$dgr = -4;
$hane = 1;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'sağ taraf sıfırlarla doldurulur');
$dgr = -4;
$hane = (PHP_INT_SIZE * 8) - 3;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane);
$dgr = -4;
$hane = (PHP_INT_SIZE * 8) - 2;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'işaret biti dahil, bitler soldan dışa kaydırıldı');
/*
* Bundan sonrasını yoksayın; çıktıyı biçemlemekten başka bir şey yapmıyor.
*/
function p($snç, $dgr, $op, $hane, $ilt = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";
printf("İfade: %d = %d %s %d\n", $snç, $dgr, $op, $hane);
echo " Onluk:\n";
printf(" değer=%d\n", $dgr);
printf(" sonuç=%d\n", $snç);
echo " İkilik:\n";
printf(' değer=' . $format, $dgr);
printf(' sonuç=' . $format, $snç);
if ($ilt) {
echo " DİKKAT: $ilt\n";
}
echo "\n";
}
?>
Yukarıdaki örneğin 32 bitlik makinelerdeki çıktısı:
--- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: 2 = 4 >> 1 Onluk: değer=4 sonuç=2 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000010 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: 1 = 4 >> 2 Onluk: değer=4 sonuç=1 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000001 İfade: 0 = 4 >> 3 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: bitler sağa kaydırıldı İfade: 0 = 4 >> 4 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: yukarıdakiyle aynı; 0'dan sonrası kaydırılamaz --- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: -2 = -4 >> 1 Onluk: değer=-4 sonuç=-2 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111110 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: -1 = -4 >> 2 Onluk: değer=-4 sonuç=-1 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111111 DİKKAT: bitler sağa kaydırıldı İfade: -1 = -4 >> 3 Onluk: değer=-4 sonuç=-1 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111111 DİKKAT: yukarıdakiyle aynı; -1'dan sonrası kaydırılamaz --- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: 8 = 4 << 1 Onluk: değer=4 sonuç=8 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000001000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: 4611686018427387904 = 4 << 60 Onluk: değer=4 sonuç=4611686018427387904 İkilik: değer=000000000000000000000000000100 sonuç=010000000000000000000000000000 İfade: -9223372036854775808 = 4 << 61 Onluk: değer=4 sonuç=-9223372036854775808 İkilik: değer=000000000000000000000000000100 sonuç=100000000000000000000000000000 DİKKAT: işaret bitleri dışa kaydırılır İfade: 0 = 4 << 62 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: bitler sola kaydırıldı --- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: -8 = -4 << 1 Onluk: değer=-4 sonuç=-8 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: -9223372036854775808 = -4 << 61 Onluk: değer=-4 sonuç=-9223372036854775808 İkilik: değer=111111111111111111111111111100 sonuç=100000000000000000000000000000 İfade: 0 = -4 << 62 Onluk: değer=-4 sonuç=0 İkilik: değer=111111111111111111111111111100 sonuç=000000000000000000000000000000 DİKKAT: işaret biti dahil, bitler soldan dışa kaydırıldı
Yukarıdaki örneğin 64 bitlik makinelerdeki çıktısı:
--- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: 2 = 4 >> 1 Onluk: değer=4 sonuç=2 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000010 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: 1 = 4 >> 2 Onluk: değer=4 sonuç=1 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000001 İfade: 0 = 4 >> 3 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: bitler sağa kaydırıldı İfade: 0 = 4 >> 4 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: yukarıdakiyle aynı; 0'dan sonrası kaydırılamaz --- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: -2 = -4 >> 1 Onluk: değer=-4 sonuç=-2 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111110 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: -1 = -4 >> 2 Onluk: değer=-4 sonuç=-1 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111111 DİKKAT: bitler sağa kaydırıldı İfade: -1 = -4 >> 3 Onluk: değer=-4 sonuç=-1 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111111 DİKKAT: yukarıdakiyle aynı; -1'dan sonrası kaydırılamaz --- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: 8 = 4 << 1 Onluk: değer=4 sonuç=8 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000001000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: 4611686018427387904 = 4 << 60 Onluk: değer=4 sonuç=4611686018427387904 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0100000000000000000000000000000000000000000000000000000000000000 İfade: -9223372036854775808 = 4 << 61 Onluk: değer=4 sonuç=-9223372036854775808 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=1000000000000000000000000000000000000000000000000000000000000000 DİKKAT: işaret bitleri dışa kaydırılır İfade: 0 = 4 << 62 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: bitler sola kaydırıldı --- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: -8 = -4 << 1 Onluk: değer=-4 sonuç=-8 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: -9223372036854775808 = -4 << 61 Onluk: değer=-4 sonuç=-9223372036854775808 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1000000000000000000000000000000000000000000000000000000000000000 İfade: 0 = -4 << 62 Onluk: değer=-4 sonuç=0 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: işaret biti dahil, bitler soldan dışa kaydırıldı
32 bitlik sistemlerde 32 bitten fazla sağa kaydırma yapmayın. 32 bitten daha geniş bir sayıyla sonuçlanacak şekilde sola kaydırma yapmayın. PHP_INT_MAX'tan büyük sayılar üzerinde bitsel işlemler yapacaksanız gmp eklentisindeki işlevleri kullanın.
Ayrıca bakınız: pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp_clrbit()
Karşılaştırma işleçleri isminden de anlaşılacağı üzere iki değerin karşılaştırılmasını sağlarlar. Çeşitli veri türleri arasındaki karşılaştırma örneklerinin yer aldığı tür karşılaştırma tabloları ilginizi çekebilir.
| Örnek | İsim | Sonuç |
|---|---|---|
$a == $b
|
Eşittir | $a ve $b aynı değere sahipse sonuç TRUE olur. |
$a === $b
|
Aynıdır | $a ve $b aynı değere sahipse ve türleri de aynıysa sonuç TRUE olur. (PHP 4'ten beri vardır.) |
$a != $b
|
Eşit değildir | $a ve $b aynı değere sahip değilse sonuç TRUE olur. |
$a <> $b
|
Eşit değildir | $a ve $b aynı değere sahip değilse sonuç TRUE olur. |
$a !== $b
|
Farklıdır | $a ve $b aynı değere sahip değilse veya türleri aynı değilse sonuç TRUE olur. (PHP 4'ten beri vardır.) |
$a < $b
|
Küçüktür | $a kesin olarak $b'den küçükse sonuç TRUE olur. |
$a > $b
|
Büyüktür | $a kesin olarak $b'den büyükse sonuç TRUE olur. |
$a <= $b
|
Küçük veya eşittir | $a, $b'den küçük veya ona eşitse sonuç TRUE olur. |
$a >= $b
|
Büyük veya eşittir | $a, $b'den büyük veya ona eşitse sonuç TRUE olur. |
Bir tamsayıyı bir dizge ile karşılaştırmak isterseniz dizge önce bir sayıya dönüştürülür. İki sayısal dizge tamsayı karşılaştırması olarak ele alınır. Bu kurallar ayrıca switch deyimine de uygulanır.
<?php
var_dump(0 == "a"); // 0 == 0 -> doğru
var_dump("1" == "01"); // 1 == 1 -> doğru
var_dump("1" == "1e0"); // 1 == 1 -> doğru
switch ("a") {
case 0:
echo "0";
break;
case "a": // burası hiç işlem görmez, çünkü "a" daima 0 ile eşleşir
echo "a";
break;
}
?>
Çeşitli türler arasında karşılaştırma aşağıdaki tabloya ve tablodaki sıralamaya uygun olarak yapılır.
| 1. Terimin Türü | 2. Terimin Türü | Sonuç |
|---|---|---|
| null veya string | string | NULL, "" dizgesine dönüştürülür, sayısal veya alfabetik karşılaştırma yapılır. |
| bool veya null | herhangi bir tür | bool türüne dönüşümden sonra FALSE < TRUE karşılaştırması yapılır |
| object | object | Yerleşik sınıflar kendi karşılaştırmalarını tanımlayabilir. Farklı sınıflar karşılaştırılamazlar. Aynı sınıfın özellikleri dizilerdeki gibi (PHP 4) karşılaştırırılır. PHP 5'in uygulaması farklıdır. |
| string, resource veya number | string, resource veya number | Diziler ve özkaynaklar sayılara dönüştürülür, sayısal karşılaştırma yapılır. |
| array | array | Daha az üyeye sahip dizi diğerinden küçüktür. Eğer 1. terimin anahtarı 2. terimde yoksa diziler karşılaştırılamaz. Karşılaştırma daima değerler karşılaştırılarak yapılır (aşağıdaki örneğe bakınız). |
| array | herhangi bir tür | array daima büyüktür. |
| object | herhangi bir tür | object daima büyüktür |
Örnek 1 - Özetle Standard Dizi Karşılaştırması
<?php
// Diziler bunun gibi standart karşılaştırma işleçleri ile karşılaştırılır
function standard_dizi_karşılaştır($trm1, $trm2)
{
if (count($ter1) < count($ter2)) {
return -1; // $ter1 < $ter2
} elseif (count($op1) > count($op2)) {
return 1; // $ter1 > $ter2
}
foreach ($ter1 as $anh => $değ) {
if (!array_key_exists($anh, $ter2)) {
return null; // karşılaştırılamaz
} elseif ($değ < $ter2[$anh]) {
return -1;
} elseif ($değ > $ter2[$anh]) {
return 1;
}
}
return 0; // $ter1 == $ter2
}
?>
Ayrıca, strcasecmp(), strcmp() işlevlerine, Dizi işleçlerine ve Türler bölümüne de bakınız.
Diğer bir karşılaştırma işleci ?: (üç terimli) işlecidir.
Örnek 2 - Öntanımlı bir değer atama
<?php
// Üç terimli işleç için kullanım örneği
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Yukarıdaki kod ile buradaki if/else deyimi aynı işlemi yapar.
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
(ifade1) ? (ifade2) : (ifade3) ifadesinin sonucu, ifade1 doğruysa ifade2 değilse ifade3'dir.
PHP 5.3'ten itibaren üç terimli işlecin orta parçasını dışarda bırakmak mümkündür. ifade1 ?: ifade3 ifadesinin sonucu ifade1 TRUE ise ifade1 ile değilse ifade3'tür.
Bilginize: Üç terimli işleç aslında bir deyimdir, dolayısıyla sonucu bir değişkene atanamaz. Bir değişkeni gönderimli döndürmek istediğiniz takdirde bu önem kazanır. Gönderimli olarak değer döndüren bir işlevde return $var == 42 ? $a : $b; deyimi bu bakımdan çalışmaz ve güncel PHP sürümlerinde bir uyarı gösterilir.
Bilginize: Üç terimli işleçleri iç içe kullanmanız önerilmez. PHP'nin böyle bir işlemin tek bir deyimde yapılmak istenmesi durumundaki davranışı beklendiği gibi olmayabilir.
Örnek 3 - İç içe üç terimli davranışı
<?php
// ilk bakışta aşağıdaki deyimin sonucu 'true' olacak sanılır.
echo (true?'true':false?'t':'f');
// ancak gerçekte çıktı 't' olur.
// Çünkü üç terimli ifade soldan sağa değerlendirilir.
// Aynı deyimi şöyle yazarsanız, durum anlaşılır hale gelir
echo ((true ? 'true' : 'false') ? 't' : 'f');
// Burada, ilk ifade mantıksal olarak doğru olduğundan sonuç 'true'
// olacak, böylece ikinci üç terimlinin ilk terimi 'true' olacak ve
// ikinci üç terimliden 't' dönecektir.
?>
PHP tek bir hata denetim işlecini destekler: kuyruklu a imi (@). PHP'de bir deyimin başına getirildiğinde, bu deyimin üreteceği olası hata iletileri yok sayılır.
Eğer track_errors özelliği etkinse bu deyimin ürettiği hata iletileri $php_errormsg değişkenine kaydedilir. Her hata oluşunda yeni hata eskisinin yerini alacağından bu değişkene yeterli sıklıkta bakmanız gerekir.
<?php
/* Kasıtlı dosya hatası */
$dosyam = @file ('var_olmayan_dosya') or
die ("Dosya açılamadı: hata '$php_errormsg' değişkeninde kayıtlı");
// İfadelerle çalışır ama işlevlerle çalışmaz:
$değer = @$cache[$key];
// $key indisi mevcut değilse bir uyarı çıktılanır.
?>
Bilginize: Kuyruklu a işleci sadece ifadelerin başında kullanıldığında çalışır. Kısaca: Bir değer elde edebildiğiniz herşeyin başına @ getirebilirsiniz. Örneğin, değişkenlerin işlev veya include() çağrılarının, sabitlerin ve benzerlerinin başına @ getirebilirsiniz. Ama işlev veya sınıf tanımlarının veya if ve foreach gibi denetim yapılarının başına @ koyamazsınız.
Ayrıca, error_reporting() işlevine ve Hata İşleme ve Günce Kayıt İşlevleri bölümüne bakınız.
Şu an @ hata denetim işleci, betiğin çalışmasını sonlandıracak önemli hataların raporlanmasını bile iptal edebilmektedir. Bu bakımdan, işleci örneğin bir işlevden kaynaklanabilecek hataları bastırmak için kullanıyorsanız, işlev tanımında yaptığınız yazım hataları veya işlevin yokluğu halinde ne olup bittiğini anlamadan betiğiniz sonlanıverebilir.
PHP tek bir çalıştırma işlecini destekmektedir: ters tırnak imleri (``). Bunların bildiğiniz tek tırnaklar olmadığına dikkat edin! Ters tırnak imlerinin arasına yazılmış komutları PHP komut satırında çalıştıracak ve çıktısını döndürecektir. Yani, komut satırına birşey çıktılanmaz; ama sonucu bir değişkene atayabilirsiniz. Çalıştırma işleci shell_exec() işlevinin yaptığı işi yapar.
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
Bilginize:
safe_modeetkinse veya shell_exec() işlevi etkin değilse, çalıştırma işleci etkin değildir.
Ayrıca, Program Çalıştırma İşlevleri, popen(), proc_open() işlevleri ve PHP'nin komut satırından kullanılması bölümüne de bakınız.
PHP, C tarzı önceden ve sonradan arttırım ve eksiltim işleçlerini destekler.
Bilginize: Arttırım ve eksiltim işleçleri mantıksal değerler üzerinde etkisizdir. NULL değerini eksiltmenin bir etkisi yoktur fakat arttırmanın sonucu 1'dir.
| Örnek | İsim | Etkisi |
|---|---|---|
++$a
|
Önceden arttırım | $a bir arttırıldıktan sonra döndürülür. |
$a++
|
Sonradan arttırım | $a döndürüldükten sonra değeri bir arttırılır. |
--$a
|
Önceden eksiltim | $a bir eksiltildikten sonra döndürülür. |
$a--
|
Sonradan eksiltim | $a döndürüldükten sonra değeri bir eksiltilir. |
Basit bir betik örneği:
<?php
echo "<h3>Sonradan arttırım</h3>\n";
$a = 5;
echo "5 olmalı: " . $a++ . "<br />\n";
echo "6 olmalı: " . $a . "<br />\n";
echo "<h3>Önceden arttırım</h3>\n";
$a = 5;
echo "6 olmalı: " . ++$a . "<br />\n";
echo "6 olmalı: " . $a . "<br />\n";
echo "<h3>Sonradan eksiltim</h3>\n";
$a = 5;
echo "5 olmalı: " . $a-- . "<br />\n";
echo "4 olmalı: " . $a . "<br />\n";
echo "<h3>Önceden eksiltim</h3>\n";
$a = 5;
echo "4 olmalı: " . --$a . "<br />\n";
echo "4 olmalı: " . $a . "<br />\n";
?>
PHP, karakter değişkenleri üzerinde çalışırken C'nin değil Perl'in yöntemlerini izler. Örneğin, Perl'de 'Z'+1 ifadesi 'AA' değerini döndürürken, C'de '[' döner ( ord('Z') == 90, ord('[') == 91 ). Karakterlerin arttırılabileceğini fakat azaltılamayacağını ve sadece ASCII harflerin (a-z ve A-Z) desteklendiğine dikkat ediniz.
Örnek 1 - Karakter değişkenleri üzerinde aritmetik işlemler
<?php
$i = 'W';
for ($n=0; $n<6; $n++) {
echo ++$i . "\n";
}
?>
Yukarıdaki örneğin çıktısı:
X Y Z AA AB AC
Mantıksal değerlere arttırım ve eksiltim uygulamanın bir etkisi olmaz.
| Örnek | İsim | Sonuç |
|---|---|---|
$a and $b
|
Ve | $a ve $b her ikisi de doğruysa sonuç doğrudur (TRUE). |
$a or $b
|
Veya | $a veya $b doğruysa sonuç doğrudur. |
$a xor $b
|
Ayrıcalıklı Veya | $a veya $b doğruysa sonuç doğru, her ikiside doğruysa sonuç yanlıştır (FALSE). |
! $a
|
Değil | $a doğru değilse sonuç doğrudur. |
$a && $b
|
Ve | $a ve $b her ikisi de doğruysa sonuç doğrudur. |
$a || $b
|
Veya | $a veya $b doğruysa sonuç doğrudur. |
Ve, Veya işleçlerinin iki farklı türü olmasının sebebi önceliklerinin farklı oluşudur. (Bakınız: İşleç Önceliği.)
Örnek 1 - Örneklerle mantıksal işleçler
<?php
// --------------------
// Aşağıdaki ifadelerde ilk terim sonucu belirlediğinden ikinci
// terime hiç bakılmayacak, yani foo() işlevi hiç çağrılmayacaktır.
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
// --------------------
// "||" işlecinin önceliği "or" işlecinden yüksektir.
// İfadenin sonucu $e'ye atanır (false || true)
// Tıpkı şöyle: ($e = (false || true))
$e = false || true;
// false sabiti $f'ye atanır ve true yoksayılır
// Tıpkı böyle: (($e = false) or true)
$f = false or true;
var_dump($e, $f);
// --------------------
// "&&" işlecinin önceliği "and" işlecinden yüksektir.
// İfadenin sonucu $g'ye atanır (true && false)
// Tıpkı böyle: ($g = (true && false))
$g = true && false;
// true sabiti $h'ya atanır ve false yoksayılır
// Tıpkı böyle: (($h = true) and false)
$h = true and false;
var_dump($g, $h);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
bool(true) bool(false) bool(false) bool(true)
İki tane dizge işleci vardır. İlki sol ve sağ terimlerini ard arda ekleyen birleştirme işleci ('.'), ikincisi ise sağ taraftaki değiştirgeyi sol taraftaki değiştirgeye ekleyen birleştirerek atama işlecidir (.=). Daha fazla bilgi için atama işleçleri bölümüne bakınız.
<?php
$a = "Merhaba ";
$b = $a . "Dünyalı!"; // $b artık "Merhaba Dünyalı!" içeriyor
$a = "Merhaba ";
$a .= "Dünyalı!"; // $a artık "Merhaba Dünyalı!" içeriyor
?>
Ayrıca, string türünün açıklamasına ve Dizge İşlevleri bölümüne bakınız.
| Örnek | İsim | Sonuç |
|---|---|---|
$a + $b
|
Birleşim | $a ve $b'nin birleşimi. |
$a == $b
|
Eşitlik | $a ve $b aynı anahtar/değer çiftlerine sahipse sonuç doğrudur. |
$a === $b
|
Aynılık | $a ve $b aynı anahtar/değer çiftlerine sahipse ve bunların sırası ve türleri aynıysa sonuç doğrudur. |
$a != $b
|
Eşitsizlik | $a ve $b birbirine eşit değilse sonuç doğrudur. |
$a <> $b
|
Eşitsizlik | $a ve $b birbirine eşit değilse sonuç doğrudur. |
$a !== $b
|
Farklılık | $a ve $b aynı dizi değilse sonuç doğrudur. |
+ işleci sağ taraftaki dizinin elemanlarını sol taraftaki dizinin elemanlarının arasına ekler. Bunu yaparken anahtarları aynı olan elemanların üzerine yazılmaz.
<?php
$a = array("a" => "elma", "b" => "armut");
$b = array("a" => "vişne", "b" => "kiraz", "c" => "çilek");
$c = $a + $b;
echo "\$a ve \$b'nin birleşimi: \n";
var_dump($c);
$c = $b + $a;
echo "\$b ve \$a'nın birleşimi: \n";
var_dump($c);
?>
Betik çalıştırıldığında şu çıktıyı verir:
$a ve $b'nin birleşimi:
array(3) {
["a"]=>
string(4) "elma"
["b"]=>
string(5) "armut"
["c"]=>
string(6) "çilek"
}
$b ve $a'nın birleşimi:
array(3) {
["a"]=>
string(6) "vişne"
["b"]=>
string(5) "kiraz"
["c"]=>
string(6) "çilek"
}
Aynı anahtar ve değere sahip dizi elemanları birbirine eşit kabul edilir.
Örnek 1 - Dizilerin karşılaştırılması
<?php
$a = array("elma", "armut");
$b = array(1 => "armut", "0" => "elma");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Ayrıca, array türünün açıklamasına ve Dizi İşlevleri bölümüne de bakınız.
instanceof işleci, bir PHP değişkeninin belli bir sınıfın nesnel örneği olup olmadığını saptar:
Örnek 1 - instanceof ve sınıflar
<?php
class Sınıfım
{
}
class BaşkaSınıf
{
}
$a = new Sınıfım;
var_dump($a instanceof Sınıfım);
var_dump($a instanceof BaşkaSınıf);
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(false)
instanceof ayrıca, bir değişkenin, bir ebeveyn sınıftan miras alınan bir sınıfın nesnel örneği olup olmadığını saptamak için de kullanılabilir:
Örnek 2 - Miras alınan sınıflar ve instanceof kullanımı
<?php
class EbeveynSınıf
{
}
class Sınıfım extends EbeveynSınıf
{
}
$a = new Sınıfım;
var_dump($a instanceof Sınıfım);
var_dump($a instanceof EbeveynSınıf);
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(true)
Bir nesne bir sınıfın örneği değilse bunu sınamak için mantıksal değil işleci kullanılabilir.
Örnek 3 - Bir sınıfın örneği olmayan bir sınıfın instanceof ile sınanması
<?php
class Sınıfım
{
}
$a = new Sınıfım;
var_dump(!($a instanceof stdClass));
?>
Yukarıdaki örneğin çıktısı:
bool(true)
Son olarak, instanceof işleci, bir değişkenin, bir arayüzü gerçekleyen bir sınıfın örneği olup olmadığını sınamak için kullanılabilir:
Örnek 4 - Arayüzler için instanceof kullanımı
<?php
interface Arayüzüm
{
}
class Sınıfım implements Arayüzüm
{
}
$a = new Sınıfım;
var_dump($a instanceof Sınıfım);
var_dump($a instanceof Arayüzüm);
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(true)
instanceof işlecinin normal olarak bir sayıl sınıf ismi ile kullanılmasının yanında başka bir nesne veya bir dizge değişkeni ile de kullanılabilir:
Örnek 5 - Başka değişkenlerle instanceof kullanımı
<?php
interface Arayüzüm
{
}
class Sınıfım implements Arayüzüm
{
}
$a = new Sınıfım;
$b = new Sınıfım;
$c = 'Sınıfım';
$d = 'BaşkaSınıf';
var_dump($a instanceof $b); // $b, Sınıfım sınıfının bir nesnesidir
var_dump($a instanceof $c); // $c 'Sınıfım' dizgesini içerir
var_dump($a instanceof $d); // $d 'BaşkaSınıf' dizgesini içerir
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(true) bool(false)
Burada bilmeniz gereken bir kaç zorluk vardır. PHP 5.1.0 öncesinde, instanceof işleci, sınıf mevcut değilse __autoload() çağrısı yapardı. Buna ek olarak, sınıf yüklenmemişse bir ölümcül hata oluşurdu. Bunun olmaması için bir devingen sınıf gönderimi veya sınıf ismini içeren bir dizge değişkeni kullanılabilir:
Örnek 6 - PHP 5.0'da instanceof ile ölümcül hatalardan ve sınıf ismi aramalarından kaçınmak
<?php
$d = 'BaşkaSınıf';
var_dump($a instanceof $d); // burada ölümcül hata oluşmaz
?>
Yukarıdaki örneğin çıktısı:
bool(false)
instanceof işleci PHP 5'ten itibaren mevcuttur. Evvelce is_a() işlevi kullanılırdı fakat instanceof kullanımını teşvik etmek için is_a() kullanımı önerilmemekteyse de PHP 5.3.0'dan itibaren bundan vazgeçilmiştir.
Ayrıca, get_class() ve is_a() işlevlerine de bakınız.
Bütün PHP betikleri bir dizi deyimden oluşur. Bir deyim; bir atama, bir işlev çağrısı, bir döngü, bir koşullu deyim hatta hiçbir şey yapmayan bir deyim (boş bir deyim) olabilir. Deyimler bir noktalı virgülle sonlandırılır. Ek olarak, deyimler kaşlı ayraçlar içine alınarak deyim grupları haline getirilebilirler. Bir deyim grubu da kendi başına bir deyim olarak kabul edilir. Bu fasılda deyim türlerinden bahsedeğiz.
if oluşumu, PHP dahil olmak üzere birçok programlama dilindeki en önemli yapı taşlarından biri olup kod bölümlerinin koşullu olarak çalıştırılabilmelerini sağlar. PHP, C dilindekine benzer bir if yapısı sunar:
if (ifade)
deyim
İfadelerle ilgili bölümde de anlatıldığı gibi, ifade kendi mantıksal değeri üzerinden değerlendirilir. ifade'nin sonucu TRUE ise, PHP deyim'i çalıştırır, FALSE ise gözardı eder. Hangi değerlerin FALSE olarak değerlendirildiği hakkında daha fazla bilgiyi boolean türüne dönüşüm bölümünde bulabilirsiniz.
Aşağıdaki örnek, $a değeri $b
değerinden büyük olduğu takdirde a büyüktür b metnini
görüntüleyecektir:
<?php
if ($a > $b)
echo "a büyüktür b";
?>
Çoğunlukla birden çok deyimin koşullu olarak çalıştırılmasını
isteyeceksiniz. Elbette, her deyimi ayrı ayrı if
cümlecikleri içine almanıza gerek yoktur. Birden çok deyimi tek bir
deyim grubu içine toplayabilirsiniz. Örneğin, aşağıdaki kod
$a değeri $b değerinden büyük
olduğu takdirde a büyüktür b metnini görüntüleyecektir ve
sonrasında $a değişkeninin değerini
$b değişkenine atayacaktır:
<?php
if ($a > $b) {
echo "a büyüktür b";
$b = $a;
}
?>
Sonsuz sayıda if deyimi bir başka if deyiminin içine gömülebilir. Bu, uygulamanızın çeşitli bölümlerine koşullu deyimler uygulayabilmeniz için tam bir esneklik sağlar.
Çoğu zaman belli bir koşul sağlandığında bir deyimin, o koşul sağlanmadığında başka bir deyimin çalıştırılmasını isteyeceksiniz. Bunun için else kullanılmaktadır. Else, bir if deyimini FALSE döndürdüğü takdirde bir deyim çalıştırmak üzere genişletir. Örneğin, aşağıdaki kod $a değeri $b değerinden büyükse a büyüktür b, büyük değilse a büyük değildir b iletisini görüntüleyecektir:
<?php
if ($a > $b) {
echo "a büyüktür b";
} else {
echo "a büyük değildir b";
}
?>
Else deyimi yalnızca if deyiminin FALSE döndürdüğü durumda çalıştırılacaktır. Aynı durum, FALSE döndüren herhangi bir elseif ifadesinin olması durumunda da geçerlidir (bakınız elseif).
elseif, isminden de anlaşılacağı gibi, if ve else deyimlerinin biraraya gelmesiyle oluşur. else gibi, orijinal if ifadesinin FALSE döndürdüğü durumda farklı bir deyimin çalıştırılması için kullanılır. Ancak, else'ten farklı olarak, ilgili deyimi sadece kendisine ait koşullu ifade TRUE değerini döndürdüğü takdirde çalıştıracaktır. Örneğin, aşağıdaki kod a büyüktür b, a eşittir b ya da a küçüktür b iletisini görüntüleyecektir:
<?php
if ($a > $b) {
echo "a büyüktür b";
} elseif ($a == $b) {
echo "a eşittir b";
} else {
echo "a küçüktür b";
}
?>
Aynı if deyimine ait birden çok elseif bulunabilir. İlk önce hangi elseif deyimi TRUE değerini döndürürse (eğer döndüren varsa) o deyim çalıştırılır. Bu deyimi 'elseif' biçiminde tek sözcük olarak kullanabileceğiniz gibi, 'else if' biçiminde iki sözcük olarak da kullanabilirsiniz, sonuç aynı olacaktır. Sözdiziminin anlamlandırılması açısından küçük bir farklılık olsa da (C diline aşinaysanız, onda da böyledir) sonuç olarak her ikisi de aynı sonucu üretecektir.
elseif ifadesi yalnızca kendisinden önceki if ifadesi ve bu ifadeye bağlı kendisinden önce gelen diğer tüm elseif ifadeleri FALSE ile sonuçlandığında çalıştırılır ve TRUE olarak değerlendirilir.
Bilginize: elseif ve else if, yukarıdaki örnekten anlaşılacağı üzere sadece kaşlı ayraçlar kullanıldığı zaman tamamen aynı şekilde ele alınacaktır. if ve elseif için iki noktalı sözdizimi kullanıldığında elseif'i iki sözcüğe ayırmamanız gerekir, yoksa PHP bir çözümleme hatası vererek başarısız olur.
<?php
/* Yanlış Yöntem: */
if($a > $b):
echo $a." büyüktür ".$b;
else if($a == $b): // Bu derlenmez.
echo "Üstteki satır bir çözümleme hatasına yol açar.";
endif;
/* Doğru Yöntem: */
if($a > $b):
echo $a." büyüktür ".$b;
elseif($a == $b): // Sözcüklerin birleşik oluşuna dikkat!
echo $a." eşittir ".$b;
else:
echo $a." ne büyük ne de eşittir ".$b;
endif;
?>
PHP bazı denetim yapıları için farklı bir sözdizimi sağlar. Bu yapılar if, while, for, foreach ve switch yapılarıdır. Her durumda, bu farklı sözdiziminin basit şekli açılışta kullanılan kaşlı ayracın yerine iki nokta imi (:) ve kapanışta kullanılan kaşlı ayraç yerine de sırasıyla endif;, endwhile;, endfor;, endforeach; ya da endswitch; deyimlerinden birini kullanmaktır.
<?php if ($a == 5): ?>
A eşittir 5
<?php endif; ?>
Yukarıdaki örnekte, içeriği "A eşittir 5" olan HTML bloğu iki noktalı sözdimi kullanılarak yazılmış bir if deyiminin içine gömülmüştür. HTML bloğu yalnızca $a değişkeni 5'e eşit olduğunda gösterilecektir.
İki noktalı sözdimi, else ve elseif için de kullanılabilir. Birazdan vereceğimiz örnek, iki noktalı sözdizimi ile yazılmış elseif ve else içeren bir if yapısıdır:
<?php
if ($a == 5):
echo "a eşittir 5";
echo "...";
elseif ($a == 6):
echo "a eşittir 6";
echo "!!!";
else:
echo "a ne 5 ne de 6'dır";
endif;
?>
Daha fazla örnek için while, for ve if cümleciklerine bakabilirsiniz.
while döngüsü PHP'de yer alan en basit döngü türüdür. C'deki karşılığı ile aynı şekilde çalışır. Bir while deyiminin basit kullanımı:
while (ifade)
deyim
While deyiminin anlamı basittir. while deyimindeki ifade TRUE olduğu müddetçe etki alanındaki deyimleri PHP tekrar tekrar çalıştırır. İfadenin değeri döngünün her yinelenişinde yeniden değerlendirilir, deyimlerin çalıştırılması sırasında bu ifadenin değeri FALSE olsa bile, etki alanındaki deyimlerin tamamı çalıştırılıncaya kadar işlem devam eder. (PHP döngü içindeki deyimleri her yinelemede bir kere çalıştırır.) Bazen, while ifadesi daha başlangıçta FALSE değerini verir, bu durumda while etki alanındaki deyimler tek bir defa bile çalıştırılmazlar.
if deyiminde olduğu gibi, birden çok deyimi aynı while döngüsü içinde kaşlı ayraçlar arasında veya iki noktalı sözdizimini kullanarak gruplayabilirsiniz:
while (ifade):
deyimler
...
endwhile;
Aşağıdaki örnekler birbirleri ile aynıdırlar, her ikisi de sayıları 1'den 10'a kadar yazacaktır:
<?php
/* örnek 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* yazdırılan değer $i
değerinin artıştan önceki
değeridir (sonda-arttırım) */
}
/* örnek 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
do-while döngüsü, while döngüsüne çok benzer; farkı, doğrulama ifadesinin her yinelemenin başında değil sonunda değerlendiriliyor olmasıdır. while döngüsü ile temek farklılık, do-while kullanıldığında ilk yinelemenin daima yapılıyor olmasıdır (ifadenin doğruluğuna yalnızca yinelemenin sonunda bakılır); halbuki while döngüsünde, ifadenin doğruluğuna her yinelemenin öncesinde bakılmakta ve ifadenin sonucu doğru değilse yineleme hiç başlatılmadan döngü sonlandırılmaktadır.
do-while döngüsü için yalnızca tek bir sözdizimi mevcuttur:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
Yukarıdaki döngü tam olarak bir defa çalışacaktır, ilk tekrardan sonra ifadenin doğruluğuna bakıldığında FALSE değerini verecek ($i sıfırdan büyük değildir) ve döngünün çalışması sonlanacaktır.
<?php
do {
if ($i < 5) {
echo "i yeterince büyük değil";
break;
}
$i *= $çarpan;
if ($i < $alt_sınır) {
break;
}
echo "i uygun";
/* i değerini işle */
} while (0);
?>
Burada neler olup bittiğini anlamadıysanız endişelenmeyin. Bu 'özelliği' kullanmadan da oldukça gelişmiş ve güçlü uygulamalar geliştirebilirsiniz. PHP 5.3.0'dan beri bu özelliğin yerine goto kullanılabilmektedir.
for döngüsü, PHP'deki en karmaşık döngü yapısıdır. C'deki karşılığıyla aynı biçimde çalışır. for döngüsünün sözdimi:
for (ifade1; ifade2; ifade3)
deyim
İlk ifade (ifade1) döngünün en başında bir kereliğine koşulsuz olarak çalıştırılır.
Her yinelemenin başında ifade2 yeniden değerlendirilir. Bu ifadeden TRUE sonucu elde edilirse, döngüye devam edilir ve döngünün etki alanındaki deyimler çalıştırılır. Bu ifadeden FALSE sonucu elde edildiğinde etki alanındaki deyimler çalıştırılmaksızın döngü sonlandırılır.
ifade3 ise her yinelemenin sonunda çalıştırılır.
Bu ifadelerin herbirini boş bırakmak da mümkündür. ifade2nin boş olması, döngünün sonsuza kadar çalıştırılacağı anlamına gelir (PHP, C'deki gibi bu durumu TRUE olarak değerlendirir). Döngülerden genellikle bir şarta bağlı olarak break deyimi ile çıkmak isteyeceğiniz düşünüldüğünde, bu durum düşündüğünüz kadar kullanışsız değildir.
Aşağıdaki örnekleri ele alalım. Hepsi de 1'den 10'a kadar sayıları görüntülemektedir:
<?php
/* örnek 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* örnek 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* örnek 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* örnek 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Elbette, kullandığımız ilk örnek en güzel örnek olarak gözükmektedir (ya da belki dördüncü örnek), ancak birçok durumda for döngüsü içerisinde boş ifadeler kullanmayı oldukça kullanışlı bulabilirsiniz.
PHP, iki noktalı sözdizimini for döngüleri için de desteklemektedir.
for (ifade1; ifade2; ifade3):
deyimler
...
endfor;
Çoğu kullanıcının yaptığı gibi diziler üzerindeki yinelemeleri şöyle yapabilirsiniz:
<?php
/*
* Diziye baştan bir kaç veri atıp daha sonra
* döngü içinde verilerde değişiklik yapacağız.
*/
$bizimkiler = Array(
Array('isim' => 'Ali', 'tuz' => 856412),
Array('isim' => 'Veli', 'tuz' => 215863)
);
for($i = 0; $i < sizeof($bizimkiler); ++$i)
{
$bizimkiler[$i]['tuz'] = rand(000000, 999999);
}
?>
Sorun ikinci ifadede gizlidir. Her yinelemede dizinin boyutları yeniden hesaplandığından kod yavaş çalışabilir. Örnekte boyut değişmediğinden dizi boyutunu önce bir değişkene atıp ifadede bu değişken kullanılarak kod en iyilenebilir. Aşağıdaki bunun yapılışı örneklenmiştir:
<?php
$bizimkiler = Array(
Array('isim' => 'Ali', 'tuz' => 856412),
Array('isim' => 'Veli', 'tuz' => 215863)
);
for($i = 0, $size = sizeof($bizimkiler); $i < $size; ++$i)
{
$bizimkiler[$i]['salt'] = rand(000000, 999999);
}
?>
PHP 4 ile birlikte Perl ve bazı diğer dillerde mevcut olan foreach yapısı da kullanıma sunulmuştur. Bu deyim diziler üzerinde yineleme yapmayı kolaylaştırmaktadır. foreach yalnızca diziler için kullanılabilir; farklı veri türünde veya ilklendirilmemiş bir değişken ile kullanmak istediğinizde hata verir. İki sözdizimi mevcuttur; ikincisi birinciden biraz daha kullanışlıdır:
foreach (dizi_ifadesi as $değer)
deyim
foreach (dizi_ifadesi as $isim => $değer)
deyim
İlk sözdizimi dizi_ifadesi ile belirtilen dizinin üzerinde döngü oluşturur. Her yinelemede, sırası gelen elemanın değeri $değer değişkenine atanır ve dizi göstericisi bir arttırılır (böylece bir sonraki yinelemede dizinin bir sonraki elemanına bakılması sağlanmış olur).
İkinci yöntem de aynı şeyi yapar, ek olarak her yinelemede sırası gelen elemanın anahtarı $isim değişkenine atanır.
PHP 5'den itibaren, nesneleri yinelemek mümkün olmuştur.
Bilginize: foreach ilk çalışmaya başladığında, dizi göstericisi özdevinimli olarak ilk elemanı gösterecek biçimde sıfırlanır. Bu sebeple, foreach deyiminden önce reset() işlevini çalıştırmanıza gerek yoktur.
Bilginize: Dizi gönderimli olmadıkça, foreach dizinin kendisi üzerinde değil, bir kopyası üzerinde çalışır. Bundan dolayı özgün dizi göstericisi değiştirilmez ve döndürülen dizi elemanı üzerinde yapılan değişiklikler özgün diziye yansıtılmaz.
PHP 5'den itibaren, $değer değişkeninin önüne & koyarak dizi elemanları üzerinde kolayca değişiklik yapılabilmektedir. Bu kullanımla değeri kopyalamak yerine kendisine bir gönderim yapılması sağlanır.
<?php
$dizi = array(1, 2, 3, 4);
foreach ($dizi as &$değer) {
$value = $değer * 2;
}
// $dizi artık array(2, 4, 6, 8) olmuştur
unset($değer); // son eleman da işlendiğine göre gönderimi kaldıralım
?>
Bu durum yalnızca yinelenen diziye gönderim yapılabiliyorsa mümkündür (örneğin, bir değişkense), yani aşağıdaki kod çalışmaz:
<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>
$değer gönderim için kullanıldığından foreach döngüsünün sonunda son dizi elemanına gönderimli olarak kalır, bu bakımdan döngünün sonunda bu gönderimin unset() işlevi kullanılarak kaldırılması önerilir.
Bilginize: foreach, hata iletilerinin '@' kullanılarak gözardı edilmesi özelliğini desteklemez.
Aşağıdaki iki döngünün aynı işi yaptığını farkedeceksiniz:
<?php
$dizi = array("bir", "iki", "üç");
reset($dizi);
while (list(, $değer) = each($dizi)) {
echo "Değer: $değer<br />\n";
}
foreach ($dizi as $değer) {
echo "Değer: $değer<br />\n";
}
?>
Aşağıdakiler de işlevsel olarak aynıdır:
<?php
$dizi = array("bir", "iki", "üç");
reset($dizi);
while (list($isim, $değer) = each($dizi)) {
echo "Anahtar: $isim; Değer: $değer<br />\n";
}
foreach ($dizi as $isim => $değer) {
echo "Anahtar: $isim; Değer: $değer<br />\n";
}
?>
Değişik kullanımlara örnekler:
<?php
/* foreach örneği 1: yalnızca değer */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "\$a değişkeninin şu anki değeri: $v.\n";
}
/* foreach örneği 2: değer (örnek olması için anahtar
* ile birlikte yazdırılmıştır) */
$a = array(1, 2, 3, 17);
$i = 0; /* yalnızca örnekleme için */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* foreach örneği 3: anahtar ve değer */
$a = array(
"bir" => 1,
"iki" => 2,
"üç" => 3,
"on yedi" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* foreach örneği 4: çok boyutlu diziler */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* foreach örneği 5: devingen diziler */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
break deyimi, for, foreach, while, do-while ve switch yapılarının çalışmasını sonlandırmak için kullanılır.
break deyiminde istenirse bir sayısal ifade belirtilebilir. Bu sayı iç içe yapılardan içten dışa kaç yapının aynı anda durdurulacağını belirler.
<?php
$arr = array('sıfır', 'bir', 'iki', 'üç', 'dur', 'dört', 'beş');
while (list(, $val) = each($arr)) {
if ($val == 'dur') {
break; /* Burada 'break 1;' de yazabilirsiniz. */
}
echo "$val<br />\n";
}
/* Sayısal değer kullanımı. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "5'de<br />\n";
break 1; /* Yalnızca switch'ten çıkar. */
case 10:
echo "10'da; çıkılıyor<br />\n";
break 2; /* switch ve while'dan aynı anda çıkılır. */
default:
break;
}
}
?>
continue deyimi döngü yapılarının içinde kullanılır. Bu deyim kullanıldığında, döngünün kalan kısmı atlanır ve sonraki yineleme başlatılır.
Bilginize: PHP'de switch deyimi continue deyiminin kullanılabileceği döngülerden biri olarak kabul edilmektedir.
continue deyimi ile seçime bağlı sayısal bir değer kullanılarak, atlama işleminin kaç seviye üstteki döngüye kadar uygulanacağı belirtilebilir.
<?php
while (list($key, $value) = each($arr)) {
if (!($key % 2)) { // tek sayıları atla
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Dış<br />\n";
while (1) {
echo " Orta<br />\n";
while (1) {
echo " İç<br />\n";
continue 3;
}
echo "Bu hiçbir zaman çıktı vermez.<br />\n";
}
echo "Bundan da çıktı alamazsınız.<br />\n";
}
?>
continue deyiminden sonra noktalı virgül konmazsa bu durum karışıklığa yol açabilir. Yapmamanız gereken ile ilgili bir örnek:
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
Şu biçimde bir çıktı almayı bekleyebilirsiniz:
0 1 3 4
Ancak çıktı şu şekilde olacaktır:
2
Bunun sebebi print() işlevinden dönen değerin int(1) olması ve bu dönen değerin PHP tarafından yukarıda bahsedilen seçime sağlı sayısal değer olarak algılanmasıdır.
switch deyimi, aynı ifade içersinde yer alan bir dizi IF deyimine benzer. Birçok durumda, aynı değişkeni (ya da ifadeyi) birden çok değerle karşılaştırmak ve her karşılaştırmanın sonucunu ayrı bir kod parçası çalıştırarak değerlendirmek istersiniz. İşte bu, switch deyiminin varlık sebebidir.
Bilginize: Başka bazı dillerden farklı olarak, continue deyimi switch ile uygulanabilir ve break ile benzerlik gösterir. Bir döngü içerisinde switch kullandıysanız ve kodun yürütülmesine dıştaki döngünün sonraki yinelemeden devam etmesini istiyorsanız, continue 2 kullanabilirsiniz.
Bilginize: switch ve case gevşek karşılaştırma yapar.
Aşağıdaki iki örnek aynı şeyi yazmanın iki farklı yolunu göstermektedir. Birincisi bir dizi if ve elseif deyiminin kullanımını, ikincisi ise switch deyiminin kullanımını örneklemektedir:
Örnek 1 - switch yapısı
<?php
if ($i == 0) {
echo "i eşittir 0";
} elseif ($i == 1) {
echo "i eşittir 1";
} elseif ($i == 2) {
echo "i eşittir 2";
}
switch ($i) {
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
}
?>
Örnek 2 - switch ile dizge kullanımı
<?php
switch ($i) {
case "elma":
echo "i bir elmadır";
break;
case "çikolata":
echo "i bir çikolatadır";
break;
case "kek":
echo "i bir kektir";
break;
}
?>
Hatalardan kaçınmak için switch deyiminin nasıl çalıştığını anlamak önemlidir. switch deyimi satır satır ele alınır (aslında deyim deyim). Başlangıçta, hiçbir kod çalıştırılmaz. Yalnızca switch ifadesiyle birlikte verilen değer ile uyuşan case deyimi bulunduğunda PHP ilgili deyimleri çalıştırmaya başlar. PHP switch bloğu sonlanana kadar ya da ilk break deyimi ile karşılaşıncaya kadar çalışmasına devam eder. Bir case bloğunun sonuna break koymazsanız, PHP sonraki case deyiminden kodları çalıştırmaya devam eder. Örnek:
<?php
switch ($i) {
case 0:
echo "i eşittir 0";
case 1:
echo "i eşittir 1";
case 2:
echo "i eşittir 2";
}
?>
Burada, $i 0'a eşit ise, PHP tüm echo deyimlerini çalıştıracaktır! $i 1'e eşit ise, PHP son iki echo deyimini çalıştıracaktır! Beklediğiniz sonucu ('i eşittir 2' metninin görüntülenmesi) yalnızca $i 2'ye eşitse almanız mümkün olacaktır. Bu durumun oluşmaması için, break deyimini kullanmayı unutmamanız önemlidir (yine de, bazı durumlarda break deyimini kullanmak istemeyebilirsiniz).
Bir switch deyiminde, koşul yalnızca bir defa sorgulanır ve sonuç her bir case deyimi ile karşılaştırılır. Bir elseif deyiminde ise, koşul tekrar sorgulanır. Kullanmak istediğiniz koşul basit bir karşılaştırma işleminden daha karmaşıksa ve/veya bir döngü içerisindeyse, switch kullanmak daha hızlı olabilir.
case bloğu kod içermeyebilir ve amacı yalnızca denetimi bir sonraki case bloğuna geçirmek olabilir.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i 3'ten küçüktür ama negatif değildir";
break;
case 3:
echo "i eşittir 3";
}
?>
default durumu özel bir durumdur. Bu durum diğer hiçbir case ile uyuşmayan değerler için kullanılır ve en sonda yer almalıdır. Örneğin:
<?php
switch ($i) {
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
default:
echo "i ne 0, ne 1 ne de 2'ye eşittir";
}
?>
case ifadesi bir basit tür olarak değerlendirilebilecek herhangi bir tür olabilir; yani, tam sayı (integer), gerçel sayı (float) veya dizge (string) olabilir. Diziler (array) ya da nesneler (object), bir basit türe indirgenmedikleri sürece kullanılamazlar.
İki noktalı sözdizimi switch deyimi için de desteklenmektedir. Daha fazla bilgi için, Denetim yapıları için diğer söz dizimi bölümünü inceleyebilirsiniz.
<?php
switch ($i):
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
default:
echo "i ne 0, ne 1 ne de 2'ye eşittir;
endswitch;
?>
case’ten sonraki iki nokta yerine aşağıdaki gibi deyim sonunda noktalı virgül kullanmak da mümkündür:
<?php
switch($içecek)
{
case 'su';
case 'süt';
case 'ayran';
echo 'İyi seçim';
default;
echo 'Lütfen yeniden seçiniz...';
break;
}
?>
declare yapısı bir kod bloğunun çalıştırılması esnasında uygulanacak yönergeleri belirlemek için kullanılır. declare yapısının sözdizimi diğer akış denetim yapılarının söz dizimi ile benzerdir:
declare (yönerge)
deyim
yönerge bölümü, declare bloğunun davranışını belirlemek için kullanılır. Şimdilik yalnızca iki yönerge kullanılabilmektedir: ticks yönergesi (Daha fazla bilgi edinmek için aşağıya, ticks yönergesine bakınız.) ve encoding yönergesi.
Bilginize: encoding yönergesi PHP 5.3.0'da eklenmiştir.
declare bloğunun deyim bölümünün nasıl çalıştırılacağı ve çalışma esnasındaki yan etkilerinin ne olacağı yönerge bölümünde belirtilen yönergeye bağlı olabilir.
declare bloğu kendinden sonra gelen tüm kodu etkilemesi için genel betik kapsamında da kullanılabilir. Bununla birlikte, declare bloğu dahil edilen bir dosyanın içindeyse ebeveyn dosya bundan etkilenmez.
<?php
// aşağıdaki iki örnek aynıdır:
// bunu kullanabilirsiniz:
declare(ticks=1) {
// betiğin tamamı burada
}
// ya da bunu kullanabilirsiniz:
declare(ticks=1);
// betiğin tamamı burada
?>
Tikler
Bir "tik", declare bloğu içersinde çözümleyici
tarafından çalıştırılan her N tiklenebilir deyimde bir
ortaya çıkan bir olaydır. N değeri,
declare bloğunun yönerge
bölümünde ticks=N kullanılarak
belirtilir.
Her deyim tik sayımına dahil edilebilir değildir. Koşullu ifadeler ve değiştirge ifadeleri bu tür deyimlerdendir.
Her tik ile oluşturulacak eylem register_tick_function() işlevi ile belirtilir. Daha ayrıntılı bilgi için aşağıdaki örneğe bakınız. Her tik için birden fazla olayın oluşabileceğini gözardı etmeyiniz.
Örnek 1 - Tik kullanım örneği 1
<?php
declare(ticks=1);
// Her tik deyimde bir çalıştırılacak işlev
function tik_eylemci()
{
echo "tik_eylemci() çağrıldı\n" ;
}
// Tik eylemcisini belirtelim
register_tick_function("tik_eylemci");
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
?>
Örnek 2 - Tik kullanım örneği 2
<?php
function tik_eylemci()
{
echo "tik_eylemci() çağrıldı\n" ;
}
$a = 1;
tik_eylemci();
if ($a > 0) {
$a += 2;
tik_eylemci();
print($a);
tik_eylemci();
}
tik_eylemci();
?>
Ayrıca, register_tick_function() ve unregister_tick_function() işlevlerini de inceleyin.
encodingHer betiğin karakter kodlaması betiğin başında encoding yönergesi ile belirtilebilir.
Örnek 3 - Betik için kodlama belirtmek
<?php
declare(encoding='ISO-8859-1');
// kodlar burada
?>
İsim alanları ile birlikte kullanıldığında, tek geçerli sözdizimi declare(encoding='...'); olup, buradaki ... kodlama değeridir. declare(encoding='...') {} sözdizimi isim alanları ile birlikte kullanıldığında bir çözümleme hatası ile sonuçlanacaktır.
Karakter kodlaması bildirim değeri, PHP, --enable-zend-multibyte yapılandırma seçeneği ile derlenmediği takdirde PHP 5.3'te yoksayılır. PHP 6.0'da encoding yönergesi, dosya oluşturulurken hangi kodlamanın kullanıldığını tarayıcıya bildirmek için kullanılır. Meşru değerler, UTF-8 gibi karakter kodlaması isimleridir.
Bir işlevin içinde kullanıldığında, return() deyimi çalışmakta olan işlevi hemen sonlandırıp değiştirgesini çağrılan işlevin değeri olarak döndürür. return() ayrıca, bir betiğin veya bir eval() deyiminin çalışmasını sonlandırmak için de kullanılabilir.
Betik genelinde çağrıldığında, betik dosyasının çalışmasını sonlandırılır. Eğer dosya include() ya da require() ile betik dosyasına dahil edilmiş bir dosya ise, return() deyimi akış denetiminin ana dosyaya aktarılmasını sağlar. Dahası, return() deyiminin çağrıldığı dosya include() ile dahil edilmişse return() değeri include() çağrısının değeri olarak dönecektir. return() ana betik dosyasının içinden çağrıldığı takdirde, betiğin çalışması sonlandırılacaktır. Eğer return() deyiminin çağrıldığı dosya, ismi php.ini içindeki auto_prepend_file veya auto_append_file yapılandırma seçenekleri ile atanan bir dosya ise bu betik dosyasının da çalışmasını sonlandıracaktır.
Daha fazla bilgi için, Dönüş değerleri bölümüne bakınız.
Bilginize: return() bir işlev değil bir dil oluşumu olduğundan, değiştirgesini içeren parantez yalnızca değiştirge bir ifade içeriyorsa zorunludur. Bir değişken döndürürken genellikle parantez kullanılmaz. Böyle bir durumda, PHP'nin daha az işlem yapması için bu yöntemi izlemeniz gerekir.
Bilginize: Değiştirgesiz kullanılacaksa yaylı ayraçlar konulmamalıdır bu durumda dönen değer NULL olur. Değiştirge içermeyen yaylı ayraçların kullanımı bir çözümleme hatası ile sonuçlanır.
Bilginize: Bir değişkeni gönderimli olarak döndürüyorsanız, asla parantez kullanmamalısınız, bu çalışmayacaktır. Bir deyimin sonucunu gönderimli olarak döndüremezsiniz, yalnızca değişkenler gönderimli olarak döndürülebilir. return ($a); kullanıyorsanız, bir değişken değil, bir ifadenin sonucunu ($a) döndürüyorsunuz demektir (bu da elbette, $a değişkeninin değeridir).
require() deyimi bir başarısızlıkta E_ERROR seviyesinden ölümcül bir hata vermesi dışında include() deyimi ile aynıdır. Başka bir deyişle, include() deyiminin sadece bir uyarı (E_WARNING) vererek çalışmayı sürdürdüğü durumda require() deyimi betiğin hata vererek durmasına sebep olur.
Deyimin nasıl çalıştığını öğrenmek için include() belgesine bakınız.
include() deyimi belirtilen dosyayı betiğe ekler ve içeriğini değerlendirir.
Betiğe dahil edilecek dosyalar önce belirtilen dizinde aranır, eğer bir dizin belirtilmemişse include_path yönergesinde belirtilen yollarda aranır. include() dosyayı bulamazsa bir uyarı çıktılar; require() için bu davranış bir ölümcül hata olarak kendini gösterir.
Bir dizin belirtilmişse (göreli veya mutlak) include_path yönergesine bakılmaz. Örneğin bir dosya ../ ili başlıyorsa PHP çözümleyicisi dosyayı betiğin bulunduğu dizinin üst dizininde arayacaktır.
PHP'nin dahil edilen dosyaları nasıl ele aldığı include_path yönergesinin açıklamasında ayrıntılı olarak anlatılmıştır.
Bir dosya bir betiğe dahil edildiğinde, bu dosyanın içerdiği kod, dosyanın dahil edildiği satır itibariyle ana betikte geçerli olan değişken uzayını miras alır. Yani, dosyanın dahil edildiği satıra kadar mevcut değişkenlerin hepsi dahil edilen dosyanın içinde kullanılabilir olacaktır. Bunun yanında, dahil edilen dosyada tanımlanmış işlevlerin ve sınıfların tamamı ana betiğin genelinde tanımlanmış sayılır.
Örnek 1 - Basit bir include() örneği
vars.php
<?php
$renk = 'yeşil';
$meyve = 'elma';
?>
dnm.php
<?php
echo "Bir $renk $meyve"; // -> Bir
include 'vars.php';
echo "Bir $renk $meyve"; // -> Bir yeşil elma
?>
include deyimi, bir işlevin içinde kullanılırsa dahil edilmek istenen dosyanın içindeki tüm kodlar sanki o işlev içinde tanımlanmış gibi çalıştırılacaktır. Bu durumda dahil edilen dosyadaki kodlar, işlevin, dosyanın dahil edildiği noktadaki değişken uzayını miras alacaktır. Bu kuralın istisnası dosya dahil edilmeden önce çözümleyici tarafından işleme sokulan sihirli sabitlerdir.
Örnek 2 - İşlev içi include kullanımı
<?php
function foo()
{
global $renk;
include 'vars.php';
echo 'Bir $renk $meyve';
}
/* vars.php, foo() işlevinin etki alanındadır
* dolayısıyla $meyve bu alanın dışında
* kullanılamamaktadır. $renk ise global olarak
* tanımlandığından kullanılabilir
*/
foo(); // Bir yeşil elma
echo 'Bir $renk $meyve'; // Bir yeşil
?>
Bir dosya bir betiğe dahil edildiğinde, çözümleme işlemi PHP kipinden çıkıp hedef dosyanın başlangıcında HTML kipine geçer ve dosyanın sonuna kadar HTML kipinde kalır. Bu sebeple, hedef dosyanın içindeki kodlardan PHP kodları olarak çalıştırılacaklar PHP başlangıç ve bitiş etiketleri arasına alınmalıdır.
"URL fopen sarmalayıcıları" PHP'de etkinleştirilmiş ise (öntanımlı yapılandırmada etkindirler), include deyiminde yerel dosya yolu belirtmek yerine (HTTP ya da desteklenen başka bir sarmalayıcı üzerinden - Desteklenen Protokollerin ve Sarmalayıcıların Listesi bölümününe bakınız) bir URL kullanabilirsiniz. Hedef sunucu, hedef dosyayı PHP kodu olarak çalıştırabiliyorsa, ana betikteki değişkenler dahil edilen dosyaya bir URL istek dizgesi olarak HTTP GET ile aktarılabilir. Bu durum dahil edilen dosyaya ana dosyanın değişken uzayını miras olarak bırakmaktan biraz farklı bir şeydir; betik aslında uzak sunucuda çalıştırılıp yerel betiğe sonuçlar dahil edilmektedir.
PHP'nin 4.3.0 öncesi Windows sürümü uzak dosyalara bu işlev üzerinden erişimi allow_url_fopen etkin olsa bile desteklemez.
Örnek 3 - HTTP üzerinden include
<?php
/* Bu örnekte mesela.dom sitesinin .php uzantılı dosyaları
* çalıştırabildiği ama .txt uzantılıları çalıştırmadığı
* varsayılmıştır. Ayrıca, buradaki 'Çalışır'ın manası
* $foo ve $bar değişkenlerinin dahil edilen dosyada kullanılabilir
* olduğudur. */
// Çalışmaz; dosya.txt dosyası mesela.dom sitesinde çalıştırılmaz
include 'http://mesela.dom/dosya.txt?foo=1&bar=2';
// Çalışmaz; yerel dosya sisteminde 'dosya.php?foo=1&bar=2'
// adında bir dosya olarak aranır.
include 'dosya.php?foo=1&bar=2';
// Çalışır.
include 'http://mesela.dom/dosya.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'dosya.txt'; // Çalışır.
include 'dosya.php'; // Çalışır.
?>
Uzaktaki dosya uzaktaki sunucu tarafından işlenebilir (dosyanın uzantısına ve uzaktaki sunucunun PHP çalıştırıp çalıştırmadığına bağlı olarak). Ancak, elde edilecek çıktı yerel sunucuda çalıştırılacağından bu işlemin sonucu mutlaka geçerli bir PHP betiği üretmek olmalıdır. Dosyanın uzaktaki sunucuda işlenip sadece sonucun çıktılanmasını istiyorsanız readfile() işlevi daha iyi bir seçim olacaktır. Aksi takdirde, uzakta çalıştırılan betiğin geçerli ve istenen kodu üretebilmesini güvence altına alabilmek için özel bir çaba harcamak gerekir.
Ayrıca, bu konuyla ilgili olarak Uzaktaki dosyaların kullanımı belgesiyle fopen() ve file() işlevlerine de bakınız.
return kullanımı: Dahil edilen dosyanın içersinde, bu dosyanın işlenmesi durdurmak ve dahil eden betiğe geri dönmek için return() kullanılabilir. Ayrıca, dahil edilen dosyalardan değer döndürmek de mümkündür. Normal bir işlevde olduğu gibi, include çağrısından elde edilen değeri bir değişkene atayabilirsiniz. Ancak bu durum, uzaktaki dosyalar için, sadece uzaktaki dosyanın çıktısı geçerli PHP başlangıç ve bitiş etiketlerine sahipse (herhangi yerel bir dosyada olduğu gibi), kullanılabilir. Gerekli değişkenler bu etiketlerin arasında tanımlandığında dosyanın dahil edildiği noktadan itibaren kullanılabilir olacaklardır.
include özel bir dil oluşumu olduğundan, değiştirgesinin parantez içine alınması gerekmez. Dönüş değerini karşılaştırırken buna dikkat edin.
Örnek 4 - include dönüş değerinin karşılaştırılması
<?php
// çalışmaz, include(('vars.php') == 'TAMAM') olarak değerlendirilir,
// sonuç include('') olur
if (include('vars.php') == 'TAMAM') {
echo 'TAMAM';
}
// çalışır
if ((include 'vars.php') == 'TAMAM') {
echo 'TAMAM';
}
?>
Örnek 5 - include ve return deyimleri
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // 'PHP' basar
$bar = include 'noreturn.php';
echo $bar; // 1 basar
?>
include işlemi başarılı olduğundan $bar, 1 değerine sahiptir. Yukarıdaki örnekler arasındaki farklara dikkat edin. Birincisi return() deyimini dahil edilen dosyada kullanırken ikincisi kullanmıyor. Dosya dahil edilemediği durumda, FALSE döndürülüyor ve bir E_WARNING üretiliyor.
Dahil edilen dosyanın içinde tanımlanmış işlevler varsa, return() deyiminden önce ya da sonra olduğundan bağımsız olarak ana betik içersinde kullanılabilirler. Dosya iki defa dahil edilmişse, PHP 5 ölümcül hata verir çünkü bildirilmiş işlevler tekrar bildirilmeye calışılmış olur. PHP 4 ise return()'den sonra tanımlanmış işlevler için şikayetçi olmayacaktır. Dosyanın halihazırda dahil edilip edilmediğini kendiniz tespit edip koşula bağlı return() çalıştırmak yerine, include_once() kullanmanız önerilir.
Bir PHP dosyasını bir değişkene "dahil" etmenin diğer bir yolu, çıktıyı Çıktı Denetim İşlevlerini include() ile birlikte kullanarak yakalamaktır. Örnek:
Örnek 6 - Bir PHP dosyasını bir dizgeye dahil etmek için tampon kullanımı
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}
?>
Betiğinize dosyaları özdevinimli olarak dahil etmek için, php.ini içersindeki auto_prepend_file ve auto_append_file yapılandırma seçeneklerini inceleyebilirsiniz.
Bilginize: Bu bir işlev değil, dil oluşumu olduğundan değişken işlevler kullanılarak çağrılamaz.
Ayrıca, require(), require_once(), include_once(), readfile(), virtual() ve include_path'a da bakınız.
require_once() deyimi, dosyayı evvelce dahil edilmişse tekrar dahil etmemesi dışında require() deyimiyle aynıdır.
_once eki olup olmamasının ne gibi farklara yol açtığı ve varlığının davranışı nasıl değiştirdiğini öğrenmek için include_once() belgesine bakınız.
include_once() deyimi belirtilen dosyayı betiğin çalışması esnasında okur ve çalıştırır. Bu deyimin çalışma biçimi include() deyimi ile benzerdir, kendisiyle dahil edilmiş bir dosya betiğin başka bir yerinde tekrar dahil edilmek istenirse buna izin vermemesidir. Daha fazla bilgi için include() belgesine bakabilirsiniz.
include_once() deyimi, bir betiğin çalışması esnasında aynı dosyanın bir kereden fazla dahil edilme ihtimaline karşı, bu dosyanın yalnızca bir kere dahil edileceğinden emin olunmak istenirse kullanılmalıdır. Bu sayede işlev bildirimlerinin yinelenmesi, değişkenlere tekrar değer atanması gibi sorunlar ortaya çıkmaz.
Bu işlevin nasıl çalıştığı hakkında ayrıntılı bilgi edinmek için include() belgesine bakınız.
Bilginize: Büyük-küçük harf duyarlı olmayan işletim sistemlerinde (Windows gibi), require_once() ve include_once() deyimlerinin PHP 4'ten itibaren beklediğiniz sonucu üretmeyebileceğine dikkat edin.
Örnek 1 - Harf büyükyüğüne duyarsız işletim sistemlerinde include_once()
<?php
include_once("a.php"); // bu a.php dosyasını include edecektir
include_once("A.php"); // bu yine a.php dosyasını include edecektir! (yalnızca PHP 4)
?>
Bu davranış PHP 5'te değişmiştir - öncelikle yol normalleştirilir, böylece örneğin, C:\PROGRA~1\A.php ile C:\Program Files\a.php aynı kabul edilir ve dosya yalnızca bir defa işlenir.
goto işleci betik içinde başka bir komuta atlamak için kullanılabilir. Hedefin yeri, bir yafta ve ikinokta imi ile belirtilebilir. goto bu yaftaya göre hedefi bulur. Bu, goto deyiminin tamamen sınırsız olduğu anlamına gelmez. Hedef yaftasının aynı dosya ve aynı bağlam içinde kalması gerekir, yani bir işlev veya yöntemin dışına atlayamayacağınız gibi bir başka işlev veya yöntemin içine de atlayamazsınız. Ayrıca bir switch veya döngünün içine de atlayamazsınız, fakat bunların dışına atlayabilirsiniz, yani çok seviyeli bir break yerine bir goto kullanabilirsiniz.
Örnek 1 - goto örneği
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
Yukarıdaki örneğin çıktısı:
Bar
Örnek 2 - Döngüden goto ile çıkma örneği
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
Yukarıdaki örneğin çıktısı:
j hit 17
Örnek 3 - Bu çalışmaz
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
Yukarıdaki örneğin çıktısı:
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2
Bilginize: goto işleci PHP 5.3'ten beri kullanılabilmektedir.
Bir işlev, şöyle bir söz dizimi kullanılarak tanımlanabilir:
Örnek 1 - İşlev kullanımını gösteren sözde kod
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Örnek işlev.\n";
return $retval;
}
?>
Bir işlevin içerisinde geçerli her tür PHP kodu kullanılabilir, buna başka işlevler ve sınıf tanımları da dahildir.
İşlev isimleri, PHP'deki diğer isimlerle aynı kurallara tabidir. Geçerli bir işlev ismi bir harf ya da alt çizgi ile başlar, herhangi bir sayıda geçerli harf, sayı ya da alt çizgi ile devam eder. Düzenli ifade olarak, şu şekilde ifade edebiliriz: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
İşlevlerin çağrılmadan önce tanımlanmaları, aşağıdaki iki örnekte görüldüğü gibi koşullu olarak tanımlandıkları durumlar haricinde gerekmez.
Bir işlev aşağıdaki iki örnekte gösterildiği gibi koşullu olarak tanımlandıysa, bu işlev tanımının işlev çağrılmadan önce yapılması gerekmektedir.
Örnek 2 - Koşula bağlı işlevler
<?php
$makefoo = true;
/* Henüz varolmadığı için foo() buradan çağrılamaz,
ancak bar() çağrılabilir */
bar();
if ($makefoo) {
function foo()
{
echo "Uygulamanın çalışması bana erişene kadar ben yokum.\n";
}
}
/* $makefoo doğru olduğundan
artık foo() çağrılabilir */
if ($makefoo) foo();
function bar()
{
echo "Program başlatıldığı anda ben de varolurum.\n";
}
?>
Örnek 3 - İşlev içinde işlev
<?php
function foo()
{
function bar()
{
echo "foo() çağrılana kadar yokum.\n";
}
}
/* Henüz varolmadığı için
bar() çağrılamaz. */
foo();
/* Artık bar() çağrılabilir,
foo() çağrıldığında bar()
erişilebilir hale gelir */
bar();
?>
PHP'de tüm işlevler ve sınıflar betik genelinde geçerlidir - bir işlevin içinden bile tanımlanmış olsalar işlevin dışından çağrılabilirler.
PHP işlevlerin farklı değiştirgeli yeni tanımlarının yapılmasını desteklemediği gibi, işlevler yeniden tanımlanamaz veya tanımsız kılınamaz.
Bilginize: İşlev isimleri büyük-küçük harf duyarsızdır, ancak işlev isimlerini tanımlandıkları halleriyle kullanmak daha iyidir.
Değiştirge sayısı değişken işlevler desteklendiği gibi işlevlerde öntanımlı değiştirge kullanımı da desteklenmektedir. Daha ayrıntılı bilgi edinmek için func_num_args(), func_get_arg() ve func_get_args() işlevlerine de bakınız.
PHP'de işlevlerin kendilerini çağırması da mümkündür. Ancak 100-200 iç içe çağrıdan kaçınmalısınız, bu tür kullanım yığıtın dolmasına ve betiğin sonlandırılmasına sebep olabilir.
Örnek 4 - Kendini çağıran işlev
<?php
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
?>
Bir işleve veri, virgül ayraçlı ifadelerden oluşan bir değiştirge listesi ile aktarılır.
PHP, değiştirgelerin değerleriyle aktarılmalarını (öntanımlı), gönderimli aktarımı ve öntanımlı değiştirge kullanımını destekler. Değiştirge sayısı değişken işlevler de desteklenmektedir; daha ayrıntılı bilgi edinmek için func_num_args(), func_get_arg() ve func_get_args() işlevlerini de inceleyiniz.
Örnek 1 - İşlevlere dizi aktarımı
<?php
function dizi_kabul_eder($girdi)
{
echo "$girde[0] + $girdi[1] = ", $girdi[0]+$girdi[1];
}
?>
Öntanımlı olarak, işlev değiştirgeleri değerleriyle aktarılırlar (bu durumda bir değiştirgenin değeri işlev içinde değiştirildiğinde işlevin çağrıldığı yerdeki değeri bundan etkilenmez. İşlevin çağrıldığı yerdeki değerinin de değişmesini istiyorsanız gönderimli değiştirge kullanmalısınız.
Bir işleve bir değiştirgenin daima gönderimli olarak aktarılmasını istiyorsanız, işlev tanımladığınız yerde o değiştirgenin başına & karakterini koyarak bunu sağlayabilirsiniz:
Örnek 2 - Gönderimli işlev değiştirgelerinin aktarımı
<?php
function şunu_da_ekle(&$dizge)
{
$dizge .= 've bir kaç karakter eklenmiştir.';
}
$dzg = 'Bu bir dizgedir ';
şunu_da_ekle($dzg);
echo $dzg; // 'Bu bir dizgedir ve bir kaç karakter eklenmiştir.'
// çıktısını verir.
?>
Bir işlevde, sayıl değiştirgeler için C++ tarzı öntanımlı değerler aşağıdaki biçimde tanımlanabilir:
Örnek 3 - İşlev içinde öntanımlı değiştirge kullanımı
<?php
function kahveyap($hangisi = "orta şekerli")
{
return "Bir fincan $hangisi kahve yapalım.\n";
}
echo kahveyap();
echo makecoffee(null);
echo kahveyap("az şekerli");
?>
Yukarıdaki koddan alınacak çıktı:
PHP ayrıca, öntanımlı değer olarak dizilerin ve özel NULL türünün kullanımına da izin verir, örneğin:
Örnek 4 - Sayıl olmayan türlerin öntanımlı değer olarak kullanımı
<?php
function kahveyap($hangi = array("orta şekerli"), $neyde = NULL)
{
$neyde = is_null($neyde) ? "ocakta" : $neyde;
return "Bir fincan ".join(", bir fincan ", $hangi)." kahve $neyde yapıldı.\n";
}
echo kahveyap();
echo kahveyap(array("çok şekerli", "az şekerli"), "mangalda");
?>
Öntanımlı değer bir değişken, bir sınıf üyesi ya da bir işlev çağrısı değil, bir sabit ifadesi olmalıdır.
Öntanımlı değiştirgeleri kullanırken, öntanımlama yapılmış tüm değiştirgelerin öntanımlama yapılmamış tüm değiştirgelerin sağında yer almasına gerektiğine dikkat edin. Aksi takdirde işler yolunda gitmeyebilir. Aşağıdaki kod parçasını inceleyin:
Örnek 5 - Öntanımlı değiştirgelerin hatalı kullanımı
<?php
function yoğurtyap($nekadar = "az", $neli)
{
return "Bir kase $nekadar $neli yoğurt yap.\n";
}
echo yoğurtyap("çilekli"); // beklendiği gibi çalışmayacaktır
?>
Yukarıdaki örnekten alınan çıktı:
Şimdi, yukarıdakini bununla karşılaştıralım:
Örnek 6 - Öntanımlı değiştirgelerin doğru kullanımı
<?php
function yoğurtyap($nekadar= "az", $neli)
{
return "Bir kase $nekadar $neli yoğurt yap.\n";
}
echo yoğurtyap("çilekli"); // beklendiği gibi çalışır
?>
Bu örnekten alınan çıktı:
Bilginize: PHP 5'den itibaren, öntanımlı değerler gönderimli aktarılabilmektedir.
PHP 4 ve sonrasında, değiştirge sayısı değişken kullanıcı tanımlı işlevler desteklenmektedir. func_num_args(), func_get_arg() ve func_get_args() işlevleri sayesinde bu özelliği kolayca kullanabilirsiniz.
Özel bir sözdizimi gerekli değildir, değiştirge listesini işlev tanımında açıkça belirtirseniz normal davranışını gösterecektir.
Değerler, kullanımı seçime bağlı olan return deyimi kullanılarak döndürülür. Her türde değer döndürülebilir, buna diziler ve nesneler dahildir. return() kullanıldığında işlevin çalışması o noktada hemen durdurulur ve denetim işlevin çağrıldığı satıra aktarılır. Daha ayrıntılı bilgi için return() bölümüne bakınız.
Örnek 1 - return kullanımı
<?php
function square($num)
{
return $num * $num;
}
echo square(4); // '16' çıktılar.
?>
Bir işlevden birden fazla değer döndüremezsiniz, ancak böyle bir sonucu bir dizi döndürülerek elde edebilirsiniz.
Örnek 2 - Bir diziyle birden fazla değerin döndürülmesi
<?php
function küçük_sayılar()
{
return array (0, 1, 2);
}
list ($sıfır, $bir, $iki) = küçük_sayılar();
?>
Bir işlevden gönderimli bir değer döndürmek için, & işlecini hem işlev bildiriminde hem de dönen değeri bir değişkene atarken kullanmalısınız:
Örnek 3 - Bir işlevden gönderimli değer döndürmek
<?php
function &gönderimli_döndür()
{
return $gönderim;
}
$yenigönderim =& gönderimli_döndür();
?>
Gönderimler hakkında daha fazla bilgi edinmek için Gönderimler Hakkında bölümüne bakınız.
PHP değişken işlev kavramını desteklemektedir. Yani, bir değişken isminin sonuna parantez eklenmişse, PHP aynı isimde bir işlev olup olmadığına bakar ve bulduğu takdirde bu işlevi çalıştırmaya çalışır. Başka olası işlemlerin yanında, bu özellik geri çağırımların, işlev tablolarının ve benzerlerinin gerçeklenmesinde kullanılabilir.
Değişken işlevler, echo(), print(), unset(), isset(), empty(), include(), require() ve benzeri dil yapılarında çalışmayacaktır. Bu yapıları değişken işlev olarak kullanmak istediğiniz takdirde, gerekli sarmalayıcı işlevleri kendiniz yazmalısınız.
Örnek 1 - Değişken işlev örneği
<?php
function foo() {
echo "In foo()<br />\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br />\n";
}
// Bu echo için sarmalayıcı işlevdir
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // foo() çağrılır
$func = 'bar';
$func('test'); // bar() çağrılır
$func = 'echoit';
$func('test'); // echoit() çağrılır
?>
Değişken işlev özelliğini kullanarak bir nesnenin bir yöntemini de çağırabilmeniz mümkündür.
Örnek 2 - Değişken yöntem örneği
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // Bu Bar() yöntemini çağıracaktır
}
function Bar()
{
echo "Bu bir Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // Bu $foo->Variable() işlevini çağıracaktır
?>
Ayrıca bakınız: call_user_func(), değişken değişkenleri ve function_exists().
PHP standart olarak birçok işlev ve oluşum ile birlikte gelmektedir. Bunun yanında, özel PHP eklentilerinin derlenmesini gerektiren, aksi takdirde "tanımsız işlev" hatası üreten işlevler de mevcuttur. Örneğin, imagecreatetruecolor() gibi resim işlevlerini kullanabilmek için, PHP'yi GD desteğiyle derlemiş olmanız gerekir. Ya da, mysql_connect() işlevini kullanabilmek için, PHP'nin MySQL desteği ile derlenmiş olması gerekmektedir. Bunların yanında, bütün PHP sürümlerine eklenen dizge ve değişken işlevleri gibi birçok çekirdek işlev de mevcuttur. phpinfo() ya da get_loaded_extensions() işlevlerine yapılacak bir çağrı ile PHP'ye hangi eklentilerin yüklenmiş olduğunu görebilirsiniz. Birçok uzantı öntanımlı olarak etkinleştirilmiş olup PHP Kılavuzunda bu eklentilerle ilgili geniş bilgi verilmiştir. PHP'yi nasıl yapılandırmanız gerektiğiyle ilgili bilgiyi yapılandırma ve kurulum bölümleri ile eklerdeki özel bölümlerde bulabilirsiniz.
Kılavuzun işlev tanımı nasıl okunur bölümünde bir işlev tanımının nasıl okunup anlaşılabileceği ile ilgili bilgiler bulunmaktadır. Bir işlevin bir değer mi döndürdüğü yoksa aktarılan değerlerle sadece işlem mi yaptığını anlamak önemlidir. Örneğin, str_replace() değiştirilmiş dizgeyle dönerken, usort() sadece kendisine aktarılan değer üzerinde çalışır. Ayrıca, her kılavuz sayfasında her işlevin değiştirgeleri, davranış değişiklikleri, başarı ya da başarısızlık durumunda döndürülen değerler ve kullanılabilirlik bilgileri bulunmaktadır. Bu önemli (ve sıklıkla algılanması güç) farklılıkların bilinmesi, doğru PHP kodunun yazılabilmesi için büyük önem taşımaktadır.
Ayrıca bakınız: function_exists(), İşlev Başvuru Kılavuzu, get_extension_funcs() ve dl().
Anonim işlevler isim belirtmeksizin oluşturulabilen işlevlerdir. Çoğunlukla geriçağırım işlevi olarak işlev değiştirgelerinde kullanılırsa da kullanımı bununla sınırlı değildir.
Örnek 1 - Anonim işlev örneği
<?php
echo preg_replace_callback('~-([a-z])~',
function ($match) {
return strtoupper($match[1]);
},
'hello-world');
// Çıktısı: helloWorld
?>
Anonim işlevler birer değişken değeri olarak da bildirilebilir. Bu durumda PHP, işlevi özdevinimli olarak sınıfının nesnel bir örneği haline getirir. Bir anonim işlev, bir değişkene sıradan bir deyim gibi, bir noktalı virgül ile biten bir işlev olarak atanabilir:
Örnek 2 - Değişkene anonim işlev atama örneği
<?php
$greet = function($isim)
{
printf("Merhaba %s\r\n", $isim);
};
$greet('Dünya');
$greet('PHP');
?>
Anonim işlevler değişkenleri üst etki alanındın miras alabilirler. Böyle değişkenler işlevin baş tarafında bildirilebilir. Üst etki alanından miras alınan değişkenler küresel değişkenler gibi ele alınmazlar. Küresel değişkenler, işlevin çalıştığı etki alanında tanımlı değişkenlerdir. Anonim işlevin üst etki alanı ise içinde bildirildiği işlevin etki alanıdır (Anonim işlevin bildirildiği ekti alanı ile çağrıldığı etki alanı aynı olmak zorunda değildir). Aşağıdaki örneğe bakalım:
Örnek 3 - Anonim işlevler ve etki alanı
<?php
// Ürünleri eklemek üzere bir Sepet oluşturalım.
// Eklenen ürünlerin toplam fiyatını döndürmek
// üzere bir geriçağırım işlevi kullanalım.
class Sepet
{
const PRICE_BUTTER = 1.00;
const PRICE_MILK = 3.00;
const PRICE_EGGS = 6.95;
protected $ürünler = Array();
public static function ekle($ürün, $miktar)
{
$this->ürünler[$ürün] = $miktar;
}
public static function miktarıGetir($ürün)
{
return isset($this->ürünler[$ürün]) ? $this->ürünler[$ürün] : FALSE;
}
public function Toplam($kdv)
{
$toplam = 0.00;
$işlev =
function ($miktar, $ürün) use ($kdv, &$toplam)
{
$birimFiyat = constant(__CLASS__ . "::FiYAT_" .
strtoupper($ürün));
$toplam += ($birimFiyat * $miktar) * ($kdv + 1.0);
};
array_walk($this->ürünler, $işlev);
return round($toplam, 2);;
}
}
$sepetim = new Sepet;
// Sepete birşeyler ekleyelim
$sepetim->ekle('Peynir', 1);
$sepetim->ekle('Süt', 3);
$sepetim->ekle('Yumurta', 6);
// %5 KDV ile toplamı döndürelim
print $sepetim->Toplam(0.05) . "\n";
// sonuç: is 54.29
?>
Anonim işlevler dahili olarak Closure sınıfı ile gerçeklenmektedir.
Bilginize: Anonim işlevler PHP 5.3.0'dan beri kullanılabilmektedir.
Bilginize: func_num_args(), func_get_args() ve func_get_args() işlevini bir anonim işlev içinde kullanmak mümkündür.
PHP 5 yeni bir Nesne Modeli'ne sahiptir. PHP'nin nesne yönetimi tamamen yeni baştan yazılarak daha iyi başarım elde edilmesi ve daha fazla özellik sunulması sağlanmıştır. Bu PHP4'te yapılan en büyük değişikliklerden biridir. PHP5 tam bir nesne modeline sahiptir.
PHP 5 özelliklerinden bazılar3: Görünürlük, Sınıf Soyutlama, final Anahtar Sözcüğü, Sihirli Yöntemler, Nesne Arayüzleri, Nesne Kopyalama ve Tür Dayatma.
PHP'deki her nesne değişkeni nesnenin tamamının bir kopyasını değil, nesne başvurusunu içerir. Ayrıntılar için Nesneler ve Gönderimler bölümüne bakınız.
Ayrıca Kullanıcı Alanı İsimlendirme Kılavuzu belgesine de bakınız.
class Anahtar SözcüğüHer sınıf tanımı class anahtar sözcüğü ile başlar sınıf isminin ardından gelen bir çift kaşlı ayracın arasında sınıf özelliklerinin ve yöntemlerinin tanımları bulunur.
Sınıf ismi olarak herhangi bir geçerli yafta kullanılabilir ancak bu PHP için ayrılmış sözcüklerden biri olmamalıdır. Geçerli bir sınıf ısmı bir harf veya alt çizgi ile başlar, sayılar, harfler veya alt çizgiler içerebilir. Bir düzenli ifade olarak şöyle bir şablonla eşleşmelidir: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Bir sınıfın kendi sabitleri, değişkenleri (bunlara "özellik" de denir) ve işlevleri (bunlara "yöntem" de denir) olabilir.
Örnek 1 - Basit bir sınıf tanımı
<?php
class BasitSınıf
{
// özellik bildirimi
public $öntanımlı = 'öntanımlı bir değer';
// yöntem tanımı
public function ÖntanımlıyıGöster() {
echo $this->öntanımlı;
}
}
?>
Bir nesne bağlamı içinden bir yöntem çağırmak için $this diye bir sözde değişken kullanılır. $this çağrılan nesneye bir gönderimdir (normalde yöntemin ait olduğu nesnedir, ancak eğer nesne diğer nesnenin bağlamından duruk olarak çağrılıyorsa, bu başka bir nesne de olabilir).
Örnek 2 - $this sözde değişkeninin kullanımı
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this tanımlı (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this tanımsız.\n";
}
}
}
class B
{
function bar()
{
// Dikkat: E_STRICT etkinse bu satır bir uyarı
// çıktılanmasına sebep olur.
A::foo();
}
}
$a = new A();
$a->foo();
// Dikkat: E_STRICT etkinse bu satır bir uyarı çıktılanmasına sebep olur.
A::foo();
$b = new B();
$b->bar();
// Dikkat: E_STRICT etkinse bu satır bir uyarı çıktılanmasına sebep olur.
B::bar();
?>
Yukarıdaki örneğin çıktısı:
$this tanımlı (A) $this tanımsız. $this tanımlı (B) $this tanımsız.
new Anahtar SözcüğüBir sınıfın örneğini oluşturmak için yeni bir nesne oluşturulup bir değişkene atanmalıdır. Nesnenin hata durumunda daima yeni bir değişkene atanarak oluşturulması için kurucusunun bir istisna oluşturmaması gerekir. Sınıflar, örnekleme öncesi tanımlanmış olmalıdır (ve bu, bazı durumlarda bir gereksinimdir).
Örnek 3 - Bir sınıf örneğinin oluşturulması
<?php
$örnek = new BasitSınıf();
// Bu bir değişkenle de yapılabilir:
$sınıf = 'BasitSınıf';
$örnek = new $sınıf(); // BasitSınıf()
?>
Sınıf bağlamında yeni bir nesneyi new self veya new parent kullanarak oluşturmak mümkündür.
Oluşturulmuş bir sınıf örneğinin yeni bir değişkene atanması sırasında, yeni değişken, atanan nesneyle aynı örneğe erişecektir. Bu davranışın örneklerin bir işleve aktarılmasından bir farkı yoktur. Kopyalamak suretiyle oluşturulmuş bir nesnenin daima bir kopyası yapılabilir.
Örnek 4 - Nesne Atama
<?php
$atama = $örnek;
$gönderim =& $örnek;
$örnek->var = '$atama bu değere sahip olacak';
$örnek = null; // $örnek ve $gönderim null olur
var_dump($örnek);
var_dump($gönderim);
var_dump($atama);
?>
Yukarıdaki örneğin çıktısı:
NULL
NULL
object(BasitSınıf)#1 (1) {
["var"]=>
string(30) "$atama bu değere sahip olacak"
}
extends Anahtar Sözcüğü
Bir sınıfın bildiriminde extends anahtar sözcüğü
kullanılarak başka bir sınıfın yöntemleri ve özellikleri miras alınabilir.
Çok sayıda sınıfı miras alarak genişlemek mümkün değildir, bir sınıf
sadece bir ana sınıfı miras alabilir.
Miras alınan yöntemler ve özelliklerler, ebeveyn sınıfta tanımlı isimleriyle yeniden bildirilerek geçersiz kılınabilir; bu sadece ebeveyn sınıfın final tanımlı yöntemleri için yapılamaz. Geçersiz kılınmış yöntemlere ve duruk özelliklere parent:: öneki ile atıfta bulunarak erişilebilir.
Örnek 5 - Basit bir sınıfın miras alınması
<?php
class EkSınıf extends BasitSınıf
{
// ebeveyn yöntemi yeniden bildirelim
function değerGöster()
{
echo "Sınıf genişletiliyor\n";
parent::değerGöster();
}
}
$ek = new EkSınıf();
$ek->değerGöster();
?>
Yukarıdaki örneğin çıktısı:
Sınıf genişletiliyor bir öntanımlı değer
Sınıf üyesi değişkenlere "özellik" denir. Bunlara bazan "öznitelik" veya "alan" dendiğini de görürsünüz, fakat bu kılavuzun amaçları doğrultusunda biz "özellik" terimini kullanacağız. Bunlar normal değişken bildiriminin önüne public, protected, veya private anahtar sözcükleri getirilerek bildirilir. Bildirim, bir ilklendirme olarak da yapılabilir; bu durumda bir sabit değerle ilklendirme yapılmalıdır. Yani, derleme sırasında değerlendirilebilmeli, çalışma anında değerlendirilebilecek bilgiler içermemelidir.
public, protected, ve private sözcüklerinin anlamları için Görünürlük belgesine bakınız.
Bilginize: PHP 4 ile geriye uyumluluğu sağlamak için, PHP 5 özellik bildiriminde public, protected, veya private yerine (veya ek olarak) hala var sözcüğü kabul edilmektedir. Ancak, var artık gerekli değildir. PHP'nin 5.0'dan 5.1.3'e kadar olan sürümlerinde, var kullanımı önerilmeyen kullanım olarak ele alınır ve bir E_STRICT uyarısı çıktılanırdı; PHP 5.1.3'ten beri önerilmeme durumu ortadan kalkmış olup bir uyarı çıktılanmamaktadır.
Bir özelliği public, protected, veya private yerine var kullanarak bildirirseniz PHP 5 özelliği public olarak bildirilmiş gibi ele alır.
Özelliklere, sabitlere ve yöntemlere sınıf yöntemleri içinden erişilirken yöntem duruk ise self::$özellik, değilse $this- >özellik sözdizimi kullanılabilir (burada "özellik" özelliğin ismidir). Daha ayrıntılı bilgi için static Anahtar Sözcüğü bölümüne bakınız.
Yöntem bir nesne bağlamından çağrılıyorsa $this sözde değişkeni sınıf yöntemleri içinde de kullanılabilir. $this, yöntemi çağıran nesneye (yöntemin ait olduğu nesneye) bir gönderimdir. Fakat yöntem, bir ikincil nesne bağlamından duruk olarak çağrılıyorsa, bu, birincil nesne de olabilir.
Örnek 1 - Özellik bildirimi
<?php
class SimpleClass
{
// geçersiz özellik bildirimleri:
public $var1 = 'hello ' . 'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// geçerli özellik bildirimleri:
public $var6 = myConstant;
public $var7 = array(true, false);
// Buna sadece PHP 5.3.0 ve sonrasında izin verilir.
public $var8 = <<<'EOD'
hello world
EOD;
}
?>
Bilginize: Sınıflar ve nesnelerle çalışan bazı işlevler vardır. Bunlar için Sınıf ve Nesne İşlevleri bölümüne bakınız.
Yorumsuz metinler, yorumlu metinlerin tersine özellik bildirimleri dahil herhangi bir duruk veri bağlamında kullanılabilir.
Örnek 2 - Özellik ilklendirmede yorumsuz metin kullanımı
<?php
class foo {
// PHP 5.3.0'dan beri
public $bar = <<<'EOT'
bar
EOT;
}
?>
Bilginize: Yorumsuz metin desteği PHP 5.3.0'da eklenmiştir.
Sabitlerin her sınıf için ayrı ayrı tanımlanabilmesi mümkündür. Sabitler diğer değişkenlerden tanımlanmaları ve kullanılmaları sırasında başlarına getirilmeyen $ imi sayesinde ayrılırlar.
Değer, örneğin, bir değişken, bir sınıf özelliği, bir matematiksel işlemin sonucu veya bir işlev çağrısı değil, bir sabit ifade olmalıdır.
Ayrıca, sınıf arayüzlerinin de kendi sabitlerinin olması mümkündür. Örnekler için Nesne Arayüzleri belgesine bakınız.
PHP 5.3.0'dan itibaren, bir sınıfa bir değişken kullanarak atıfta bulunmak mümkündür. Değişkenin değeri, self, parent, static gibi bir anahtar sözcük olamaz.
Örnek 1 - Bir sabitin tanımlanması ve kullanımı
<?php
class MyClass
{
const constant = 'sabit değer';
function showConstant() {
echo self::constant . "\n";
}
}
echo MyClass::constant . "\n";
$classname = "MyClass";
echo $classname::constant . "\n"; // PHP 5.3.0'dan itibaren
$class = new MyClass();
$class->showConstant();
echo $class::constant."\n"; // PHP 5.3.0'dan itibaren
?>
Örnek 2 - Duruk veri örneği
<?php
class foo {
// PHP 5.3.0'dan itibaren
const bar = <<<'EOT'
bar
EOT;
}
?>
Duruk veri bağlamında yorumlanan çok satırlı metinler değil (heredoc), yorumlanmayan çok satırlı metinler (nowdoc) kullanılabilir.
Bilginize: Yorumlanmayan çok satırlı metin (nowdoc) desteği 5.3.0'da eklenmiştir.
Nesne-yönelimli uygulama yazan birçok geliştirici, her bir sınıf tanımı için ayrı bir PHP kaynak dosyası oluşturmaktadır. Bu kullanımın en can sıkıcı noktalarından bir tanesi, betiklerin en tepesinde bir sürü dosyanın betiğe dahil edilmesini gerektirmesidir (her bir sınıf için ayrı bir dosya).
PHP 5 ile birlikte bu durum zorunluluk olmaktan çıkmıştır. Henüz
tanımlanmamış bir sınıfı özdevinimli olarak çağırmak istediğinizde, bir
__autoload işlevi tanımlayabilirsiniz. Bu işlevi çağırmakla
PHP'nin çalışması hata ile sonuçlanmadan önce betik yorumlama motoruna
sınıfı yüklemek için son bir şans verilmiş olur.
Bilginize:
__autoloadişlevinde oluşan istisnalar catch bloğu ile yakalanamaz, dolayısıyla ölümcül hata ile sonuçlanır.
Bilginize: PHP CLI'yi etkileşimli kipte kullanıyorsanız özdevinimli yükleme kullanılamayacaktır.
Bilginize: Sınıf ismini call_user_func() gibi bir işlevde kullanırsanız ../ gibi bazı tehlikeli karakterler içerebilir. Böyle işlevlerde kullanıcı girdilerini kullanmamanız ya da en azından girdiyi __autoload() ile doğrulamanızı öneririz.
Örnek 1 - Özdevinimli yükleme örneği
Bu örnek MyClass1 ve MyClass2 sınıflarını yüklemeye çalışmaktadır. Sınıflar aynı isimli MyClass1.php ve MyClass2.php dosyalarının içinde yer almaktadırlar.
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
Örnek 2 - Başka bir özdevinimli yükleme örneği
Bu örnek DenemeA arayüzünü yüklemeye çalışır.
<?php
function __autoload($isim) {
var_dump($isim);
}
class Fan implements DenemeA {
}
/*
string(5) "DenemeA"
Fatal error: Interface 'DenemeA' not found in ...
*/
?>
PHP 5 geliştiricilerin sınıflar için kurucu yöntemler bildirmesine imkan verir. Bir kurucu yöntemi olan sınıflar her yeni nesne oluşturuluşunda bu yöntemi çağırırlar, bu bakımdan nesne kullanılmadan önce yapılması gereken ilklendirmeler için kurucular çok uygundur.
Bilginize: Çocuk sınıflardan kurucusu olanlar için örtük olarak ebeveyn sınıfın kurucusu çağrılmaz. Ebeveyn sınıfın kurucusunu çocuk sınıftan çağırmak için, çocuk sınıf içinden parent::__construct() çağrısı yapılması gerekir.
Örnek 1 - Yeni tekilleşmiş kurucuların kullanımı
<?php
class AnaSınıf {
function __construct() {
print "AnaSınıf kurucusundayız\n";
}
}
class AltSınıf extends AnaSınıf {
function __construct() {
parent::__construct();
print "AltSınıf kurucusundayız\n";
}
}
$obj = new AnaSınıf();
$obj = new AltSınıf();
?>
Geriye dönük uyumluluk için, PHP 5 belirtilen sınıfa ait bir __construct() yöntemi bulamazsa, sınıfın ismine bakarak eski tarz bir kurucu arayacaktır. Dolayısıyla, uyumluluk sorunu yaşayacağınız tek durum sınıf dahilinde __construct() isimli bir yöntemin amacı dışında kullanılması olabilir.
PHP 5, C++ gibi nesne yönelimli dillerdekine benzer bir yıkıcı tasarımına sahiptir. Yıkıcı yöntem, belli bir nesneye yönelik tüm gönderimler kaldırıldığı ya da nesne kapanma sırasında açıkça yok edildiği anda çalıştırılacaktır.
Örnek 2 - Yıkıcı Örneği
<?php
class YıkıcıSınıf {
function __construct() {
print "Kurucu çalıştı\n";
$this->name = "YıkıcıSınıf";
}
function __destruct() {
print "" . $this->name . " yok ediliyor\n";
}
}
$obj = new YıkıcıSınıf();
?>
Kurucularda olduğu gibi ebeveyn yıkıcılar çocuk sınıflar için dolaylı olarak çağrılmayacaktır. Ebeveyn sınıfın yıkıcısının çalışması için çocuk sınıfın yıkıcısından parent::__destruct() çağrısının yapılması gerekir.
Bilginize: Yıkıcılar, HTTP başlıklarının gönderilmiş olmasını sağlamak için betik sonlanırken çağrılırlar. Betiğin kapanma aşamasındaki çalışma dizini bazı SAPI’lerde (Apache gibi) farklı olabilir.
Bilginize: Bir yıkıcı içinden bir istisna oluşturmaya çalışmak (betiğin sonlandırılması sırasında) ölümcül hata ile sonuçlanır.
Bir özelliğin ya da bir yöntemin görünürlüğü, bildirim sırasında önüne şu
anahtar sözcüklerden biri getirilerek belirlenebilir:
public, protected ya da private.
public olarak bildirilmiş özelliklere ve yöntemlere her
yerden erişilebilir. protected bildirimli özelliklere ve
yöntemlere sadece miras alınmış ve ebeveyn sınıflardan (ve özelliğin
tanımlandığı nesneden), private bildirimli özelliklere
ve yöntemlere ise sadece özelliğin tanımlandığı sınıfın içinden
erişilebilir.
Sınıf özellikleri public, protected ya da
private olarak tanımlanmalıdır. Bir özellik bunlardan biri
olmadan sadece var kullanarak bildirilmişse
public olarak bildirilmiş gibi ele alınır.
Örnek 1 - Özellik bildirimi
<?php
/**
* Sınıfım tanımı
*/
class Sınıfım
{
public $genel = 'Genel';
protected $korumalı = 'Korumalı';
private $özel = 'Özel';
function selamVer()
{
echo $this->genel;
echo $this->korumalı;
echo $this->özel;
}
}
$nesne = new Sınıfım();
echo $nesne->genel; // Çalışır
echo $nesne->korumalı; // Ölümcül Hata
echo $nesne->özel; // Ölümcül Hata
$nesne->selamVer(); // Genel, Korumalı ve Özel görüntüler
/**
* ÖbürSınıfım tanımı
*/
class ÖbürSınıfım extends Sınıfım
{
// public ve protected yöntemleri yeniden tanımlayabiliriz,
// ancak private olanlar tanımlanamaz
protected $korumalı = 'Öbür korumalı';
function selamVer()
{
echo $this->genel;
echo $this->korumalı;
echo $this->özel;
}
}
$nesne2 = new ÖbürSınıfım();
echo $nesne2->genel; // Çalışır
echo $nesne2->özel; // Tanımsız
echo $nesne2->korumalı; // Ölümcül Hata
$nesne2->selamVer(); // Genel, Öbür korumalı ve Undefined görüntülenir
?>
Bilginize: PHP 4'te bir değişken bildiriminde (
publicyerine) kullanılan var anahtar sözcüğü uyumluluk adına hala desteklenmektedir. PHP 5'in 5.1.3 sürümünden önceki sürümlerinde var kullanımı bir E_STRICT uyarısına sebep olurdu.
Sınıf yöntemleri public, protected ya da
private olarak tanımlanmalıdır. Bunlardan herhangi biri
kullanılmadan yapılmış yöntem tanımlarının public
kullanılarak tanımlandığı varsayılır.
Örnek 2 - Yöntem bildirimi
<?php
/**
* Sınıfım tanımı
*/
class Sınıfım
{
// public kurucu bildirimi
public function __construct() { }
// public yöntem bildirimi
public function Genel() { }
// protected yöntem bildirimi
protected function Korumalı() { }
// private yöntem bildirimi
private function Özel() { }
// Bu da public bir yöntem
function Falanca()
{
$this->Genel();
$this->Korumalı();
$this->Özel();
}
}
$sınıfım = new Sınıfım;
$sınıfım->Genel(); // Çalışır
$sınıfım->Korumalı(); // Ölümcül Hata
$sınıfım->Özel(); // Ölümcül Hata
$sınıfım->Falanca(); // Public, Protected ve Private çalisir
/**
* ÖbürSınıfım tanımı
*/
class ÖbürSınıfım extends Sınıfım
{
// Bu public bir yöntemdir
function Filanca()
{
$this->Genel();
$this->Korumalı();
$this->Özel(); // Ölümcül Hata
}
}
$öbürSınıfım = new Sınıfım;
$öbürSınıfım->Genel(); // Çalışır
$öbürSınıfım->Filanca(); // Genel ve Korumalı çalışır, Özel çalışmaz
class Bar
{
public function dnm() {
$this->dnmÖzel();
$this->dnmGenel();
}
public function dnmGenel() {
echo "Bar::dnmGenel\n";
}
private function dnmÖzel() {
echo "Bar::dnmÖzel\n";
}
}
class Foo extends Bar
{
public function dnmGenel() {
echo "Foo::dnmGenel\n";
}
private function dnmÖzel() {
echo "Foo::dnmÖzel\n";
}
}
$fo = new Foo();
$fo->dnm(); // Bar::dnmÖzel
// Foo::dnmGenel
?>
Inheritance is a well-esablished programming principle, and PHP makes use of this principle in its object model. This principle will affect the way many classes and objects relate to one another.
For example, when you extend a class, the subclass inherits all of the public and protected methods from the parent class. Unless a class overrides those methods, they will retain their original functionality.
This is useful for defining and abstracting functionality, and permits the implementation of additional functionality in similar objects without the need to reimplement all of the shared functionality.
Örnek 1 Inheritance Example
<?php
class foo
{
public function printItem($string)
{
echo 'Foo: ' . $string . PHP_EOL;
}
public function printPHP()
{
echo 'PHP is great.' . PHP_EOL;
}
}
class bar extends foo
{
public function printItem($string)
{
echo 'Bar: ' . $string . PHP_EOL;
}
}
$foo = new foo();
$bar = new bar();
$foo->printItem('baz'); // Output: 'Foo: baz'
$foo->printPHP(); // Output: 'PHP is great'
$bar->printItem('baz'); // Output: 'Bar: baz'
$bar->printPHP(); // Output: 'PHP is great'
?>
Etki Alanı Çözünürlük İşleci (Paamayim Nekudotayim de denirmiş), basitçe bir çift iki nokta iminden ibaret olup (biz "iki nokta çifti" diyebiliriz), bir sınıfın duruk, sabit ve geçersiz kılınmış özellik ve yöntemlerine erişilebilmesini sağlayan bir simgedir.
Bu öğelere sınıf tanımının dışından erişirken bu işlecin solunda sınıfın ismini kullanın.
PHP 5.3.0 ve sonrasında, bu işlecin solunda sınıf ismi yerine bir değişken kullanmak da mümkündür. Değişken ismi, (self, parent, static gibi) bir anahtar sözcük olmamalıdır.
"Paamayim Nekudotayim" ilk bakışta iki nokta üst üste için garip bir adlandırma gibi gözükebilir. Ancak, Zend Engine 0.5 (php 3'ün kalbidir) yazıldığı esnada Zend ekibinin kullanmak istediği terim bu oldu. Esasında bu iki sözcük de iki nokta çifti anlamına gelmektedir - İbranice'de!
Örnek 1 - Sınıf tanımı dışında ::
<?php
class Sınıfım {
const SABİT_DEĞER = 'Bir sabit değer';
}
echo Sınıfım::SABİT_DEĞER;
?>
Bir sınıfın özellik ve yöntemlerine bu işleç sayesinde sınıfın içinden erişilmek istendiğinde işlecin solunda self veya parent anahtar sözcüğü kullanılır.
Örnek 2 - Sınıf tanımı içinde ::
<?php
class BaşkaSınıf extends Sınıfım
{
public static $duruk = 'Bir duruk değişken';
public static function ikiNoktaÇifti() {
echo parent::SABİT_DEĞER . "\n";
echo self::$duruk . "\n";
}
}
$sınıfadı = 'BaşkaSınıf';
echo $sınıfadı::ikiNoktaÇifti(); // PHP 5.3.0 ve sonrası
BaşkaSınıf::ikiNoktaÇifti();
?>
Çocuk sınıf ebeveyninin yöntem tanımlarından birini geçersiz kıldığı takdirde PHP ebeveyne ait yöntemi çağıramayacaktır. Ebeveynin yönteminin çağrılıp çağrılmayacağı çocuk sınıfın inisiyatifindedir. Bu durum aynı zamanda Kurucular ve Yıkıcılar, Aşırı Yükleme ve Sihirli yöntem tanımları için de geçerlidir.
Örnek 3 - Ebeveynin yöntemini çağırmak
<?php
class Sınıfım
{
protected function işlevim() {
echo "Sınıfım::işlevim()\n";
}
}
class BaşkaSınıf extends Sınıfım
{
// Ebeveynin tanımını geçersiz kılalım
public function işlevim()
{
// Ama hala ebeveynin işlevini çağırabiliriz
parent::işlevim();
echo "BaşkaSınıf::işlevim()\n";
}
}
$class = new BaşkaSınıf();
$class->işlevim();
?>
static Anahtar Sözcüğü
Sınıf özelliklerinin ya da yöntemlerinin static olarak
tanımlanması, o özelliklerin ve yöntemlerin sınıf örneğinin oluşturulmasına
gerek kalmadan erişilebilir olmalarını sağlar. Ancak, static
olarak bildirilmiş bir özelliğe (duruk özellik) örneklenmiş sınıf
nesnesinden erişilemez (ise de static olarak bildirilmiş bir
yöntemle erişebilir).
PHP 4 ile uyumluluğun sağlanabilmesi için, eğer bir özellik veya yöntem için hiçbir görünürlük tanımı yapılmamışsa public olarak tanımlanmış varsayılır.
Duruk yöntemlerin, nesnenin bir örneği oluşturulmadan erişilebilir
olmalarından dolayı, $this sözde değişkeni,
static olarak bildirilmiş bir yöntemin içinde kullanılamaz.
Duruk özelliklere, nesne üzerinden ok işleci (->) kullanılarak erişilemez.
Duruk olmayan özellikler durukmuş gibi çağrılırsa E_STRICT seviyesinde bir uyarı üretilir.
PHP'nin diğer duruk değişkenlerinde olduğu gibi duruk özellikler de sadece bir sayıl veya sabit kullanılarak ilklendirilebilir; ifadelere izin verilmez. Yani, bir duruk özelliği örneğin, bir tamsayı veya bir dizi ile ilklendirebilirsiniz ama örneğin, bir işlevin dönen değeri, bir değişken veya bir nesne ile ilklendiremezsiniz.
PHP 5.3.0 ve sonrasında, bir sınıfa bir değişken kullanarak gönderim yapılabilmektedir. Böyle bir değişkenin değeri self, parent veya static gibi bir anahtar sözcük olamaz.
Örnek 1 - Duruk özellik örneği
<?php
class Falanca
{
public static $duruk = 'falanca';
public function durukDeğer() {
return self::$duruk;
}
}
class Feşmekan extends Falanca
{
public function falancaDuruk() {
return parent::$duruk;
}
}
print Falanca::$duruk . "\n";
$falanca = new Falanca();
print $falanca->durukDeğer() . "\n";
print $falanca->duruk . "\n"; // Tanımsız "Özellik" duruk
print $falanca::$duruk . "\n";
$sınıfadı = 'Falanca';
print $sınıfadı::$duruk . "\n"; // PHP 5.3.0 ve sonrası
print Feşmekan::$duruk . "\n";
$feşmekan = new Feşmekan();
print $feşmekan->falancaDuruk() . "\n";
?>
Örnek 2 - Duruk yöntem örneği
<?php
class Falanca {
public static function birDurukYöntem() {
// ...
}
}
Falanca::birDurukYöntem();
$sınıfadı = 'Falanca';
$sınıfadı::birDurukYöntem(); // PHP 5.3.0 ve sonrası
?>
PHP 5, soyut sınıf ve yöntemlerin kullanımını mümkün kılmıştır. Soyut olarak tanımlanmış bir sınıftan örnek oluşturmaya izin verilmemektedir. Bir sınıf en az bir soyut yöntem içeriyorsa, o sınıf da soyut olarak tanımlanmalıdır. Soyut olarak tanımlanmış yöntemler o yöntemlerin imzasıdırlar, gerçeklemenin bütününü temsil edemezler.
Soyut bir sınıftan kalıtsal özellikler devralınırken, ebeveyn sınıf
bildiriminde soyut olarak bildirilmiş tüm yöntemlerin çocuk sınıf
tarafından da tanımlanması gerekir. Ek olarak, bu yöntemlerin aynı (ya da
daha az sınırlı) görünürlükle tanımlanması gerekir. Örneğin, soyut yöntem
protected olarak tanımlanmışsa, işlev gerçeklenimi
private değil, protected ya da
public olarak tanımlanmalıdır.
Örnek 1 - Soyut sınıf örneği
<?php
abstract class SoyutSınıf
{
// Genişletilen sınıfı bu yöntemi tanımlamaya zorla
abstract protected function değeriAl();
abstract protected function önekDeğeri($önek);
// Ortak yöntem
public function yazdır() {
print $this->değeriAl() . "\n";
}
}
class SomutSınıf1 extends SoyutSınıf
{
protected function değeriAl() {
return "SomutSınıf1";
}
public function önekDeğeri($önek) {
return "{$önek}SomutSınıf1";
}
}
class SomutSınıf2 extends SoyutSınıf
{
public function değeriAl() {
return "SomutSınıf2";
}
public function önekDeğeri($önek) {
return "{$önek}SomutSınıf2";
}
}
$class1 = new SomutSınıf1;
$class1->yazdır();
echo $class1->önekDeğeri('FOO_') ."\n";
$class2 = new SomutSınıf2;
$class2->yazdır();
echo $class2->önekDeğeri('FOO_') ."\n";
?>
Yukarıdaki örneğin çıktısı:
SomutSınıf1 FOO_SomutSınıf1 SomutSınıf2 FOO_SomutSınıf2
Kullanıcı tanımlı sınıfları veya 'abstract' isimli işlevleri olmayan eski kodun bir değişikliğe gerek duyulmadan çalışabilmesi gerekir.
Nesne arayüzleri, bir sınıfın gerçeklemesi gereken yöntemlerin belirtildiği kodu, bu yöntemlerin nasıl yönetileceğini tanımlamaksızın oluşturmanıza imkan sağlar.
Arayüzler, standart sınıflardan farklı olarak hiçbir yöntemin içeriği tanımlanmaksızın interface anahtar sözcüğü kullanılarak tanımlanırlar.
Bir arayüzdeki tüm yöntemler, arayüzün doğası gereği public
olarak bildirilmelidir.
implements işleciBir arayüzü gerçeklemek için, implements işleci kullanılır. Arayüzdeki tüm yöntemler bir sınıf içersinde gerçeklenmelidir; aksi takdirde bir ölümcül hata alırsınız. Bir sınıfın, birden fazla arayüz tanımlaması arayüzler virgülle ayrılarak sağlanabilir.
Bilginize: Belirsizliğe yol açacağından, bir sınıf aynı işlev isimlerine sahip iki arayüz gerçekleyemez.
Bilginize: Arayüzler, sınıflar gibi extends işleciyle genişletilebilir.
Bilginize: Bir arayüzü tanımlayan bir sınıf, bunu arayüzde tanımlı yöntemleri kullanarak yapmalıdır, yoksa işlem ölümcül hata ile sonuçlanır.
Arayüzlerin sabitlerinin olması mümkündür. Arayüz sabitleri tıpkı sınıf sabitleri gibi çalışırlar. Kendilerini miras alan sınıflar veya arayüzler tarafından geçersiz kılınamazlar.
Örnek 1 - Arayüz örneği
<?php
// 'iTemplate' arayüzünü tanımlayalım
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Arayüzü gerçekleyelim
// Bu çalışacaktır
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// Bu çalışmayacaktır
// Ölümcül hata: BadTemplate sınıfı 1 soyut yöntem içermektedir
// dolayısıyla soyut olarak tanımlanması gerekir (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Örnek 2 - Genişletilebilir Arayüzler
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// Bu çalışır
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// Bu çalışmaz, ölümcül hatayla sonuçlanır
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
Örnek 3 - Çok sayıda anayüz oluşturma
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
Örnek 4 - Arayüzler ve sabitleri
<?php
interface a
{
const b = 'Arayüz sabiti';
}
// Şunu basar: Arayüz sabiti
echo a::b;
// Sabitler geçersiz kılınamayacağından bu çalışmaz.
// Sınıf sabitleri için de bu böyledir.
class b implements a
{
const b = 'Sınıf sabiti';
}
?>
Bir arayüz tür dayatarak belli bir nesnenin belli yöntemleri içermesini sağlayabilir. Ayrıca bakınız: instanceof işleci ve Tür Dayatma.
PHP'deki aşırı yükleme, bir sınıfın özelliklerini ve yöntemlerini devingen olarak "oluşturmak" anlamına gelmektedir. Bu devingen öğeler, çeşitli eylem türleri için sınıf içinde oluşturulabilen sihirli yöntemler üzerinden işleme sokulurlar.
Aşırı yükleme yöntemleri, henüz bildirilmemiş veya geçerli etki alanında görünür olmayan özellik ve yöntemlerle etkileşilmek istendiğinde çağrılırlar. Bu bölümün kalanında bu bildirim ve görünürlükle ilgili durumdan bahsederken "erişilemeyen özellikler" ve "erişilemeyen yöntemler" terimlerini kullanacağız.
Tüm aşırı yükleme yöntemlerinin public olarak tanımlanması gerekir.
Bu sihirli yöntemlerin değiştirgelerinin hiçbiri gönderimli olarak aktarılamaz.
Bilginize: PHP'nin "aşırı yükleme" konusundaki yorumu çoğu nesne yönelimli dilden farklıdır. Aşırı yükleme geleneksel olarak, dile, farklı miktar ve türde değiştirgeye sahip aynı isimde çok sayıda yönteme sahip olabilme yeteneği sağlar.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | __callStatic()() eklendi. Genel etki alanında görünürlüğü ve devingen bildirimini zorunlu kılacak uyarı eklendi. |
| 5.1.0 | __isset()() ve __unset()() eklendi. |
__set()() erişilemeyen özelliklere veri yazarken çalıştırılır.
__get()() erişilemeyen özelliklerden veri okurken devreye sokulur.
__isset()() erişilemeyen özellikler için isset() veya empty() çağrıldığında tetiklenir.
__unset()() erişilemeyen özellikler için unset() kullanıldığında çağrılır.
$isim değiştirgesi etkileşime girilecek özelliğin ismidir. __set()() yönteminin $değer değiştirgesi, $isim adlı özelliğe atanacak değeri belirler.
Özellikler üzerindeki aşırı yükleme sadece nesne bağlamında çalışır. Bu sihirli yöntemler duruk bağlamda tetiklenmeyecektir. Bu bakımdan, bu yöntemler static bildirilemez.
Bilginize: PHP'nin atama işlecini ele alış yöhteminden dolayı __set() işlevinin dönüş değeri yoksayılır. Benzer şekilde,
örneğindeki gibi zincirleme atamalarda __get() get asla çağrılmaz.$a = $obj->b = 8;
Örnek 1 - __get(), __set(), __isset() ve __unset() ile aşırı yükleme örneği
<?php
class ÖzellikSınama {
/* Aşırı yüklemeye konu veriler burada. */
private $veri = array();
/* Bildirilmiş özellikler için aşırı yükleme kullanılmaz. */
public $bildirilmiş = 1;
/* Aşırı yükleme sadece sınıf dışından erişilemeyen özellikler içindir.
*/
private $gizli = 2;
public function __set($isim, $değer) {
echo "'$isim' adlı özelliğe '$değer' atanıyor.\n";
$this->veri[$isim] = $değer;
}
public function __get($isim) {
echo "'$isim' adlı özelliğin değeri isteniyor\n";
if (array_key_exists($isim, $this->veri)) {
return $this->veri[$isim];
}
$trace = debug_backtrace();
trigger_error(
$trace[0]['file'] . ' dosyasının ' .
$trace[0]['line'] . '. satırında ' .
'__get() ile tanımsız özellik istendi: ' . $isim,
E_USER_NOTICE);
return null;
}
/** PHP 5.1.0'dan itibaren */
public function __isset($isim) {
echo "'$isim' atanmış mı?\n";
return isset($this->veri[$isim]);
}
/** PHP 5.1.0'dan itibaren */
public function __unset($isim) {
echo "'$name' siliniyor\n";
unset($this->veri[$isim]);
}
/** Sihirli bir yöntem değil; sadece örnek olsun diye. */
public function gizliyiOku() {
return $this->gizli;
}
}
echo "<pre>\n";
$obj = new ÖzellikSınama;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->bildirilmiş .