PHP Kılavuzu

Yazan:
Mehdi Achour
Friedhelm Betz
Antony Dovgal
Nuno Lopes
Hannes Magnusson
Georg Richter
Damien Seguy
Jakub Vrana
24-05-2013
Düzenleyen: Philip Olson
Mustafa Aldemir
Nilgün Belma Bugüner
Yücel Haluk Bugüner
Emre Çamalan
Yaşar Dereli
Faruk Enes
Behzat Erte
Alper Ersoy
Ekin Koç
Buğra Gökalp Okçu
Cumhur Onat
Onur Özgür Özkan
Sinan Polat
Serdar Soydemir
Mesut Tunga
Aydın Uzun
Bünyamin Vıcıl
Sezer Yalçın
çeviriye katkıda bulunmuşlardır.

Telif Hakkı

Copyright © 1997 - 2013 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 Kılavuzu


Önsöz

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.

Yazarlar ve Katkıda Bulunanlar

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.

Yazarlar ve Düzeltmenler

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, Nilgün Belma Bugüner, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Peter Cowburn, Daniel Egeberg, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Justin Martin, Rafael Martinez, Rick McGuire, Moacir de Oliveira Miranda Júnior, Kalle Sommer Nielsen, Yasuo Ohgaki, Richard Quadling, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Yannick Torres, 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.

Kullanıcı Önerilerini Sürdürenler

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




Başlarken


Giriş

İçindekiler


PHP nedir?

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.



PHP neler yapabilir?

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.

  • Sunucu-taraflı programlama. Bu PHP için en geleneksel ve en temel olan alandır. Sunucu-taraflı programlama için üç şeye sahip olmanız gerekir. PHP çözümleyici (CGI ya da sunucu modülü), bir HTTP sunucusu ve bir tarayıcı. PHP programlamada deneyimliyseniz tüm bunları evinizdeki makinede çalıştırabilirsiniz. Yapılandırma ve Kurulum bölümünden bununla ilgili daha fazla bilgiye ulaşabilirsiniz.
  • Komut satırı uygulamaları. Bir PHP uygulamasını komut satırından hiçbir sunucu ya da tarayıcı uygulama kullanmadan çalıştırabilirsiniz. Burada tek ihtiyacınız olan PHP çözümleyicidir. Bu tür kullanım cron üzerinden (Windows eşdeğeri görev yöneticisi) düzenli çalıştırılan işlemler ya da basit metin işleme görevleri için idealdir. PHP'nin komut satırında kullanımı bölümünde daha ayrıntılı bilgiye ulaşaşabilirsiniz.
  • Masaüstü uygulamalarının yazımı. PHP için görsel uygulamaların yazılabileceği en iyi dil diyemeyiz, ancak PHP'yi iyi biliyorsanız ve PHP'nin birtakım ileri seviye özelliklerini kendi istemci taraflı uygulamalarınızda kullanmak istiyorsanız, PHP-GTK eklentisini bu tip programlar yazmak için kullanabilirsiniz. Bu şekilde platformdan bağımsız uygulamalar yazma şansına da kavuşacaksınız. PHP-GTK, PHP için bir eklentidir ve ana dağıtımda yer almaz. PHP-GTK ilginizi çektiyse, » kendi sitesini ziyaret edebilirsiniz.

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, IIS ve daha birçok sunucuyu örnek gösterebiliriz. Bunlara FastCGI PHP çalıştırılabilirini kullanan lighttpd ve nginx gibi sunucular da dahildir. PHP modül olarak kullanılabildiği gibi bir CGI işleyici olarak da ç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.

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. Veritabanlarına özgü eklentilerden birini (örn. mysql) kullanarak veya PDO gibi bir soyutlama katmanı kullanarak PHP ile veritabanı bağlantılı site sayfaları oluşturmak ya da ODBC eklentisi üzerinden bu standardı destekleyen bir bağlantı açmak son derece basittir. Diğer veritabanları için cURL eklentisi veya soketler (CouchDB gibi) kullanılabilir.

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.

PHP oldukça faydalı belge işleme özelliklerine sahiptir. Bu yelpaze Genişletilmiş POSIX ya da Perl düzenli ifade komutlarından (PCRE) XML dosyalarını okumaya ve çözümlemeye kadar uzanır. PHP tüm XML uzantılarını libxml2 tabanında tek bir standartta toplamış ve SimpleXML ile XMLReader ve XMLWriter desteğini de bünyesine katarak sunduğu imkan yelpazesini genişletmiştir.

Alfabetik olarak ve sınıflandırılarak belgelenmiş daha pek çok ilginç eklenti vardır. Bunlara ek olarak » XDebug gibi PHP kılavuzu içinde belgelenmiş ya da belgelenmemiş PECL eklentileri de mevcuttur.

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.




Basit bir eğitmen

İçindekiler

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.


Neye ihtiyacım var?

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



İlk PHP-etkin sayfanız

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



İşe yarar bir şey

Ş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:


Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

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.



Form Kullanımı

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 yeni sürümleri ile eski kod yapısını kullanmak

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:

  • Eski $HTTP_*_VARS tipi değişkenler ömürlerini doldurdular (bu değişkenler bir işlev ya da yöntem içersinde kullanılmadan önce tanımlanmalıydılar). Bunların yerini alan süper küresel diziler PHP'nin » 4.1.0 sürümünden itibaren kullanılabilir olmuştur. Bunlar: $_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, $_REQUEST ve $_SESSION dizileridir. Daha eski, $HTTP_POST_VARS gibi $HTTP_*_VARS dizileri de hala kullanılabilmektedir. PHP 5.0.0'dan itibaren öntanımlı değişken dizileri register_long_arrays yönergesi ile iptal edilebilmektedir.
  • Dış kaynaklı değişkenler artık küresel etki alanında örtanımlı olarak yer almamaktadır. Başka bir deyişle, PHP » 4.2.0 sürümünden itibaren register_globals php.ini yönergesinin öntanımlı değeri off'tur (kapalıdır). Bu değerlere erişim için tercih edilen süper küresel dizi kullanımından yukarıda bahsettik. Eski betikler, kitaplar ve öğreticiler bu yönergenin on olduğu kabul edilerek yazılmış olabilir. Bu yönerge on olduğunda, örneğin http://mesela.dom/foo.php?id=42 URL'sine gelen bir istek ile $id değişkeni özdevinimli olarak oluşturulur. Bu yönergenin açık ya da kapalı olduğuna bakılmazsızın, $_GET['id()] daima kullanılabilir olacaktır.
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.



Sonraki adım nedir?

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.





Yapılandırma ve Kurulum


Genel Kurulum Değerlendirmesi

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:

  • Genel Ağ siteleri ve uygulamaları (Sunucu taraflı)
  • Komut satırı uygulamaları
  • Masaüstü uygulamaları

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



Unix Sistemlere Kurulum

İçindekiler

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:

  • Temel Unix kullanım bilgisi ("make" komutunu ve bir C derleyicisini kullanabiliyor olmak)
  • Bir ANSI C derleyici
  • Bir HTTP sunucusu
  • Modüllere özgü bileşenler (GD, PDF kütüphaneleri, vs.)

SVN kaynaklarıdan derlerken veya özel değişiklikler yaptıktan sonra şunlar da gerekebilir:

  • autoconf: 2.13
  • automake: 1.4+
  • libtool: 1.4.x+ (1.4.2 hariç)
  • re2c: 0.13.4 veya daha yeni sürümü
  • flex: 2.5.4 sürümü (PHP <= 5.2 için)
  • bison: 1.28 sürümü (tercih), 1.35 veya 1.75

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.


Unix sistemler ve Apache 1.3.x

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.

      LoadModule php5_module libexec/libphp5.so

15. httpd.conf'un AddModule bölümünde ClearModuleList yönergesinin altına
    şunu ekleyin:

      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

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 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 libphp5.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 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 Group satı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.



Unix sistemler ve Apache 2.x

Bu bölüm Unix sistemlerde PHP'nin Apache 2.x'e kurulumu hakkında bilgiler ve ipuçları içerir.

Uyarı

Apache 2'nin bir hizmet ortamında evreli MPM'lerle kullanımını önermiyoruz. Bunun yerine Apache 2.0 ve 2.2'de öntanımlı MPM olan Prefork MPM'sini 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.

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.

  1. Apache HTTP sunucusunu edindikten sonra şu komutları verin:

    gzip -d httpd-2_x_NN.tar.gz
    tar -xf httpd-2_x_NN.tar
    
  2. Benzer işlemleri PHP için de yapın:

    gunzip php-NN.tar.gz
    tar -xf php-NN.tar
    
  3. Apache'yi derleyip kurun. Apache'nin nasıl derleneceğini Apache kurulumu belgesinden öğrenebilirsinz.

    cd httpd-2_x_NN
    ./configure --enable-so
    make
    make install
    
  4. 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ı ile çalıştırmak üzere sunucuyu durdurun:
    /usr/local/apache2/bin/apachectl stop
    

  5. Şimdi PHP'yi yapılandırıp kurun. Bunu hangi eklentileri etkin kılacaksanız onların seçeneklerini kullanarak yapabilirsiniz. Olası seçeneklerin listesini almak için komut satırına ./configure --help yazın. Örneğimizde Apache ve MySQL desteğini etkin kılacağız.

    Apache'yi yukarıda açklandığı gibi kaynak paketinden derlediyseniz aşağıdaki örnek sizin apxs yolunuzla eşleşecektir. Fakat Apache'yi başka bir şekilde kurduysanız apxs yolunu buna uygun olarak ayarlamalısınız. Bazı dağıtımlar apxs yerine apxs2 ismini kullanır, buna dikkat edin.

    cd ../php-NN
    ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
    make
    make install
    

    Eğer kurulumdan sonra yapılandırmanızı değiştirmek isterseniz sadece configure, make ve make install adımlarını 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.

    Aksi belirtilmedikçe, 'make install' ile phpize gibi çeşitli PHP araçları, PEAR, PHP CLI ve benzerleri de kurulacaktır.

  6. 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, 5. şı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.

  7. 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
  8. 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 .php 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.

  9. 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 3. şıkta derleme seçeneklerinize şu seçeneğini ekleyebilirsiniz:


--with-mpm=worker

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.



Unix sistemlerde Lighttpd 1.4

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

Letting Lighttpd'ye PHP süreçlerini çatallattırmak

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çı).

Spawn-fcgi ile çatallama

Lighttpd, fastcgi süreçlerinin çatallanmasını kolaylaştırmak için spawn-fcgi adında bir programla gelir.

php-cgi'nin çatallanması

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"

Uzak FCGI (nesnel) örneklerine bağlanmak

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


Sun Solaris'te Sun, iPlanet ve Netscape Sunucuları

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.

  1. Aşağıdaki paketleri »  http://www.sunfreeware.com/ veya başka bir siteden indirip kurabilirsiniz:

    • autoconf-2.13
    • automake-1.4
    • bison-1_25-sol26-sparc-local
    • flex-2_5_4a-sol26-sparc-local
    • gcc-2_95_2-sol26-sparc-local
    • gzip-1.2.4-sol26-sparc-local
    • m4-1_4-sol26-sparc-local
    • make-3_76_1-sol26-sparc-local
    • mysql-3.23.24-beta (mysql desteği istiyorsanız)
    • perl-5_005_03-sol26-sparc-local
    • tar-1.13 (GNU tar)

  2. PATH ortam değişkeninde gerekli dizinlerin bulunduğundan emin olun ( PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin) ve export PATH ile sisteminizde kullanılabilir olmasını sağlayın.
  3. gunzip php-x.x.x.tar.gz (.gz paketi değilse 4'e gidin).
  4. tar xvf php-x.x.x.tar
  5. Bu işlem sonucunda oluşan PHP dizinine geçin: cd ../php-x.x.x
  6. 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

  7. Bir make ve ardından make install yapın.

Temel kurulum bitip ilgili benioku dosyalarını da okuduktan sonra bir kaç adımlık yapılandırma işlemi kalmış olacak.

Sun/iPlanet/Netscape için Yapılandırma Talimatları

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

  1. Aşağıdaki satırı mime.types dosyasına ekleyin (bunu yönetim sunucusunda yapabilirsiniz):

    type=magnus-internal/x-httpd-php exts=php
    

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

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

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

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

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

CGI ortamı ve php.ini dosyasında önerilen değişiklikler

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

Özel dizin listeleri ve hata sayfaları (PHP >= 4.3.3)

"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_virtual() ve alt istekler (PHP >= 4.3.3)

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



CGI ve Komut Satırı Ayarları

PHP, CGI işlemleri için öntanımlı olarak hem bir CLI hem de bir CGI programı olarak derlenir. 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.

Uyarı

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.

Sınama

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.

Değişkenlerin kullanımı

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.



HP-UX'e Özgü Kurulum Bilgileri

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



OpenBSD Kurulum Bilgiler

Bu bölüm PHP'nin » OpenBSD 3.6 sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.

İkil Paketlerin Kullanımı

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.

Portların Kullanımı

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.

Bilinen Sorunlar

  • Apache'nin öntanımlı kurulumu bir » chroot(2) hücresinde çalışır, böylece PHP betiklerinin /var/www altındaki dosyalara erişmesi engellenir. Bu bakımdan PHP oturum dosyalarının saklanması için ya /var/www/tmp diye bir dizine ya da başka bir oturum arayüzü kullanmaya ihtiyacınız olacaktır. Buna ek olarak, veritabanı soketlerinin de hücre içine yerleştirilmesi veya localhost arayüzünü dinlemesi gerekir. Ağ işlevleri kullanıyorsanız, /etc dizinindeki /etc/resolv.conf ve /etc/services gibi dosyaların /var/www/etc dizinine taşınması gerekecektir. OpenBSD PEAR paketi özdevinimli olarak doğru chroot dizinlerine kurulur dolayısıyla onun için özel bir değişiklik yapmak gerekmez. OpenBSD üzerinde Apache hakkında daha ayrıntılı bilgi edinmek için » OpenBSD SSS'sine bakınız.
  • » gd için OpenBSD 3.6 paketi XFree86'nın kurulu olmasını gerektirir. X11 için gereken bazı yazı tipi özelliklerini istemiyorsanız bunun yerine php4-gd-4.3.8-no_x11.tgz paketini kurunuz.

Eski Dağıtımlar

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



Solaris'e özgü Kurulum İpuçları

Bu bölüm PHP'nin Solaris sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.

Gerekli Yazılımlar

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:

  • gcc (önerilir, fakat başka C derleyiciler de iş görür)
  • make
  • flex
  • bison
  • m4
  • autoconf
  • automake
  • perl
  • gzip
  • tar
  • GNU sed
Bunlara ek olarak, Oracle veya MySQL gibi yapılandırmanıza özgü bir takım ek yazılımların kurulması da gerekebilir.

Paketlerin kullanımı

Kurulması gereken bileşinlerin çoğunu kurmak için pkgadd kullanarak Solaris kurulum işlemlerini kolaylaştırabilirsiniz.



Debian GNU/Linux Kurulum Bilgileri

Bu bölüm Unix sistemlerde PHP'nin » Debian GNU/Linux kurulumu hakkında bilgiler ve ipuçları içerir.

Uyarı

Üçüncü partilerdeki resmi olmayan derlemeler burada desteklenmemektedir. » İndirme alanımızdaki en son paketi alıp aynı hatanın devam ettiğini görmedikçe Debian ekibine herhangi bir yazılım hatası raporlanmamalıdır.

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.

APT kullanımı

Ö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

Yapılandırma üzerinde daha iyi denetim

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.

Bilinen sorunlar

  • Bir betiğin sonucu yerine betiğin PHP kaynak kodlarını görüyorsanız, Debian muhtemelen /etc/apache2/apache2.conf dosyasına (veya benzeri bir dosyaya) PHP ile ilgili satırları eklememiştir. Bu konu ile ilgili ayrıntılar için Debian kılavuzuna bakınız.
  • Eğer bir eklenti tanımlı gibi gözüktüğü halde işlevlerini kullanamıyorsanız ilgili ini dosyasının yüklendiğinden ve Apache2'nin yeniden başlatıldığından emin olmalısınız.
  • Debian üzerinde paket kurmak için kullanılabilecek iki temel komut vardır: apt-get ve aptitude. Bu iki komut arasındaki farklar için dağıtımınızla gelen belgelere bakınız.



Mac OS X üzerine Kurulum

İçindekiler

Bu bölümde, PHP'nin Mac OS X üzerindeki kurulumlarına özgü bilgilere ve ipuçlarına yer verilmiştir. Macs üzerinde PHP'nin kurulumu Unix kurulum kılavuzundakine benzer şekilde yapılır.


Paketlerin Kullanımı

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:



Paketlenmiş PHP Kullanımı

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:

  1. Apache yapılandırma dosyasını bulup açın. Öntanımlı olarak yeri: /etc/apache2/httpd.conf Bu dosyanın sahibi root olduğundan ve öntanımlı olarak onun özelinde olduğundan Finder veya Spotlight kullanarak dosyayı bulmak zor olabilir.

    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.

  2. 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
    
    Konuma/yola dikkat. PHP'yi gelecekte tekrar derlerseniz yukarıdaki dosyaların yerine yenilerini koymayı unutmayın. Yoksa bu satırları tekrar açıklama haline getirmelisiniz.

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

  4. DirectoryIndex yönergesinde belirtilen öntanımlı dizin içerik dosyasının yüklendiğinden emin olun. Bu ayrıca httpd.conf içinde de atanır. Bu amaçla genellikle index.php ve index.html kullanılır. PHP'nin varlığını sınayan yukarıdakı satırlardan dolayı öntanımlı olarak index.php etkindir. Gerekirse bu ayarı kendinize göre değiştirin.
  5. Ya php.ini dosyasının yerini ayarlayın ya da öntanımlıyı kullanın Mac OS X üzerindeki öntanımlı yeri genellikle /usr/local/php/php.ini olup bir phpinfo() işlev çağrısı da yerini gösterecektir. Eğer bir php.ini kullanılmamışsa, PHP öntanımlı değerleri kullanacaktır. php.ini'yi bulmak için SSS'ye bakabilirsiniz.
  6. DocumentRoot'u belirleyip ayarlayın. Bu, HTTP sunucusunun belge kök dizinidir. Bu dizindeki dosyalar HTTP sunucusu tarafından sunulur. Dolayısıyla PHP dosyaları da tarayıcıya gönderilmeden önce PHP tarafından yorumlanır. Genelde öntanımlı belge kök dizini /Library/WebServer/Documents olup httpd.conf dosyasında belirtilmesi gerekir. Ayrıca, her kullanıcının kendi öntanımlı belge kök dizini vardır: /Users/kullanıcı/Sites
  7. Bir phpinfo() dosyası oluşturun

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

  8. Apache'yi yeniden başlatın ve yukarıdaki PHP dosyasını yükleyin Apache'yi başlatmak için ya kabukta sudo apachectl graceful komutunu verin ya da OS X Sistem Tercihlerinden "Kişisel HTTP Sunucusu" seçeneğini durdurup başlatın. Öntanımlı olarak, yerel dosyaları tarayıcıya yüklemek için şöyle bir URL kullanılır: http://localhost/info.php. Kullanıcı dizinizdeki belge kök dizinini kullanarak bunu şöyle yapabilirsiniz: http://localhost/~kullanıcı/info.php

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.



Compiling PHP on Mac OS X

Use the Unix installation guide to compile PHP on Mac OS X.




Windows Sistemlerine Kurulum

İçindekiler

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.

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 gibi bir geliştirme ortamınız varsa PHP'yi kaynak kodundan da derleyebilirsiniz.

PHP'yi Windows sisteminize kurduktan sonra çeşitli eklentiler yüklemek suretiyle işlevselliğini arttırabilirsiniz.

Uyarı

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.


Windows Installer (PHP 5.1.0 and earlier)

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.

Uyarı

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.



Windows Installer (PHP 5.2 and later)

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.

Normal Install

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 option for the feature "PDO" you will install all PDO Drivers).

Uyarı

It is not recommended to install all extensions by default, since many of them require dependencies from outside PHP in order to function properly. Instead, use the Installation Repair Mode that can be triggered through 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.

Silent Install

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 use the same syntax to specify the Apache Configuration Directory (APACHEDIR), the Sambar Server directory (SAMBARDIR), and the Xitami Server directory (XITAMIDIR).

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

Upgrading PHP with the Install

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.



Manual Installation Steps

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

Selecting and downloading the PHP distribution package

Download the PHP zip binary distribution from » PHP for Windows: Binaries and Sources. There are several different versions of the zip package - choose 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 IIS7 or greater and PHP 5.3+, then the VC9 binaries of PHP should be used.

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

The PHP package structure and content

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.

Changing the php.ini file

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.



Microsoft IIS

This section contains PHP installation instructions specific to Microsoft Internet Information Services (IIS).



Microsoft IIS 5.1 and IIS 6.0

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.

Configuring IIS to process PHP requests

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.

Impersonation and file system access

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:

  1. In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";

  2. 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";

  3. Click the "Directory Security" tab;

  4. Take note of a "User name:" field in the "Authentication Methods" dialog

Anonymous authenication for IIS 5.1 and IIS 6.0

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)

Set index.php as a default document in IIS

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:

  1. In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";

  2. Right-click on the "Web Sites" node in the tree view and select "Properties";

  3. Click the "Documents" tab;

  4. Click the "Add..." button and enter "index.php" for the "Default content page:".

Setting index.php as default document for IIS

FastCGI and PHP Recycling configuration

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

Configuring FastCGI timeout settings

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

Changing the Location of php.ini file

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\"



Microsoft IIS 7.0 and later

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.

Enabling FastCGI support in IIS

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:

  1. In the Windows Start Menu choose "Run:", type "optionalfeatures.exe" and click "Ok";

  2. In the "Windows Features" dialog expand "Internet Information Services", "World Wide Web Services", "Application Development Features" and then enable the "CGI" checkbox;

  3. Click OK and wait until the installation is complete.

Enabling FastCGI support for IIS7 on Windows Vista SP1 and Windows 7

To enable FastCGI support on Windows Server 2008 and Windows Server 2008 R2:

  1. In the Windows Start Menu choose "Run:", type "CompMgmtLauncher" and click "Ok";

  2. If the "Web Server (IIS)" role is not present under the "Roles" node, then add it by clicking "Add Roles";

  3. If the "Web Server (IIS)" role is present, then click "Add Role Services" and then enable the "CGI" checkbox under "Application Development" group;

  4. Click "Next" and then "Install" and wait for the installation to complete.

Enabling FastCGI support on Windows Server 2008 and Windows Server 2008 R2

Configuring IIS to process PHP requests

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.

Using IIS Manager user interface to create a handler mapping for PHP

Follow these steps to create an IIS handler mapping for PHP in IIS Manager user interface:

  1. In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";

  2. In the IIS Manager user interface select the server node in the "Connections" tree view;

  3. In the "Features View" page open the "Handler Mappings" feature;

    Create IIS handler mapping for PHP : Locate Handler Mappings

  4. In the "Actions" pane click "Add Module Mapping...";

  5. In the "Add Module Mapping" dialog enter the following:

    • Request path: *.php
    • Module: FastCgiModule
    • Executable: C:\[Path to PHP installation]\php-cgi.exe
    • Name: PHP_via_FastCGI

  6. Click "Request Restrictions" button and then configure the mapping to invoke handler only if request is mapped to a file or a folder;

  7. Click OK on all the dialogs to save the configuration.

Create IIS handler mapping for PHP : Add Handler Mapping

Using command line tool to create a handler mapping for PHP

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.

Impersonation and file system access

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)

Set index.php as a default document in IIS

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

FastCGI and PHP Recycling configuration

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']"

FastCGI timeout settings

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 timeout settings

%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

Changing the Location of php.ini file

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



Apache 1.3.x on Microsoft Windows

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.

Installing as an Apache module

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

Installing as a CGI binary

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.

Uyarı

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'); ?>.



Apache 2.x on Microsoft Windows

This section contains notes and hints specific to Apache 2.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 Support

Users of Apache 2.2 should note that the DLL file for Apache 2.2 is named php5apache2_2.dll rather than php5apache2.dll and is available only for PHP 5.2.0 and later. See also » http://snaps.php.net/

You are strongly encouraged to consult the » Apache Documentation to get a basic understanding of the Apache 2.x Server. Also consider reading the » Windows specific notes for Apache 2.x before reading on here.

Apache 2.x is designed to run on the Windows version designated as server platforms, such as Windows NT 4.0, Windows 2000, Windows XP, or Windows 7. While Apache 2.x works tolerably well on Windows 9x, support on these platforms is incomplete, and some things will not work correctly. There is no plan to remedy this situation.

Download the most recent version of »  Apache 2.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 three ways to set up PHP to work with Apache 2.x on Windows. You can run PHP as a handler, as a CGI, or under FastCGI.

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.

Installing as an Apache handler

You need to insert the following lines into your Apache httpd.conf configuration file to load the PHP module for Apache 2.x:

Örnek 1 PHP and Apache 2.x as handler

# 
LoadModule php5_module "c:/php/php5apache2.dll"
AddHandler 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 php5apache2.dll or php5apache2_2.dll in your LoadModule directive and verify that the referenced file is in fact located at the file path that you point to in this directive.

The above configuration will enable PHP handling of any file that has a .php extension, even if there are other file extensions. For example, a file named example.php.txt will be executed by the PHP handler. To ensure that only files that end in .php are executed, use the following configuration instead:

<FilesMatch \.php$>
      SetHandler application/x-httpd-php
 </FilesMatch>

Running PHP as CGI

You should consult the » Apache CGI documentation for a more complete understanding of running CGI on Apache.

To run PHP as CGI, you'll need to place your php-cgi files in a directory designated as a CGI directory using the ScriptAlias directive.

You will then need to insert a #! line in the PHP files, pointing to the location of your PHP binary:

Örnek 2 PHP and Apache 2.x as CGI

#!C:/php/php.exe
<?php
  phpinfo();
?>

Uyarı

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.

Running PHP under FastCGI

Running PHP under FastCGI has a number of advantages over running it as a CGI. Setting it up this way is fairly straightforward:

Obtain mod_fcgid from » http://httpd.apache.org/mod_fcgid/. Win32 binaries are available for download from that site. Install the module according to the instructions that will come with it.

Configure your web server as shown below, taking care to adjust any paths to reflect your how you have installed things on your particular system:

Örnek 3 Configure Apache to run PHP as FastCGI

LoadModule fcgid_module modules/mod_fcgid.so  

# Where is your php.ini file?
FcgidInitialEnv PHPRC        "c:/php" 

AddHandler fcgid-script .php  
FcgidWrapper "c:/php/php-cgi.exe" .php  
Files with a .php extension will now be executed by the PHP FastCGI wrapper.



Sun, iPlanet and Netscape servers on Microsoft Windows

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.

CGI setup on Sun, iPlanet and Netscape servers

To install PHP as a CGI handler, do the following:

  • Copy php4ts.dll to your systemroot (the directory where you installed Windows)
  • Make a file association from the command line. Type the following two lines:

    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • In the Netscape Enterprise Administration Server create a dummy shellcgi directory and remove it just after (this step creates 5 important lines in obj.conf and allow the web server to handle shellcgi scripts).
  • In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/shellcgi, File Suffix:php).
  • Do it for each web server instance you want PHP to run

More details about setting up PHP as a CGI executable can be found here: » http://benoit.noss.free.fr/php/install-php.html

NSAPI setup on Sun, iPlanet and Netscape servers

To install PHP with NSAPI, do the following:

  • Copy php4ts.dll to your systemroot (the directory where you installed Windows)
  • Make a file association from the command line. Type the following two lines:

    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/x-httpd-php, File Suffix: php).
  • 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.

  • Restart your web service and apply changes
  • Do it for each web server instance you want PHP to run

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").

CGI environment and recommended modifications in php.ini

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

Special use for error pages or self-made directory listings (PHP >= 4.3.3)

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'].

Note about nsapi_virtual() and subrequests (PHP >= 4.3.3)

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



Sambar Server on Microsoft Windows

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.



Xitami on Microsoft Windows

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.

Uyarı

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.



Building from source

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.

See the Wiki documentation at: » http://wiki.php.net/internals/windows/stepbystepbuild



Installation of extensions on Windows

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.

PHP Extensions
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 PHP 4 domxml 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 PHP 4 Object overloading functions Built in since PHP 4.3.0, removed as of PHP 5.0.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



Command Line PHP on Microsoft Windows

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.

    Bilginize:

    Both PATH and PATHEXT are important pre-existing system variables in Windows, and care should be taken to not overwrite either variable, only to add to them.

  • Append 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.

  • Append 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.exe,0"

[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
or, if your "C:\PHP Scripts" path is in the PATH environment variable:
script -arg1 -arg2 -arg3

Bilginize:

There is a small problem if you intend to use this technique and use your PHP scripts as a command line filter, like the example below:

dir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3
or
dir | script -arg1 -arg2 -arg3
You may find that the script simply hangs and nothing is output. To get this operational, you need to make another registry change.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]
"InheritConsoleHandles"=dword:00000001
Further information regarding this issue can be found in this » Microsoft Knowledgebase Article : 321788.




Installation on Cloud Computing platforms

İçindekiler

PHP installs on the cloud. To the PHP cloud!


Microsoft Azure

PHP installs on the » Azure cloud platform.

See also the » Azure SDK for PHP.



Amazon EC2

PHP installs on the » EC2 cloud platform.

See also the » AWS SDK for PHP.




FastCGI Process Manager (FPM)

İçindekiler

FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features (mostly) useful for heavy-loaded sites.

These features include:

  • advanced process management with graceful stop/start;

  • ability to start workers with different uid/gid/chroot/environment, listening on different ports and using different php.ini (replaces safe_mode);

  • stdout and stderr logging;

  • emergency restart in case of accidental opcode cache destruction;

  • accelerated upload support;

  • "slowlog" - logging scripts (not just their names, but their PHP backtraces too, using ptrace and similar things to read remote process' execute_data) that are executed unusually slow;

  • fastcgi_finish_request() - special function to finish request and flush all data while continuing to do something time-consuming (video converting, stats processing etc.);

  • dynamic/static child spawning;

  • basic SAPI status info (similar to Apache mod_status);

  • php.ini-based config file.


Installation

Compiling from sources

In order to enable FPM in your PHP build you need to add --enable-fpm to your configure line.

There are several other FPM-specific configure options (all of them optional):

  • --with-fpm-user - set FPM user (default - nobody).

  • --with-fpm-group - set FPM group (default - nobody).



Configuration

FPM uses php.ini syntax for its configuration file - php-fpm.conf.

List of global php-fpm.conf directives

pid string

Path to PID file. Default value: none.

error_log string

Path to error log file. Default value: #INSTALL_PREFIX#/log/php-fpm.log.

log_level string

Error log level. Possible values: alert, error, warning, notice, debug. Default value: notice.

emergency_restart_threshold int

If this number of child processes exit with SIGSEGV or SIGBUS within the time interval set by emergency_restart_interval then FPM will restart. A value of 0 means 'Off'. Default value: 0 (Off).

emergency_restart_interval mixed

Interval of time used by emergency_restart_interval to determine when a graceful restart will be initiated. This can be useful to work around accidental corruptions in an accelerator's shared memory. Available Units: s(econds), m(inutes), h(ours), or d(ays). Default Unit: seconds. Default value: 0 (Off).

process_control_timeout mixed

Time limit for child processes to wait for a reaction on signals from master. Available units: s(econds), m(inutes), h(ours), or d(ays) Default Unit: seconds. Default value: 0.

daemonize boolean

Send FPM to background. Set to 'no' to keep FPM in foreground for debugging. Default value: yes.

List of pool directives

With FPM you can run several pools of processes with different setting. These are settings that can be tweaked per pool.

listen string

The address on which to accept FastCGI requests. Valid syntaxes are: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. This option is mandatory for each pool.

listen.backlog int

Set listen(2) backlog. A value of '-1' means unlimited. Default value: -1.

listen.allowed_clients string

List of ipv4 addresses of FastCGI clients which are allowed to connect. Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original PHP FastCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address must be separated by a comma. If this value is left blank, connections will be accepted from any ip address. Default value: any.

listen.owner string

Set permissions for unix socket, if one is used. In Linux, read/write permissions must be set in order to allow connections from a web server. Many BSD-derived systems allow connections regardless of permissions. Default values: user and group are set as the running user, mode is set to 0666.

listen.group string

See listen.owner.

listen.mode string

See listen.owner.

user string

Unix user of FPM processes. This option is mandatory.

group string

Unix group of FPM processes. If not set, the default user's group is used.

pm string

Choose how the process manager will control the number of child processes. Possible values: static, ondemand, dynamic. This option is mandatory.

static - the number of child processes is fixed (pm.max_children).

ondemand - the processes spawn on demand (when requested, as opposed to dynamic, where pm.start_servers are started when the service is started.

dynamic - the number of child processes is set dynamically based on the following directives: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.

pm.max_children int

The number of child processes to be created when pm is set to static and the maximum number of child processes to be created when pm is set to dynamic. This option is mandatory.

This option sets the limit on the number of simultaneous requests that will be served. Equivalent to the ApacheMaxClients directive with mpm_prefork and to the PHP_FCGI_CHILDREN environment variable in the original PHP FastCGI.

pm.start_servers in

The number of child processes created on startup. Used only when pm is set to dynamic. Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.

pm.min_spare_servers int

The desired minimum number of idle server processes. Used only when pm is set to dynamic. Also mandatory in this case.

pm.max_spare_servers int

The desired maximum number of idle server processes. Used only when pm is set to dynamic. Also mandatory in this case.

pm.max_requests int

The number of requests each child process should execute before respawning. This can be useful to work around memory leaks in 3rd party libraries. For endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. Default value: 0.

pm.status_path string

The URI to view the FPM status page. If this value is not set, no URI will be recognized as a status page. Default value: none.

ping.path string

The ping URI to call the monitoring page of FPM. If this value is not set, no URI will be recognized as a ping page. This could be used to test from outside that FPM is alive and responding. Please note that the value must start with a leading slash (/).

ping.response string

This directive may be used to customize the response to a ping request. The response is formatted as text/plain with a 200 response code. Default value: pong.

request_terminate_timeout mixed

The timeout for serving a single request after which the worker process will be killed. This option should be used when the 'max_execution_time' ini option does not stop script execution for some reason. A value of '0' means 'Off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.

request_slowlog_timeout mixed

The timeout for serving a single request after which a PHP backtrace will be dumped to the 'slowlog' file. A value of '0' means 'Off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.

slowlog string

The log file for slow requests. Default value: #INSTALL_PREFIX#/log/php-fpm.log.slow.

rlimit_files int

Set open file descriptor rlimit. Default value: system defined value.

rlimit_core int

Set max core size rlimit. Possible Values: 'unlimited' or an integer greater or equal to 0. Default value: system defined value.

chroot string

Chroot to this directory at the start. This value must be defined as an absolute path. When this value is not set, chroot is not used.

chdir string

Chdir to this directory at the start. This value must be an absolute path. Default value: current directory or / when chroot.

catch_workers_output boolean

Redirect worker stdout and stderr into main error log. If not set, stdout and stderr will be redirected to /dev/null according to FastCGI specs. Default value: no.

It's possible to pass additional environment variables and update PHP settings of a certain pool. To do this, you need to add the following options to php-fpm.conf

Örnek 1 Passing environment variables and PHP settings to a pool

env[HOSTNAME] = $HOSTNAME
       env[PATH] = /usr/local/bin:/usr/bin:/bin
       env[TMP] = /tmp
       env[TMPDIR] = /tmp
       env[TEMP] = /tmp

       php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
       php_flag[display_errors] = off
       php_admin_value[error_log] = /var/log/fpm-php.www.log
       php_admin_flag[log_errors] = on
       php_admin_value[memory_limit] = 32M
PHP settings passed with php_value or php_flag will overwrite their previous value. Please note that defining disable_functions or disable_classes will not overwrite previously defined php.ini values, but will append the new value instead.

Settings defined with php_admin_value and php_admin_flag cannot be overriden with ini_set().

As of 5.3.3, PHP settings are also possible to be set in webserver.

Örnek 2 set PHP settings in nginx.conf

set $php_value "pcre.backtrack_limit=424242";
set $php_value "$php_value \n pcre.recursion_limit=99999";
fastcgi_param  PHP_VALUE $php_value;

fastcgi_param  PHP_ADMIN_VALUE "open_basedir=/var/www/htdocs";
Dikkat

Because these settings are passed to php-fpm as fastcgi headers, php-fpm should not be bound to a worldwide accessible address. Otherwise, anyone could alter the PHP configuration options. See also listen.allowed_clients.




PECL eklentilerinin kurulması

İçindekiler


PECL Kurulumları Hakkında

» 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 Eklentilerinin İndirilmesi

PECL eklentilerini indirmek için çeşitli seçenekler vardır:

  • pecl install eklenti komutu eklenti kodunu özdevinimli olarak indirir, dolayısıyla ayrı bir indirme işlemine gerek kalmaz.
  • » http://pecl.php.net/ PECL sitesi, PHP Geliştirme Ekibi tarafından önerilen farklı eklentiler hakkında bilgiler içerir. Burada bulunan bilgilerden bazıları: ChangeLog dosyaları, dağıtım notları, gereksinimler ve benzeri ayrıntılar.
  • pecl download eklenti komutu PECL sitesinine dağıtım listesinde bulunan eklentileri indirip kurmak için » pecl komutu kullanılabilir. İstenen sürümler ayrıca belirtilebilir.
  • SVN Çoğu PECL eklentisi ayrıca SVN'de de bulunmaktadır. SVN içeriğini tarayıcınızla » http://svn.php.net/viewvc/pecl/ adresinde inceleyebilirsiniz. Eklentileri doğrudan SVN'den indirmek için sırayla aşağıdaki komutları verebilirsiniz.


    $ svn checkout http://svn.php.net/repository/pecl/extname/trunk eklenti

  • Windows için Artık PHP projesi PECL eklentilerinin Windows çalıştırılabilirlerini derlememektedir. Ancak, Windows altında PHP derlemek için PHP'nin Windows için derlenmesi başlıklı bölüme bakabilirsiniz.


Bir PHP Eklentisinin Windows Kurulumu

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.

Bir eklenti nereden bulunur?

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.

Hangi eklenti indirilecek?

Çoğu zaman her DLL'nin çok sayıda sürümü vardır:

  • Farklı sürüm numaraları (en azından ilk iki sayı tutmalı)
  • Farklı evre güvenceli olanlar
  • Farklı işlemciler için olanlar (x86, x64, ...)
  • Farklı hata ayıklama seçenekli olanlar
  • vs.

Ş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 eklentinin yüklenmesi

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.

Sorunların çözümlenmesi

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.



Paylaşımlı PECL eklentilerinin pecl komutu ile derlenmesi

PECL, paylaşımlı PHP eklentilerinin oluşturulmasını kolaylaştırır. » pecl komutunu şöyle kullanabilirsiniz:


$ pecl install eklenti

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:


$ pecl install eklenti-beta

Ayrıca belli bir sürümü şu şekilde kurabilirsiniz:


$ pecl install eklenti-0.1

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.



Paylaşımlı PECL eklentilerinin 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.



PECL eklentilerinin PHP içinde duruk olarak derlenmesi

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:


/php/kaynak/dizininiz/ext/eklenti

Artık PHP kaynak paketinin configure betiğini yeniden oluşturup PHP'yi her zamanki gibi derleyebilirsiniz:


$ cd /php/kaynak/dizininiz/
$ rm configure
$ ./buildconf --force
$ ./configure --help
$ ./configure --with-eklenti --enable-baskabireklenti --with-filanca
$ make
$ make install

Bilginize: buildconf betiğ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:


$ ./configure --help | grep eklenti




Sorunlar?

İçindekiler


SSS'yi okuyun

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.



Diğer Sorunlar

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.



Hata Bildirme

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!




Çalışma Anı Yapılandırması

İçindekiler


Yapılandırma Dosyası

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



.user.ini dosyaları

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). PHP dosyasının belge kökü dışında olduğu durumlarda sadece onun dizini taranır.

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



Yapılandırma ayarlarının yeri

   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.  

PHP_INI_* kiplerinin tanımları
Kip Değeri Anlamı
PHP_INI_USER 1 Girdi Windows registry veya kullanıcı betiklerinde atanabilir.
PHP_INI_PERDIR 6 Girdi php.ini, .htaccess veya httpd.conf dosyasında atanabilir.
PHP_INI_SYSTEM 4 Girdi php.ini veya httpd.conf dosyasında atanabilir.
PHP_INI_ALL 7 Girdi herhangi bir yerde atanabilir.


Yapılandırma ayarlarının değiştirilmesi

PHP'nin bir Apache modülü olarak çalıştırılması

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_value yö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 veya ini_set() 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 engine on
</IfModule>
<IfModule mod_php4.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>

Dikkat

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 yapılandırmasının Windows kayıt defteri üzerinden değiştirilmesi

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.

Diğer PHP arayüzleri

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.





Dil Başvuru Kılavuzu


Temel Sözdizimi

İçindekiler


HTML'den Kaçmak

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.

Bilginize:

PHP 5.2 ve öncesinde, çözümleyici, bir dosya içindeki tek şey olarak <?php başlangıç etiketine izin vermezdi. PHP 5.3'ten itibaren izin verilmektedir.



Deyim Ayrımı

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.



Açıklamalar

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




Türler

İçindekiler


Giriş

PHP sekiz ilkel veri türü destekler.

Dört sayıl tür:

İki bileşik tür:

Ve son olarak üç ö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;
}

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



boolean

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

Sözdizimi

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üşüm

Bir 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).

Uyarı

-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)
?>


integer

Bir integer türünde değer şu kümeden bir tamsayıdır: Z = {..., -2, -1, 0, 1, 2, ...}.

Bunlara da bakınız:

Syntax

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 bitlik sistemlerde azami değer 2 milyon civarında iken 64 bitlik sistemlerde 9E18 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.

Uyarı

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
?>

Tamsayılarda taşma

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.

Örnek 3 32 bitlik sistemlerde tamsayı taşması

<?php
$büyük_sayı 
=  2147483647;
var_dump($büyük_sayı);

$büyük_sayı =  2147483648;
var_dump($büyük_sayı);

$milyon 1000000;
$büyük_sayı =  50000 $million;
var_dump($büyük_sayı);
?>

Örnek 4 64 bitlik sistemlerde tamsayı taşması

<?php
$büyük_sayı 
9223372036854775807;
var_dump($büyük_sayı);                     // int(9223372036854775807)

$büyük_sayı 9223372036854775808;
var_dump($büyük_sayı);                     // float(9.2233720368548E+18)

$milyon 1000000;
$büyük_sayı=  50000000000000 $milyon;
var_dump($büyük_sayı);                     // float(5.0E+19)
?>
Uyarı

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üşüm

Bir 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üşüm

FALSE, 0'a (sıfır); TRUE, 1'e (bir) dönüştürülür.

float türünden dönüşüm

float 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 32 bitlik sistemlerde +/- 2.15e+9 = 2^31, 64 bitlik sistemlerde ise +/- 9.22e+18 = 2^63) 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!

Uyarı

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üşüm

Dizgelerin sayılara dönüşümü bölümüne bakınız.

Diğer türlerden dönüşüm

Dikkat

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.



float

Gerç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.

Uyarı

Kayan nokta hassasiyeti

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üşüm

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



string

Bir dizge string türünde bir sayıl değer olup bir dizi karakterden oluşur. Bu bakımdan her karakter tek bayt ile ifade edilir. Yani, olası karakter sayısı 256'dan ibarettir. Bu yüzden PHP Evrenkod için yerleşik desteğe sahip olamıyor. 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.

Sözdizimi

string türünde bir sayıl dört şekilde belirtilebilir:

Tek tırnaklı dizgeler

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 üç 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';
?>

Çift tırnaklı dizgeler

Eğer bir dizge çift tırnak (") içine alınmışsa PHP, aşağıdaki özel karakter öncelemlerini yorumlayacaktır:

Tersbölü ile öncelenmiş karakterler
Ö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.

Yorumlu metinler

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.

Uyarı

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.

Yorumsuz metinler

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ı: \x41

Bilginize:

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.

Değişken çözümleme

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.

Basit Sözdizimi

Çö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.

Karmaşık (kaşlı ayraçlı) sözdizimi

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ı:


I am bar.
I am bar.

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";
?>

Dizge erişimi ve karaktere göre değişiklik

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. 1 karakterden fazlasını elde etmek veya yer değiştirmek isterseniz substr() ve substr_replace() işlevlerini kullanabilirsiniz.

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

Uyarı

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.

Kullanışlı işlevler ve işleçler

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.

Dizgeye dönüşüm

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.

Dizgelerin sayılara dönüşümü

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 
"10.5";                // $foo float'tır (11.5)
$foo "-1.3e3";              // $foo float'tır (-1299)
$foo "bob-1.3e3";           // $foo integer'dir (1)
$foo "bob3";                // $foo integer'dir (1)
$foo "10 Small Pigs";       // $foo integer'dir (11)
$foo "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.



array

PHP'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.

Sözdizimi

Bir dizinin array() ile belirtilmesi

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(=> 513 => 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(=> 433256"b" => 12);

array(
=> 43=> 32=> 56"b" => 12);
?>
Uyarı

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ü).

Köşeli ayraçlarla atama ve değişiklik yapmak

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(=> 112 => 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(12345);
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
)

Kullanışlı işlevler

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(=> 'bir'=> 'iki'=> 'üç');
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.

Diziler ne yapar, ne yapmaz?

$foo[bar] niye yanlıştı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('display_errors'true);
ini_set('html_errors'false);
// Basit bir dizi:
$dizi = array(12);
$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ı";
?>

O halde bunun nesi kötü?

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.

Diziye dönüşüm

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 {
    private 
$A// Bu '\0A\0A' haline gelir.
}

class 
extends {
    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.

Karşılaştırma

Dizileri array_diff() işleviyle veya dizi işleçleri kullanılarak karşılaştırmak mümkündür.

Örnekler

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 - Döngü içinde elemen değiştirme

<?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(=> '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(23);
$dizi2 $dizi1;
$dizi2[] = 4// $dizi2 değişti,
              // $dizi1 hala array(2, 3)

$dizi3 = &$dizi1;
$dizi3[] = 4// şimdi $dizi1 ve $dizi3 aynı
?>


object

Nesne İlklendirme

Yeni 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üşüm

Eğ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'
?>


resource

resource 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üşüm

Açı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.

Özkaynakları serbest bırakmak

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.

Sözdizimi

NULL türünde, büyük-küçük harfe duyarlı olarak tek bir değer vardır: NULL.

<?php
$var 
NULL;
?>

Ayrıca, is_null() ve unset() işlevlerine de bakınız.

NULL türüne çarpıtım

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.



Callbacks

Callbacks can be denoted by callable type hint as of PHP 5.4. This documentation used callback type information for the same purpose.

Some functions like call_user_func() or usort() accept user-defined callback functions as a parameter. Callback functions can not only be simple functions, but also object methods, including static class methods.

Passing

A PHP function is passed by its name as a string. Any built-in or user-defined function can be used, except language constructs such as: array(), echo, empty(), eval(), exit(), isset(), list(), print or unset().

A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1.

Static class methods can also be passed without instantiating an object of that class by passing the class name instead of an object at index 0. As of PHP 5.2.3, it is also possible to pass 'ClassName::methodName'.

Apart from common user-defined function, create_function() can also be used to create an anonymous callback function. As of PHP 5.3.0 it is possible to also pass a closure to a callback parameter.

Örnek 1 Callback function examples

<?php 

// An example callback function
function my_callback_function() {
    echo 
'hello world!';
}

// An example callback method
class MyClass {
    static function 
myCallbackMethod() {
        echo 
'Hello World!';
    }
}

// Type 1: Simple callback
call_user_func('my_callback_function'); 

// Type 2: Static class method call
call_user_func(array('MyClass''myCallbackMethod')); 

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj'myCallbackMethod'));

// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Type 5: Relative static class method call (As of PHP 5.3.0)
class {
    public static function 
who() {
        echo 
"A\n";
    }
}

class 
extends {
    public static function 
who() {
        echo 
"B\n";
    }
}

call_user_func(array('B''parent::who')); // A
?>

Örnek 2 Callback example using a Closure

<?php
// Our closure
$double = function($a) {
    return 
$a 2;
};

// This is our range of numbers
$numbers range(15);

// Use the closure as a callback here to 
// double the size of each element in our 
// range
$new_numbers array_map($double$numbers);

print 
implode(' '$new_numbers);
?>

Yukarıdaki örneğin çıktısı:

2 4 6 8 10

Bilginize: In PHP 4, it was necessary to use a reference to create a callback that points to the actual object, and not a copy of it. For more details, see References Explained.

Bilginize:

call_user_func() ve call_user_func_array() gibi işlevlerle kayıt altına alınmış geriçağırım işlevleri, bir önceki geriçağırım işlevinde oluşmuş ve yakalanmamış bir istisna varsa çağrılmaz.



Bu belgede kullanılan sözde türler ve değişkenler

mixed

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

number

number anahtar sözcüğü, bir değiştirgenin integer veya float türünde değer kabul edeceğini belirtir.

callback

call_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 {
    public static function 
kimsin() {
        echo 
"A\n";
    }
}

class 
extends {
    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(15);

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

Bilginize:

call_user_func() ve call_user_func_array() gibi işlevlerle kayıt altına alınmış geriçağırım işlevleri, bir önceki geriçağırım işlevinde oluşmuş ve yakalanmamış bir istisna varsa çağrılmaz.

void

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

... (üçlü nokta)

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



Tür Dönüşümü

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 "10 Little Piggies"// $foo integer türündedir (15)
$foo "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.

Tür Çarpıtma

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:

  • (int), (integer) - integer türüne dönüşüm
  • (bool), (boolean) - boolean türüne dönüşüm
  • (float), (double), (real) - float türüne dönüşüm
  • (string) - string türüne dönüşüm
  • (array) - array türüne dönüşüm
  • (object) - object türüne dönüşüm
  • (unset) - NULL'a dönüşüm (PHP 5)

(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:




Değişkenler

İçindekiler


Temeller

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.

İpucu

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.



Öntanımlı Değişkenler

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.

Uyarı

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.



Değişken etki alanı

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.

global anahtar sözcüğü

İ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'];
}
?>

Duruk değişkenlerin kullanımı

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

Bilginize:

Duruk bildirimler derleme sırasında çözümlenir.

global ve static değişkenlere gönderim

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ı:


NULL
object(stdClass)#1 (0) {
}

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ı:


Duruk nesne: NULL
Duruk nesne: NULL

Duruk nesne: NULL
Duruk nesne: object(stdClass)#3 (1) {
["property"]=>
int(1)
}

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.



Değişken değişkenler

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ı:


Buna zam derler.
Buna zam derler.

Uyarı

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.



Dış Kaynaklı Değişkenler

HTML Formları (GET ve POST)

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

Bilginize:

Değişken isimlerindeki noktalar ve boşluklar altçizgi karakterine dönüştürülür. Örneğin, <input name="a.b" /> ifadesi $_REQUEST["a_b"] haline gelir.

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($_POSTtrue));
    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>

Gönder düğmesi değişken isimleri

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.

HTTP Çerezleri

PHP, » Netscape Belirtiminde tanımlandığı gibi HTTP çerezlerini şeffaf olarak destekler. Çerezler kullanıcıları izleyip tanımlamak amacıyla kullanıcının tarayıcısında veri saklamak için kullanılan bir yöntemdir. Çerezleri setcookie() işlevini kullanarak belirtebilirsiniz. Çerezler HTTP başlığının bir parçasıdır, bu nedenle setcookie() işlevi tarayıcıya herhangi bir çıktı gönderilmeden önce çağrılmak zorundadır. Bu kısıtlama header() işlevi için de geçerlidir. Çerez verisi $_COOKIE, $HTTP_COOKIE_VARS veya $_REQUEST gibi uygun çerez veri dizisinde bulunur. Ayrıntılar ve örnekler için setcookie() kılavuz sayfasına bakınız.

Eğer tek bir çerez değişkenine birden fazla değer atamak isterseniz, değişkeni bir dizi olarak atayabilirsiniz. Örneğin:

<?php
  setcookie
("Cerezim[foo]"'Deneme 1'time()+3600);
  
setcookie("Cerezim[bar]"'Deneme 2'time()+3600);
?>

Her ne kadar betiğinizde Cerezim tek bir dizi olsa da bu iki ayrı çerez oluşturacaktır. Eğer birden fazla değere sahip tek bir çerez atamak isterseniz, önce değer üzerinde serialize() veya explode() kullanmayı düşünün.

Yolu veya alan adı farklı olmadığı sürece aynı isimdeki bir çerez önceki çerezin üzerine yazılır. Böylece, isterseniz örneğin bir alışveriş sepeti uygulaması için bir sayaç tutabilir ve bunu karşıya aktarabilirsiniz.

Örnek 4 - setcookie() örneği

<?php
if (isset($_COOKIE['sayac'])) {
    
$sayac $_COOKIE['sayac'] + 1;
} else {
    
$sayac 1;
}
setcookie('sayac'$sayactime()+3600);
setcookie("Sepet[$sayac]"$maltime()+3600);
?>

Gelen değişken isimleri içindeki noktalar

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 belirlemek

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.




Sabitler

İçindekiler

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]*

İpucu

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.


Söz dizimi

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:

  • Bir sabit ismi $ imi ile başlamaz.
  • Sabitler basit bir atama ile değil, sadece define() işlevi kullanılarak tanımlanabilirler.
  • Sabitler, değişken etki alanı kurallarına bağlı olmaksızın her yerde tanımlanabilir ve her yerden erişilebilir.
  • Sabitler tanımlandıktan sonra yeniden tanımlanamaz ya da tanımsız duruma getirilemez.
  • Bir sabite sadece bir sayıl değer (boolean, integer, float veya string türünde bir değer) atanabilir.

Ö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;
?>

Bilginize:

Sabitlerin define() kullanılarak tanımlanmasının tersine, const anahtar sözcüğü ile tanımlanan sabitler derleme sırasında tanımlandıklarından en üst seviye etki alanında bildirilmiş olmalıdır. Yani bunlar işlevlerin, döngülerin veya if deyimlerinin içinde bildirilemez.

Ayrıca, Sınıf Sabitleri belgesine de bakınız.



Sihirli Sabitler

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:

Birkaç "sihirli" PHP sabiti
İ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

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



İşleçler

İçindekiler

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

İş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.

İşleç Öncelikleri
İlişkilendirme İşleçler Ek bilgi
yönsüz clone new clone ve new
soldan [ array()
yönsüz ++ -- arttırım/eksiltim
sağdan ~ - (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 
5// (3 * 3) % 5 = 4
$a true true 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.



Aritmetik İşleçler

Okulda öğrendiğiniz temel aritmetiği hatırlıyor musunuz? Bu işleçler tam da öyle çalışır.

Aritmetik İşleçler
Ö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.



Atama İşleçleri

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.

?>

Diziler içi bir değerin bir isimli anahtara atanması "=>" işleci kullanılarak gerçekleştirilir. Bu işlecin önceliği diğer atama işleçlerinin önceliğiyle aynıdır.

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 İşleçler

Bitsel işleçler, bir tamsayının içindeki belli bitleri 0 ya da 1 yaparlar.

Bitsel İşleçler
Ö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:
00000000000000000111011111111111
Keza E_NOTICE...
00000000000000000000000000001000
... ve ~ ile ters çevrilerek:
11111111111111111111111111110111
Son 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çin
00000000000000000000000000000001
ve
00000000000000000001000000000000
E_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(01248);
$dnm 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 "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ı

Uyarı

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 İşleçleri

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.

Karşılaştırma İşleçleri
Ö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 sayıyı bir dizge ile veya iki sayısal dizgeyi karşılaştırmak isterseniz dizge önce bir sayıya dönüştürülür ve karşılaştırma sayısal olarak yapılır. Bu kurallar ayrıca switch deyimine de uygulanır. === veya !== ile tür ve dolayısıyla değer karşılaştırıldığından böyle karşılaştırmalarda tür dönüşümü yapılmaz.

<?php
var_dump
(== "a"); // 0 == 0 -> doğru
var_dump("1" == "01"); // 1 == 1 -> doğru
var_dump("10" == "1e1"); // 10 == 10 -> doğru
var_dump(100 == "1e2"); // 100 == 100 -> 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.

Çeşitli Türlerin Karşılaştırılması
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.

Uyarı

Gerçek sayıların karşılaştırılması

float türlerinin dahili gösteriminden dolayı iki float sayının eşitliğine bakamazsınız.

Bu konuda daha ayrıntıl bilgi için float türünün belgesine bakınız.

Üç Terimli İşleç

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



Hata Denetim İşleçleri

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.

Uyarı

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



Çalıştırma İşleci

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_mode etkinse 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.



Arttırım ve Eksiltim İşleçleri

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.

Arttırım ve Eksiltim İşleçleri
Ö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.



Mantıksal İşleçler

Mantıksal İşleçler
Ö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)


Dizge İşleçleri

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



Dizi İşleçleri

Dizi İşleçleri
Ö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(=> "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.



Tür İşleçleri

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.




Denetim Yapıları

İçindekiler


Giriş

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

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.



else

Ç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/else if

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;

?>



Denetim yapıları için diğer sözdizimi

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;
?>

Bilginize:

Aynı denetim kümesi içinde karışık sözdizimi desteklenmemektedir.

Daha fazla örnek için while, for ve if cümleciklerine bakabilirsiniz.



while

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

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

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

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



foreach

(PHP 4, PHP 5)

foreach yapısı diziler üzerinde yineleme yapmayı kolaylaştırmaktadır. foreach yalnızca diziler ve nesneler 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:

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.

foreach dahili bir dizi göstericisi ile çalışması nedeniyle bunun döngü içinde değiştirilmesi beklenmedik sonuçlara yol açabilir.

$değer değişkeninin önüne & koyarak dizi elemanları üzerinde kolayca değişiklik yapılabilir. Böylece değer gönderimli hale gelir.

<?php
$dizi 
= array(1234);
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
?>

$değer değişkeninin gönderimli hale getirilebilmesi, sadece yinelenen dizi gönderimli (örn, bir değişkene) olabiliyorsa mümkündür, yani aşağıdaki kod çalışmaz:

<?php
foreach (array(1234) as &$value) {
    
$value $value 2;
}
?>

Uyarı

$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(12317);

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

$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(12345) as $v) {
    echo 
"$v\n";
}
?>

İç içe dizilerin list() ile ayrıştırılması

(PHP 5 >= 5.5.0)

PHP 5.5 ile yeni bir yetenek eklendi. Dizi dizileri üzerinde döngü oluşturmak ve list() işlevini değer olarak kullanmak suretiyle içteki diziyi döngü değişkenlerine atayarak onu da açmak artık mümkündür.

Örneğin:

<?php
$dizi 
= [
    [
12],
    [
34],
];

foreach (
$dizi as list($a$b)) {
    
// $a içteki dizinin ilk elemanını,
    // $b ikinci elemanını içerecektir.
    
echo "A: $a; B: $b\n";
}
?>

Yukarıdaki örneğin çıktısı:

A: 1; B: 2
A: 3; B: 4

İçteki dizinin gerekmeyen elemanlarını list() içinde içermeyebilirsiniz:

<?php
$dizi 
= [
    [
12],
    [
34],
];

foreach (
$dizi as list($a)) {
    
// Burada artık $b yok.
    
echo "$a\n";
}
?>

Yukarıdaki örneğin çıktısı:

1
3

list() için yeterli sayıda dizi elemanı yoksa bir uyarı üretilir.:

<?php
$dizi 
= [
    [
12],
    [
34],
];

foreach (
$dizi as list($a$b$c)) {
    echo 
"A: $a; B: $b; C: $c\n";
}
?>

Yukarıdaki örneğin çıktısı:


Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C:

Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C:



break

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

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.

Bilginize:

continue 0; ve continue 1; continue; deyimi ile aynıdır.

<?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 
"&nbsp;&nbsp;Orta<br />\n";
        while (
1) {
            echo 
"&nbsp;&nbsp;İç<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

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

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.

encoding

Her 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
?>

Dikkat

İ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 --enable-zend-multibyte etkindir.



return

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

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

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 - Supported Protocols and Wrappers 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.

Uyarı

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.

?>

Uyarı

Güvenlik uyarısı

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

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

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

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.




İşlevler

İçindekiler


Kullanıcı tanımlı işlevler

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 ($makefoofoo();

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



İşlev değiştirgeleri

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];
}
?>

Gönderimli değiştirge kullanımı

Ö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.
?>

Öntanımlı değiştirge değerleri

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 örneğin çıktısı:

Bir fincan orta şekerli kahve yapalım.
Bir fincan kahve yapalım.
Bir fincan az şekerli kahve yapalım.

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 örneğin çıktısı:

Warning: Missing argument 2 for yoğurtyap(), called in
/home/nilgun/dnm/php-dnm on line 7 and defined in
/home/nilgun/dnm/php-dnm on line 2
Bir kase çilekli  yoğurt yap.

Şimdi, yukarıdakini bununla karşılaştıralım:

Örnek 6 - Öntanımlı değiştirgelerin doğru kullanımı

<?php
function yoğurtyap($neli$nekadar"az")
{
    return 
"Bir kase $nekadar $neli yoğurt yap.\n";
}

echo 
yoğurtyap("çilekli");   // beklendiği gibi çalışır
?>

Yukarıdaki örneğin çıktısı:

Bir kase az çilekli yoğurt yap.

Bilginize: PHP 5'den itibaren, öntanımlı değerler gönderimli aktarılabilmektedir.

Değiştirge sayısı değişken işlevler

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.



Dönen değerler

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.

Bilginize:

return belirtilmezse NULL değeri döner.

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



Değişken işlevler

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().



Yerleşik işlevler

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

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

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




Sınıflar ve Nesneler

İçindekiler


Giriş

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.

İpucu

Ayrıca Kullanıcı Alanı İsimlendirme Kılavuzu belgesine de bakınız.



Temel Kavramlar

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


Özellikler

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

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



Sınıf Sabitleri

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.



Özdevinimli Sınıf Yükleme

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:

5.3.0 öncesinde, __autoload işlevinde oluşan istisnalar catch bloğu ile yakalanamaz, dolayısıyla ölümcül hata ile sonuçlanır. 5.3.0 ve sonrasında ise, bir tane olması şartıyla yakalanabilir. Özel bir istisna yakalanacaksa özel istisna sınıfı mevcut olmalıdır. __autoload işlevi özel istisna sınıflarını ardışık (iç içe) olarak yüklemek için kullanılabilir.

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

Örnek 3 - 5.3.0 ve sonrasında istisnalı özdevinimli yükleme

Bu örnekte bir istisna yakalanmakta ve try/catch kullanımı gösterilmektedir.

<?php
function __autoload($name) {
    echo 
"$name yüklenmek isteniyor.\n";
    throw new 
Exception("$name yüklenemedi.");
}

try {
    
$obj = new YüklenemezSınıf();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

Yukarıdaki örneğin çıktısı:

YüklenemezSınıf yüklenmek isteniyor.
YüklenemezSınıf yüklenemedi.

Örnek 4 Autoloading with exception handling for 5.3.0+ - Missing custom exception

This example throws an exception for a non-loadable, custom exception.

<?php
function __autoload($name) {
    echo 
"Want to load $name.\n";
    throw new 
MissingException("Unable to load $name.");
}

try {
    
$obj = new NonLoadableClass();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

Yukarıdaki örneğin çıktısı:

Want to load NonLoadableClass.
Want to load MissingException.

Fatal error: Class 'MissingException' not found in testMissingException.php on line 4



Kurucular ve Yıkıcılar

Kurucular

void __construct ([ mixed $değiştirge [, $... ]] )

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.

Diğer yöntemlerin tersine, __construct() ebeveyn __construct() yöntemindekilerden farklı değiştirgelerle kullanılmaya çalışıldığında PHP E_STRICT seviyesinden bir hata iletisi üretmeyecektir.

PHP 5.3.3 itibariyle, bir isim alanlı sınıf isminin son elemanı ile aynı isimdeki yöntemler artık kurucu olarak ele alınmayacaktır. Bu değişiklik isim alanlı olmayan sınıfları etkilemez.

Örnek 2 - İsim alanlı sınıflarda kurucular

<?php
namespace Foo;
class 
Bar
{
    public function 
Bar()
    {
        
// PHP 5.3.0-5.3.2'de kurucu olarak ele alınır
        // PHP 5.3.3 itibariyle sıradan bir yöntem olarak ele alınır
    
}
}
?>

Yıkıcılar

void __destruct ( void )

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 başka bir gönderim yoksa veya nesne kapanma sırasında açıkça yok edildiği anda çalıştırılacaktır.

Örnek 3 - 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.

Betiğin icrası exit() kullanılarak durdurulsa bile yıkıcı çağrılacaktır. exit() işlevinin bir yıkıcı içersinde çağrılması kalan kapanma yordamlarının icrasını engelleyecektir.

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.



Görünürlük

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.

Özelliklerin Görünürlüğü

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 (public yerine) 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.

Yöntem Görünürlüğü

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

?>



Object Inheritance

Inheritance is a well-established 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.

Bilginize:

Unless autoloading is used, then classes must be defined before they are used. If a class extends another, then the parent class must be declared before the child class structure. This rule applies to classes that inherit other classes and interfaces.

Ö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