Copyright © 1997 - 2009 PHP Belgelendirme Grubu. Bu belge, sadece Creative Commons Attribution lisansının 3.0 veya sonraki sürümlerinin koşullarına bağlı kalınarak dağıtılabilir. Creative Commons Attribution lisansının 3.0 sürümü bu kılavuzla birlikte dağıtılmaktadır. Şu anki son sürümü » http://creativecommons.org/licenses/by/3.0/ adresinden temin edilebilir.
Bu belgenin kısmen veya tamamen, değiştirilerek veya aynen yayınlanması veya dağıtılması ile ilgileniyorsanız ve bu konuda sorularınız varsa, lütfen » doc-license@lists.php.net adresinden telif hakkı sahiplerine yazınız. Bu adres içeriği halka açık olarak arşivlenen bir eposta listesine aittir.
PHP, "PHP: Hypertext Preprocessor" sözcüklerinin baş harfleriyle temsil edilen HTML içine gömülebilir açık kaynak kodlu, genel amaçlı, özellikle site geliştirmeye uygun bir betik dilidir. Dil yapısının önemli bir kısmını C, Java ve Perl gibi dillerden almış, kendisine has özelliklerle bu yapıyı pekiştirmiş, kolay öğrenilen bir dildir. Dilin ana amacı, site geliştiricilerinin devingen sayfalar oluşturmasını çabuklaştırmaksa da PHP ile çok daha fazlasını yapabilirsiniz.
Bu kılavuz temel olarak bir işlev başvuru kılavuzudur. Fakat bunun yanında bir dil kılavuzu, PHP'nin önemli özelliklerinin bazılarının açıklamaları ile tamamlayıcı bazı bilgiler de içermektedir.
Bu kılavuzu çeşitli biçemlerde » http://www.php.net/download-docs.php adresinden temin edebilirsiniz. Bu kılavuzun nasıl geliştirildiğiyle ilgili daha ayrıntılı bilgi edinmek için eklerdeki 'Kılavuz Hakkında' bölümüne bakabilirsiniz. PHP'nin tarihçesi ile ilgileniyorsanız onu da ek bölümler arasında bulabilirsiniz.
Kılavuzun ön sayfasında şu anda en etkin kişileri ön plana çıkartıyoruz, ancak çalışmamıza halen katkıda bulunmakta olan birçok kişi ve geçmişte önemli katkılarda bulunmuş birçok insan var. Kılavuz sayfalarında kullanıcı önerileri üzerinden katılımda bulunarak destek veren birçok isimsiz kişi var. Bu kişiler düzenli olarak buradaki listelere ekleniyor, tüm katılımcılara destekleri için müteşekkiriz. Aşağıdaki listelerde isimler alfabetik olarak sıralanmıştır.
Burada yer alan katılımcılar kılavuzun içeriğine yaptıkları ve/veya yapmakta oldukları eklemelerden dolayı takdir edilmelidirler: Bill Abt, Jouni Ahto, Alexander Aulbach, Daniel Beckham, Stig Bakken, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Rafael Martinez, Rick McGuire, Yasuo Ohgaki, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Michael Wallner, Lars Torben Wilson, Jim Winstead, Jeroen van Wolffelaar ve Andrei Zmievski.
Burada yer alan katılımcılar kılavuzun düzenlenmesi çalışmasında kayda değer katkılarda bulunmuşlardır: Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe ve Egon Schmid.
Şu anki en etkin geliştiriciler: Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda ve Maciek Sokolewicz.
Bu kişiler kullanıcı önerilerinin yönetiminde çok ciddi çaba sarfetmişlerdir: Mehdi Achour, Daniel Beckham, Friedhelm Betz, Victor Boivie, Jesus M. Castagnetto, Nicolas Chaillan, Ron Chmara, Sean Coates, James Cox, Vincent Gevers, Sara Golemon, Zak Greant, Szabolcs Heilig, Oliver Hinckel, Hartmut Holzgraefe, Etienne Kneuss, Rasmus Lerdorf, Matthew Li, Andrew Lindeman, Aidan Lister, Hannes Magnusson, Maxim Maletsky, Bobby Matthis, James Moore, Philip Olson, Sebastian Picklum, Derick Rethans, Sander Roobol, Damien Seguy, Jason Sheets, Tom Sommer, Jani Taskinen, Yasuo Ohgaki, Jakub Vrana, Lars Torben Wilson, Jim Winstead, Jared Wyles ve Jeroen van Wolffelaar.
PHP (açılımı PHP: Hypertext Preprocessor) geniş bir kitle tarafından kullanılan, özellikle sanal yöreler üzerinde geliştirme için tasarlanmış HTML içine gömülebilen bir betik dilidir.
Tamam da, bu tam olarak ne anlama gelmektedir? Bir örnek:
Örnek 1 - Başlangıç olarak bir örnek
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Örnek</title>
</head>
<body>
<?php
echo "Merhaba, ben bir PHP betiğiyim!";
?>
</body>
</html>
Bir PHP betiğinin Perl ya da C gibi dillerden ne kadar farklı bir yapıda
olduğuna dikkat edin. HTML kodu oluşturmak için bir sürü kod
yazacağınıza, istediğiniz işi yapan bir PHP kodu yazıp onu HTML kodunun
içine gömüyorsunuz (bu örnekte, yapılan iş ekrana yazı yazmak). PHP kodu
<?php ve
?> özel başlangıç ve bitiş etiketleri arasına
yazılır. Bu etiketler "PHP kipine" rahatlıkla girip çıkabilmenizi
sağlarlar.
PHP'yi Javascript gibi kullanıcı tarafında çalışan dillerden ayıran, sunucu tarafında çalıştırılıyor olmasıdır. Yukardaki örnekteki kodu kendi sunucunuzda çalıştırırsanız, sitenize bağlanan kullanıcılar kodu göremeyecekler ve müdahale edemeyecekler, yalnızca sonucu görebileceklerdir. Dilerseniz HTTP sunucunuzu bütün HTML dosyalarınızı PHP dosyası olarak görüp işleyecek hale bile getirebilirsiniz. Buna rağmen kullanıcılar sizin gerçekte sunucu taraflı bir uygulama kullandığınızı fark edemeyebilirler.
PHP kullanmanın en güzel yanlarından biri, yeni kullanıcılar için öğreniminin oldukça kolay olması ve aynı zamanda profesyonel kullanıcılar için ileri seviyede özellikler içermesidir. PHP'nin uzun özellikler listesini okumaktan korkmayın. Kısa sürede PHP ile programlamaya başlayabilir ve birkaç saat içersinde basit programlar yazmaya başlayabilirsiniz.
PHP'nin gelişimi sunucu-taraflı programlamaya odaklanmışsa da, çok daha fazlasını yapmanıza olanak tanıyan araçlara da sahiptir. PHP neler yapabilir? bölümünde bu araçlar hakkında daha fazla bilgiye ulaşabilirsiniz. Eğer yalnızca site programlama ile ilgileniyorsanız, Basit bir eğitmen bölümünden devam edebilirsiniz.
Her şeyi. PHP temel olarak sunucu-taraflı programlamaya odaklanmıştır, bu nedenle CGI uygulamalarının yaptığı her şeyi, örneğin formdan veri toplama, devingen sayfa içeriği oluşturma, ya da çerez alıp gönderme gibi işlemleri yapabilirsiniz. Ancak PHP bunlardan çok daha fazlasını yapabilecek yetenektedir.
PHP betiklerinin kullanıldığı başlıca üç alan vardır.
PHP bütün büyük işletim sistemlerinde, Linux, birçok Unix türevi (HP-UX, Solaris, OpenBSD vb.), Microsoft Windows, Mac OS X, RISC OS dahil olmak üzere çok çeşitli platformlarda çalışabilir. PHP benzer biçimde bugün yaygın biçimde kullanılan HTTP sunucularının büyük kısmını destekler. Bunlara Apache, Microsoft IIS, Microsoft PWS, Netscape ve iPlanet Sunucuları, Oreilly Website Pro, Caudium, Xitami, OmniHTTPD ve daha birçok sunucuyu örnek gösterebiliriz. Bu sunucuların çoğunluğunda PHP modül olarak kullanılabilir, geri kalanlarında da CGI standardı kullanılarak PHP bir CGI işleyici olarak çalıştırılabilir.
Sonuç olarak, PHP ile işletim sistemi ve HTTP sunucusu seçme özgürlüğüne sahipsiniz. Dahası, hangi programlama yöntemini kullanacağınıza, işlevsel yaklaşımı mı yoksa nesne yönelimli yaklaşımı mı yoksa her ikisini birden mi kullanacağınıza kendiniz karar verebilirsiniz. Bütün NYP (nesne yönelimli programlama) özellikleri PHP 4'te varolmasa da, birçok kod kütüphanesi ve büyük uygulama (PEAR kütüphanesi dahil) NYP kullanılarak yazılmıştır.
PHP'nin yetenekleri yalnızca HTML çıktı üretmekle sınırlı değildir. PHP'nin yetenekleri arasında resim çıktısı üretebilme, PDF oluşturabilme ve hatta Flash filmleri oluşturabilme (libswf ve Ming kullanarak) bulunmaktadır. Aynı şekilde XHTML ya da XML gibi her tür metin tabanlı dosyayı oluşturabilmeniz mümkündür. PHP bu dosyaları özdevinimli olarak oluşturabilir ve ekrana yazdırmanın yanında sizin için dosya sisteminde saklayabilir, böylece devingen içeriğiniz için sunucu-taraflı bir depo sistemini kullanımınıza sunabilir.
PHP'nin en güçlü ve en çok üstünde durulan özelliklerinden biri, sahip olduğu geniş ve gelişmiş veritabanı desteğidir. PHP ile veritabanı bağlantılı site sayfaları oluşturmak son derece basittir. Aşağıda desteklenen veritabanlarının listesi bulunmaktadır:
Bunların haricinde PDO adı verilen bir veritabanı soyutlama eklentisiyle, bu eklenti tarafından desteklenen veritabanlarını şeffaf olarak kullanabilirsiniz. PHP, ek olarak ODBC'yi, yani Açık Veritabanı Bağlantı standardını da destekler, bu şekilde ODBC'yi destekleyen tüm veritabanları ile iletişim kurabilirsiniz.
- Adabas D
- dBase
- Empress
- FilePro (salt okunur)
- Hyperwave
- IBM DB2
- Informix
- Ingres
- InterBase
- FrontBase
- mSQL
- Direct MS-SQL
- MySQL
- ODBC
- Oracle (OCI7 ve OCI8)
- Ovrimos
- PostgreSQL
- SQLite
- Solid
- Sybase
- Velocis
- Unix dbm
PHP, farklı hizmetlerle LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (Windows için) ve daha sayısız protokol aracılığıyla iletişim kurabilecek bir altyapıya da sahiptir. Hazır modüllerin haricinde ham ağ soketleri açıp bu soketler üzerinden istediğiniz bütün protokollerle çalışabilirsiniz. PHP, WDDX üzerinden sanal olarak sanal doku üzerinde hangi dilde yazılmış olursa olsun tüm uygulamalarla haberleşebilir. Ayrıca Java nesnelerinin oluşturulabilmesi ve şeffaf biçimde PHP nesneleri olarak kullanılabilmeleri önemli bir diğer özelliktir. Uzaktaki nesnelere erişim için CORBA uzantısı, yine PHP'nin sahip olduğu özellikler arasındadır.
PHP oldukça faydalı belge işleme özelliklerine sahiptir. Bu yelpaze Genişletilmiş POSIX ya da Perl düzenli ifade komutlarından XML dosyalarını okumaya kadar uzanır. XML dosyalarının okunması ve erişimi için SAX ve DOM standartlarını destekler. XSLT eklentisi ile XML belgeler dönüştürülebilir. PHP 5 tüm XML uzantılarını libxml2 tabanında tek bir standartta toplamış ve SimpleXML ile XMLReader desteğini bünyesine katarak sunduğu imkan yelpazesini genişletmiştir.
Bunların dışında, mnoGoSearch arama motoru, IRC ağ geçidi uzantıları, birçok sıkıştırma aracı (gzip, bz2) için yardımcı araçlar, takvim araçları, dil çeviri işlevleri yine PHP'nin sunmakta olduğu ilginç eklentilerden bazılarıdır.
Sizin de görebildiğiniz gibi bu sayfa PHP'nin sunabileceği bütün özellikleri ve faydaları anlatabilmek için yeterli değil. Yapılandırma ve Kurulum bölümünde ve İşlev başvuru kılavuzunda listelenen eklentilerin başlangıç bölümlerindeki açıklamalardan her bir eklenti için daha fazla bilgiye ulaşabilirsiniz.
Bu bölümde PHP ile ilgili en temel bilgileri kısa ve basit bir eğitmen üzerinde anlatmak istiyoruz. Bu metin yalnızca PHP ile devingen site sayfaları geliştirmeyi ele alır, ancak PHP'nin yeteneği yalnızca site sayfaları oluşturmakla sınırlı değildir. Daha fazla bilgi için PHP'nin yapabildikleri bölümünü inceleyebilirsiniz.
PHP tarafından etkinleştirilen site sayfaları normal HTML sayfaları gibidir ve bu sayfaları normal HTML sayfaları için kullandığınız yöntemlerle oluşturabilir ve düzenleyebilirsiniz.
Bu eğitmen süresince HTTP sunucunuzun PHP desteğinin etkinleştirilmiş olduğunu ve tüm .php uzantılı dosyaların PHP tarafından yorumlandığını varsayacağız. Çoğu sunucuda, bu uzantı PHP dosyaları için öntanımlı dosya uzantısıdır, ancak emin olmak için sunucunuzun yöneticisinden doğru bilgiyi edinebilirsiniz. Sunucunuz PHP'yi destekliyorsa, başka hiçbir şeye ihtiyacınız yok demektir. Yalnızca .php uzantılı dosyalarınızı oluşturmanız sunucunuzun belge dizinlerine koymanız, sunucunuzun bu dosyayı sizin için özdevinimli olarak işleme koyması için yeterli olacaktır. Herhangi bir şeyi derlemeniz ya da fazladan bir araç kurulumu yapmanız gerekmemektedir. PHP tarafından etkinleştirilen dosyaları yeni bir tür HTML dosyası olarak kafanızda canlandırabilirsiniz. Düşünün ki, artık HTML dosyasının içine sihirli birtakım etiketler koyabiliyor ve bu etiketler sayesinde istediğiniz her tür işlemi gerçekleştirebiliyorsunuz. Site barındırma hizmeti verenlerin çoğu PHP desteği sunmaktadır, ancak sizinki sunmuyorsa, » PHP Bağlantıları bölümünden PHP hizmeti sunan barındırma sitelerinin adreslerine ulaşabilirsiniz.
Diyelim ki çok değerli olan band genişliğinizi boşa harcamamak ve kendi sisteminizde yerel olarak geliştirme yapmak istiyorsunuz. Bu durumda, » Apache gibi bir HTTP sunucusunu ve elbette » PHP'yi indirmeniz ve kurmanız gerekecektir. Bu ikilinin yanında, » MySQL gibi bir veritabanını da indirip kurmanız iyi olacaktır.
Bu üçlüyü tek tek kumak yerine daha basit bir yol izleyebilirsiniz. Kılavuzumuz PHP için kurulum bilgileri (HTTP sunucunuzun halihazırda kurulu olduğunu öngörür) bölümüne sahiptir. PHP'yi kendiniz kurmakta sorun yaşarsanız, sorularınızın çözümü için » kurulum posta listesi'ne başvurabilirsiniz. Daha basit bir yoldan gitmek istiyorsanız, işletim sisteminize uygun olan » ön yapılandırmalı paketleri seçebilir ve tüm bu araçları bir kaç fare tıklamasıyla özdevinimli olarak yükleyebilirsiniz. MacOSX, Linux ve Windows dahil olmak üzere birçok işletim sistemine PHP destekli bir HTTP sunucusu kurmak oldukça kolaydır. Linux üzerinde, » rpmfind ve » PBone araçlar RPM dosyalarını bulmakta size yardımcı olacaklardır. Debian için ise » apt-get sayfasını ziyaret edebilirsiniz.
merhaba.php isimli bir dosya oluşturun ve HTML sunucunuzun belge kök dizinine (DOCUMENT_ROOT) aşağıdaki içerikle kaydedin:
Örnek 1 - İlk PHP betiğimiz: merhaba.php
<html>
<head>
<title>PHP Denemesi</title>
</head>
<body>
<?php echo '<p>Merhaba Dunya</p>'; ?>
</body>
</html>
Tarayıcınızı kullanarak HTTP sunucunuzun adresine erişebilirsiniz, sunucunuzun alan adının sonuna /merhaba.php eklemeniz yeterli olacaktır. Yerel olarak geliştirme yaparken bu URL http://localhost/merhaba.php ya da http://127.0.0.1/merhaba.php gibi bir şey olacaktır, ancak bu HTTP sunucusunun yapılandırma ayarlarına bağlıdır. Eğer her şey düzgün yapılandırılmışsa, bu dosya PHP tarafından işlenecek ve aşağıdaki çıktı tarayıcınıza gönderilecektir:
<html> <head> <title>PHP Denemesi</title> </head> <body> <p>Merhaba Dunya</p> </body> </html>
Bu program gördüğünüz gibi son derece basittir ve esasında böyle bir sayfa oluşturmak için PHP'ye gereksiniminiz yoktur. Görüntülenen: PHP'nin echo() deyimi kullanılarak elde edilen Merhaba Dünya cümlesidir. Bu dosyanın hiçbir şekilde çalıştırılabilir olmasına ya da özel bir türde olmasına ihtiyaç duyulmadığına dikkat edin. Sunucu dosyanın PHP tarafından işlenmesi gerektiğini bilir çünkü dosyaya ".php" uzantısını tanımladınız. Sunucu bu uzantıya sahip dosyaları PHP'ye aktaracak biçimde yapılandırılmıştır. Bunu size birtakım özel etiketlerle birçok ilginç işlem yapmanızı sağlayan bir tür HTML dosyası olarak düşünebilirsiniz.
Bu örneği denediyseniz ve hiçbir çıktı alamadıysanız, sizden dosyayı indirmenizi istediyse ya da dosyanın tüm içeriğini metin olarak ekranda gördüyseniz, büyük ihtimalle sunucunuzun PHP desteği etkinleştirilmemiştir ya da sunucunuz doğru yapılandırılmamıştır. Yöneticinizden kılavuzdaki Kurulum bölümünü kullanarak PHP'yi etkinleştirmesini rica edebilirsiniz. Yerel olarak geliştirme yapıyorsanız, kurulum bölümünü okuyarak herşeyin doğru yapılandırıldığından emin olun. Size çıktıyı sağlayan sunucudaki dosyaya http üzerinden erişmeye çalışıp çalışmadığınızı kontrol edin. Dosyayı doğrudan kendi dosya sisteminizden çağırıyorsanız, PHP tarafından işlenmeyecektir. Sorun her şeye rağmen devam ediyorsa, » PHP desteği alma yöntemlerini kullanmakta tereddüt etmeyin.
Bu örneğin amacı özel PHP etiketi biçemini göstermektir. Örnekte <?php ile PHP etiketinin başlangıcını belirledik. Sonra PHP komutunu yazdık ve kapanış etiketi ?> kullanarak PHP kipinden çıktık. Bir HTML dosyasında bu yöntemi kullanarak istediğiniz yerde PHP kipine girip çıkabilirsiniz. Daha fazla bilgi için, kılavuzun temel PHP sözdimi bölümünü okuyabilirsiniz.
Bilginize: Satırsonları hakkında
Satırsonu karakterlerinin HTML içinde bir önemi yoktur, bununla birlikte HTML kodunun göze hoş görünmesi için satırsonu karakterlerini kullanmak gerekir. ?> kapama etiketinin hemen ardından gelen satırsonu karakterini PHP silecektir. Dosyanın içine çok sayıda PHP bloğu koyarsanız veya hiçbir şey çıktılamayan betikleri dosyaya dahil etmeniz durumunda bu çok işe yarar. Ancak bu biraz kafa karıştırıcı olabilir. ?> kapama etiketinden sonra bir satırsonu karakterinin çıktılanmasını zorlamak isterseniz, ya kapama etiketinden sonra bir boşluk bırakıp onun ardına satırsonu karakterini koyun ya da PHP bloğunun son echo/print deyiminin sonuna bir satır sonu karakteri ekleyin.
Bilginize: Metin Düzenleyiciler Hakkında
PHP dosyalarını yaratabileceğiniz, düzenleyebileceğiniz ve yönetebileceğiniz birçok metin düzenleyici ve Bütünleşik Geliştirme Ortamı (IDE) bulunmaktadır. Bu araçların bir kısmı » PHP Düzenleyicileri Listesi bölümünde listelenmiştir. Sizin önermek istediğiniz bir düzenleyici varsa, lütfen yukarıdaki sayfayı ziyaret edin ve sayfa idarecisinden önermek istediğiniz düzenleyiciyi bu listeye eklemesini rica edin. Söz dizimi vurgulaması olan bir düzenleyici size yardımcı olabilir.
Bilginize: Kelime İşlemciler Hakkında
StarOffice Writer, Microsoft Word ve Abiword gibi kelime işlemciler PHP dosyalarını düzenlemek için uygun değillerdir. Eğer bu deneme betiği için bunlardan birini kullanmak istiyorsanız, dosyanın salt metin olarak kaydedildiğinden emin olun, aksi takdirde PHP'nin betiği okuması ve çalıştırması mümkün olmayacaktır.
Bilginize: Windows Not Defteri Hakkında
PHP betiklerinizi Windows Not Defteri ile yazıyorsanız, dosyalarınızın .php uzantısı ile kaydedildiğinden emin olmalısınız (Notepad birazdan bahsedeceğimiz önlemleri almadığınız takdirde dosyaların sonuna özdevinimli olarak .txt uzantısı ekler). Dosyayı kaydetmek istediğinizde, sizden dosyanız için bir isim belirtmeniz istenecektir. Dosya ismini tırnak içinde (örn. "hello.php") yazın. Bundan başka, 'Kaydet' iletişim kutusunun içindeki 'Metin Belgeleri' açılır menüsüne tıkladıktan sonra buradaki değeri "Tüm Dosyalar" olarak değiştirin. Artık dosya isminizi tırnak işareti kullanmadan yazabilirsiniz.
Artık çalışır bir PHP betiğini başarıyla oluşturduğunza göre, PHP betiklerinin en ünlüsünü oluşturma zamanı geldi demektir! phpinfo() işlevini çalıştıracağız ve sisteminiz ve yapılandırmanızla ilgili öntanımlı değişkenler, yüklü PHP modülleri ve yapılandırma ayarları gibi konularda faydalı birçok bilgiye ulaşacağız. Bu önemli bilgiler için biraz vakit ayırmanızı ve bunları incelemenizi öneririz.
Örnek 2 - PHP ile sistem bilgisine ulaşmak
<?php phpinfo(); ?>
Şimdi daha işe yarar bir şey yapalım. Ziyaretçilerinizin hangi tarayıcıyı kullandığını tespit edelim. Bunun için, ziyaretçinizin tarayıcısı tarafından HTTP isteği ile birlikte gönderilen kullanıcı aracısı dizgesine bakacağız. Bu bilgi bir değişkende saklanır. Değişkenler PHP'de her zaman dolar işareti ile başlar. Bizim şu an için ilgilendiğimiz değişken $_SERVER['HTTP_USER_AGENT']'tir.
Bilginize: $_SERVER PHP kullanımına ayrılmış özel bir değişken olup HTTP sunucusunun tüm bilgilerini içerir. Bu tür değişkenlere süper küreseller denir. Bu konuda daha ayrıntılı bilgiyi Süper küreseller bölümünde bulabilirsiniz. Bu özel değişkenler PHP » 4.1.0 sürümünden itibaren kullanılmaya başlanmıştır. Daha öncesinde, $HTTP_SERVER_VARS gibi eski $HTTP_*_VARS dizileri kullanılmaktaydı. Ömrünü doldurmuş olsa da, bu eski tarz değişkenler hala kullanılabilmektedir. (Eski kod bölümüne de bakınız.)
Bu değişkenin değerini görüntülemek için yapmanız gereken:
Örnek 1 - Bir değişkeni (dizi öğesini) yazdırmak
<?php echo $_SERVER['HTTP_USER_AGENT']; ?>
Bu betiğin çıktısı şöyle bir dizge olabilirdi:
PHP'de birçok farklı değişken türü mevcuttur. Yukardaki örnekte bir diziye ait bir öğeyi yazdırdık. Diziler çok kullanışlı olabilirler.
$_SERVER PHP tarafından kullanımınıza özdevinimli olarak sunulan bir değişkendir. Kullanım kılavuzunun Öntanımlı Değişkenler bölümünden tümünün listesine ulaşabilirsiniz ya da önceki örnekte kullandığımız phpinfo() işlevi ile üretilen çıktıya bakarak bütün listeye ulaşabilirsiniz.
PHP etiketinin içine birden çok PHP komutu koyabilir ve tek bir echo komutundan daha fazlasını yapan küçük kod blokları oluşturabilirsiniz. Örneğin, ziyaretçinizin Internet Explorer kullanıp kullanmadığını şöyle öğrenebilirsiniz:
Örnek 2 - Denetim yapılarının ve işlevlerin kullanım örneği
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
echo 'Internet Explorer kullanmaktasınız.<br />';
}
?>
Bu betiğin çıktısı şöyle olabilirdi:
Internet Explorer kullanmaktasınız.<br />
Burada birkaç yeni kavramı devreye soktuk. Bir if deyimimiz var. Eğer C dilinde kullanılan temel sözdizimine aşinalığınız varsa, bu kullanım size tanıdık gelecektir. Aksi takdirde, giriş düzeyinde bir PHP kitabı almanız ve ilk birkaç bölümünü okumanız ya da kılavuzun Dil Başvuru Kılavuzu bölümünü okumanız faydalı olacaktır.
Devreye soktuğumuz ikinci kavram, strpos() işlevi ile yaptığımız çağrı oldu. strpos(), bir dizgeyi başka bir dizgenin içinde arayan yerleşik bir PHP işlevidir. Burada 'MSIE' dizgesini (iğne) $_SERVER['HTTP_USER_AGENT'] içinde (samanlık) arıyoruz. Eğer iğne samanlıkta bulunursa işlev iğnenin konumunu samanlığın başlangıcına göreli olarak döndürür. Aksi takdirde FALSE döner. if ifadesinin sonucu TRUE olduğu takdirde FALSE dönmez ve kaşlı ayraçlar arasındaki kod çalıştırılır. Aksi takdirde kod çalıştırılmaz. If, else gibi denetim yapıları ile strtoupper() ve strlen() gibi işlevleri kullanarak siz de benzer örnekler yazabilirsiniz. İlgili her kılavuz sayfası aynı zamanda örnekler de içermektedir. Bu işlevleri nasıl kullanmanız gerektiğinden emin değilseniz, kılavuzdaki bir işlev tanımı nasıl okunur ve PHP işlevleri bölümlerini okuyabilirsiniz.
Bunu bir adım öteye taşıyabilir ve bir PHP bloğunun tam ortasındayken bile PHP kipine nasıl girip çıkabileceğimize bakabiliriz:
Örnek 3 - HTML ve PHP kiplerini karıştırmak
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
?>
<h3>strpos() false olmayan bir değer döndürmelidir</h3>
<p>Internet Explorer kullanmaktasınız</p>
<?php
} else {
?>
<h3>strpos() false döndürmelidir</h3>
<p>Internet Explorer kullanmıyorsunuz</p>
<?php
}
?>
Bu betikten elde edilebilecek sonuçlardan biri:
<h3>strpos() false olmayan bir değer döndürmelidir</h3> <p>Internet Explorer kullanmaktasınız</p>
Bir çıktı üretmek için PHP echo komutunu kullanmak yerine, PHP kipinden çıktık ve sadece düz HTML gönderdik. Burada dikkat edilmesi gereken önemli nokta, betiğin mantıksal akışının değişmiyor olmasıdır. strpos() işlevinden edinilen sonuca göre HTML bloklarından yalnızca biri görüntüleyiciye gönderilmektedir. Başka bir deyişle, bu işleyiş MSIE değişkeninin bulunup bulunmamasına bağlıdır.
PHP'nin en güçlü özelliklerinden biri HTML formlarına yaklaşım biçimidir. Bilinmesi gereken ilk önemli durum, form içindeki tüm elemanların PHP tarafından özdevinimli olarak kullanılabilir olacağıdır. PHP ile formların kullanımı ve daha ayrıntılı bilgi için Dış kaynaklı değişkenler bölümünü okuyabilirsiniz. Örnek bir HTML formu:
Örnek 1 - Örnek bir HTML formu
<form action="action.php" method="post"> <p>İsminiz: <input type="text" name="isim" /></p> <p>Yaşınız: <input type="text" name="yaş" /></p> <p><input type="submit" /></p> </form>
Bu formda özel hiçbir şey yoktur. Hiçbir özel etiket içermeyen düz bir HTML formudur. Kullanıcı formu doldurup gönder tuşuna bastığında, action.php sayfası çağrılır. Bu dosyaya aşağıdakileri yazabiliriz:
Örnek 2 - Formdan veri yazdırmak
Merhaba <?php echo htmlspecialchars($_POST['isim']); ?>.
Siz <?php echo (int)$_POST['yaş']; ?> yaşındasınız.
Bu betikten elde edilecek örnek çıktı:
Merhaba Ahmet. Siz 22 yaşındasınız.
htmlspecialchars() ve (int) kısımları harcinde yapılan iş oldukça açık. htmlspecialchars() işlevi HTML'ye özel karakterlerin doğru şekilde kodlandığından emin olunmasını sağlar, dolayısıyla başkaları sayfanıza dışardan HTML etiketleri veya Javascript yerleştiremez. Yaş alanınında ise değerin bir tamsayı olması gerektiğini bildiğimiz için değeri integer türüne dönüştürmekle özdevinimli olarak bu alana girilmesi olası başı boş karakterlerden de kurtulmuş olduk. Ayrıca, bunun PHP'de sizin yerinize özdevinimli olarak yapılmasını sağlamak için süzgeç eklentisini de kullanabilirdiniz. $_POST['isim'] değişkeni ve $_POST['yaş'] değişkenleri sizin yerinize PHP tarafından özdevinimli olarak oluşturulur. Daha önce $_SERVER süper küresel değişkenini kullanmıştık, yukarıda ise tüm POST verisini içeren $_POST süper küresel değişkenini tanımış olduk. Formumuz için tanımlı yöntemin POST oluşuna dikkat edin. GET yöntemini kullanmış olsaydık, form bilgilerimiz $_GET süper küresel değişkenine atanmış olacaktı. Bunların haricinde, istemciden gelen verinin hangi kaynaktan geldiği sizin için önemli değilse $_REQUEST süper küreselini de kullanabilirdiniz. Bu değişken GET, POST ve COOKIE verilerinin birleşiminden oluşur. Daha fazla bilgi için import_request_variables() işlevini inceleyebilirsiniz.
PHP içinde XForms öğelerini de kullanabilirsiniz, ancak başlangıç aşamasında çok iyi desteklenen HTML formları sizin işinizi görecektir. XForms ile çalışmak yeni başlayanlar için uygun olmasa da, ilginizi çekebilir. XForms ile çalışmak belgesinde bu konu ile ilgili daha fazla bilgi bulabilirsiniz.
PHP'nin günümüzün çok kullanılan bir betik dili olmasıyla birlikte, hazır kullanabileceğiniz kodlar üreten halka açık birçok depo ve kütüphane oluşturuldu. PHP geliştiricileri geriye dönük uyumluluğu mümkün olduğunca korumaya çalıştılar, dolayısıyla eski bir PHP sürümü ile birlikte yazılmış bir PHP kodu hiçbir değişiklik yapılmasına gerek duyulmadan (ideal olarak) yeni PHP sürümleri ile çalışabilir halde kaldı. Ancak uygulamada, bazı değişikliklerin yapılması gerekebilir.
Eski kodları etkileyen yakın geçmişe ait iki önemli değişiklik:
Bu değişiklikler ile ilgili daha fazla bilgi için, Öntanımlı Değişkenler bölümünden ve oradaki diğer bağlantılardan faydalanabilirsiniz.
Sahip olduğunuz yeni bilgilerle kılavuzun birçok bölümünü anlayabilir ve örnek arşivinde bulunan birçok betiği okuyabilir hale gelmiş olmalısınız. » http://www.php.net/links.php bağlantısından inceleyebileceğiniz başka örneklere ulaşabilirsiniz.
PHP ile neler yapabileceğiniz ile ilgili sunumlara ulaşmak isterseniz, » http://talks.php.net/ adresindeki PHP Konferans Malzemeleri Sitesini ziyaret edebilirsiniz.
Kuruluma başlamadan önce PHP'yi ne amaçla kullanacağınızı bilmeniz faydalı olur. Kullanım amaçları PHP ile ne yapılabilir? bölümünde anlatıldığı üzere 3 bölümde incelenebilir:
İlk ve en önemli amaç için üç şeye ihtiyacınız bulunmaktadır: PHP'nin kendisi, bir HTTP Sunucusu ve bir tarayıcı. Muhtemelen bir tarayıcınız zaten vardır. Kullanmakta olduğunuz işletim sistemine bağlı olarak bir HTTP Sunucunuz da olabilir (Linux ve MacOS üzerinde Apache, Windows üzerinde IIS gibi). Yoksa, bir firmadan site barındırma hizmeti alabilirsiniz. Böylece herşeyi kendiniz ayarlamak zorunda kalmazsınız. Sadece PHP betiklerinizi yazmakla ilgilenir ve onları kiraladığınız alana yükleyip tarayıcınızla sonuçları görürsünüz.
Sunucuyu ve PHP’yi kendiniz yapılandıracaksanız, PHP’yi sunucuya bağlamak için iki seçeneğiniz olacak. Bir çok sunucunun PHP için (SAPI de denilen) bir modülü vardır. Apache, Microsoft Internet Information Server, Netscape and iPlanet sunucuları bu tür sunuculardandır. Bir çok sunucunun da Microsoft modül arayüzü, ISAPI için desteği vardır (OmniHTTPd gibi). Eğer sunucunuzda PHP için modül desteği yoksa sunucunuz ne türde olursa olsun onu bir CGI veya FastCGI işlemcisi olarak kullanabilirsiniz. Yani, sunucuya gelen tüm PHP dosyası isteklerini işleme sokmak için PHP’nin CGI çalıştırılabilirini kullanmak üzere sunucunuzu yapılandırabilirsiniz.
PHP'yi komut satırı betikleri yazmak için kullanmayı düşünüyorsanız (özdevinimli olarak resim üreten veya komut satırından aktardığınız değiştirgelerle metin dosyalarını işleyen betikler gibi), bir komut satırı betik yorumlayıcısına ihtiyacınız var demektir. Bu konuda daha fazla bigi edinmek için Komut satırı PHP uygulamalarının yazılması bölümüne bakınız. Bu durumda ne sunucuya ne de tarayıcıya ihtiyacınız olur.
PHP ile PHP-GTK eklentisini kullanarak masaüstü uygulamaları da yazabilirsiniz. Herhangi bir HTML çıktı üretilmediği için Genel Ağ sayfaları yazmaktan tamamen farklı bir yaklaşıma sahiptir. Bu araçlarla sadece pencereleri ve nesneleri yönetirsiniz. PHP-GTK hakkında daha ayrıntılı bilgi edinmek için lütfen » bu eklentinin kendi sitesini ziyaret ediniz. PHP-GTK, resmi PHP dağıtımlarıyla gelmez.
Bu noktadan itibaren belgede, daha çok Unix ve Windows üzerinde çalışan modüllü HTTP sunucuları ve CGI çalıştırılabilirlerinin yapılandırılması üzerinde durulacaktır. Ayrıca, komut satırı çalıştırılabiliri hakkında da bilgi bulabileceksiniz.
PHP'nin kaynak kodu ve Windows için çalıştırılabilir sürümleri » http://www.php.net/downloads.php adresinden temin edilebilir. Dağıtımları indirmek için yakınınızdaki » yansıları kullanmanızı öneririz.
Bu bölümde, PHP'nin Unix sistemleri üzerindeki yapılandırmasından ve kurulumundan ana hatları ile bahsedilecektir. Kuruluma başlamadan önce platformunuza ve kullandığınız HTTP sunucusuna özgü bölümleri incelemenizi öneririz.
Kılavuzun Genel Kurulum Değerlendirmesi bölümünde ana hatlarıyla bahsettiğimiz gibi, bu bölümde esas olarak HTTP sunucusunu ilgilendiren ayarlardan bahseceksek de PHP'nin komut satırından kullanımı ile ilgili ayarlara da değineceğiz.
PHP'yi Unix platformlarına kurmanın çeşitli yolları vardır. Kaynak kod paketinden kendiniz derleyip kurabileceğiniz gibi başkaları tarafından derlenip paketlenmiş sürümleri de kurabilirsiniz. Bu belgelerde esas olarak kaynak kod paketinden derleme, kurulum ve yapılandırma sürecinden bahsedeceğiz. Çoğu Unix benzeri sistemin kendine özgü paket kurulum yöntemi vardır. Bu, standart yapılandırmaya yardımcı olabilirse de farklı özelliklere ihtiyaç duyduğunuzda (örneğin, güvenli sunucu veya veritabanı sunucusu), HTTP sunucunuzu ve PHP'yi kendiniz derlemek zorunda kalırsınız. Yazılımları kendiniz derleyip kuracak bilgiye sahip değilseniz, sizin istediğiniz özelliklerde başkaları paket derlemiş mi diye bir araştırma yapmanızı öneririz.
Derleme işlemi için gerekli bilgi ve yazılımlar:
PHP kaynak kod paketinin derleme için ayar ve yapılandırma işlemi configure betiğinin komut satırı seçenekleri kullanılarak yapılır. Bu seçeneklerin neler olduğunu görmek için kaynak paketinin kök dizininde komut satırından ./configure --help komutunu verebilirsiniz. Ayrıca, bu kılavuzda da bazı seçeneklerin açıklamalarına yer verilmiştir. Temel yapılandırma seçeneklerini eklerde bulabilirsiniz. Eklentilere özgü yapılandırma seçenekleri ise eklentilerin kılavuzdaki belgelerinde bulunabilir.
PHP'yi yapılandırdığınızda modülleri ve çalıştırılabilirleri derlemeye hazırsınız demektir. Artık make komutunu verebilirsiniz. Derleme işlemi bir noktada başarısız olursa ve bunun sebebini anlayamazsanız, Sorunlar bölümüne bakınız.
Bu bölümde, PHP'nin Unix platformlarında Apache kurulumlarına özgü bilgilere ve ipuçlarına yer verilmiştir. Apache 2 ile ilgili bilgiler ve ipuçları ayrı bir sayfada verilmiştir.
Aşağıda, 10. şıkta kullanacağınız configure betiğinin temel yapılandırma seçeneklerini eklerde bulabilirsiniz. Eklentilere özgü yapılandırma seçenekleri ise eklentilerin kılavuzdaki belgelerinde bulunabilir. Örneklerde yazılımların sürüm numaraları, belgeyi sürüm numarasına bağlı kılmamak için 'xxx' ile gösterilmiştir. Siz bu çarpıların yerine kurduğunuz paketlerin sürüm numaralarını yazacaksınız.
Örnek 1 - PHP'nin Paylaşımlı Apache Modülü olarak kurulumu
1. gunzip apache_xxx.tar.gz
2. tar -xvf apache_xxx.tar
3. gunzip php-xxx.tar.gz
4. tar -xvf php-xxx.tar
5. cd apache_xxx
6. ./configure --prefix=/usr --enable-module=so
7. make
8. make install
9. cd ../php-xxx
10. Artık PHP'yi yapılandırabilirsiniz. Burada PHP'yi eklentileri
etkinleştiren çeşitli seçeneklerle özelleştirebilirsiniz. Olası
seçeneklerin listesini almak için ./configure --help komutunu
çalıştırabilirsiniz. Bu örnekte Apache 1 için MySQL destekli
basit bir yapılandırmaya yer verilmiştir. Ayrıca, apxs komutunun
bulunduğu yer de buradakinden farklı olabilir.
./configure --with-mysql --with-apxs=/usr/bin/apxs
11. make
12. make install
Kurulumdan sonra yapılandırmanızı değiştirmek isterseniz son üç adımı
yinelemek yeterlidir. Yeni modülün etkili olması için tek ihtiyacınız
Apache'yi yeniden başlatmaktır. Apache'nin yeniden derlenmesine gerek
yoktur.
Aksi özellikle belirtilmedikçe 'make install' ile phpize gibi çeşitli PHP
araçları, PEAR, PHP CLI ve bir takım başka şeylerin de kurulumu yapılır.
13. php.ini dosyanızı yapılandırın:
cp php.ini-development /usr/local/lib/php.ini
PHP seçeneklerini ayarlamak için .ini dosyanızı düzenleyebilirsiniz. .ini
dosyanızın başka bir yerde durmasını istiyorsanız, 10. şıkta
--with-config-file-path=/başka/bir/yer seçeneği ile dosyanız için başka
bir yer belirtebilirsiniz.
php.ini-dist yerine php.ini-production (dağıtımın standart .ini dosyası
yerine önerilen yapılandırmalar dosyasını) kullanmayı tercih ederseniz,
değişiklik listesini okumayı ihmal etmeyin, çünkü bunlar PHP'nin
davranışını etkileyecektir.
14. PHP modülünün yüklenmesi için httpd.conf dosyasını düzenlemelisiniz.
LoadModule yönergesinin değeri PHP modülünün sistemdeki yerini
göstermelidir. Yukarıdaki 'make install' bunu sizin yerinize yapmıştır
ama emin olmak için siz yine de bir bakın.
PHP 4 için:
LoadModule php4_module libexec/libphp4.so
PHP 5 için:
LoadModule php5_module libexec/libphp5.so
15. httpd.conf'un AddModule bölümünde ClearModuleList yönergesinin altına
şunu ekleyin:
PHP 4 için:
AddModule mod_php4.c
PHP 5 için:
AddModule mod_php5.c
16. Apache'ye belli dosya uzantılarını PHP uzantıları olarak ele almasını
söyleyin. Örneğin, .php uzantılı dosyaları Apache'nin PHP dosyaları
olarak ele almasını isteyebiliriz. Başka uzantıları da buraya
ekleyebilirsiniz. Bunları aralarında boşluk bırakarak aynı satıra
yazabilirsiniz. Biz örnek olsun diye .phtml uzantısını ekledik.
AddType application/x-httpd-php .php .phtml
PHP kaynak kodlarını renklendirilmiş olarak göstermek için .phps
uzantısını da yapılandırmanıza ekleyebilirsiniz. Bu, şöyle yapılır:
AddType application/x-httpd-php-source .phps
17. Artık Apache'yi başlatabilirsiniz. Bunun için Apache'yi her zaman ki gibi
başlatmanız yetecektir. (Sunucunun bir HUP veya USR1 sinyali kullanılarak
yeniden yüklenmemesi için sunucunuzu yeniden başlatmadan önce
durdurmalısınız.)
PHP'yi bir duruk nesne olarak da kurabilirsiniz:
Örnek 2 - PHP'nin Duruk Apache Modülü olarak kurulumu
1. gunzip -c apache_1.3.x.tar.gz | tar xf -
2. cd apache_1.3.x
3. ./configure
4. cd ..
5. gunzip -c php-5.x.y.tar.gz | tar xf -
6. cd php-5.x.y
7. ./configure --with-mysql --with-apache=../apache_1.3.x
8. make
9. make install
10. cd ../apache_1.3.x
11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a
(Bu satırda bir hata yok! libphp5.a'nın henüz mevcut olmadığının
farkındayız. PHP derlenince mevcut olacak.)
12. make
(Artık httpd çalıştırılabilirini Apache bin dizinine kopyalayabilirsiniz.
Apache'yi ilk defa kuruyorsanız bu komuttan sonra "make install" komutunu
da verin.)
13. cd ../php-5.x.y
14. cp php.ini-development /usr/local/lib/php.ini
15. PHP seçeneklerini ayarlamak için artık /usr/local/lib/php.ini dosyasını
düzenleyebilirsiniz. httpd.conf veya srm.conf dosyasını açıp şunu ekleyin:
AddType application/x-httpd-php .php
Bilginize: PHP 4 kurulumu için php-5'lerin yerine php-4 ve php5'lerin yerine php4 yazın.
Kullandığınız Unix türevine ve Apache kurulumuna bağlı olarak, sunucuyu durdurmanın ve yeniden başlatmanın çeşitli yolları vardır. Aşağıda farklı Unix/Apache kurulumları için sunucuyu yeniden başlatırkan kullanılabilecek komutlara yer verilmiştir. /bir/yer/ yerine bu uygulamaların dosya sistemindeki yerlerini yazınız.
Örnek 3 - Apache'yi yeniden başlatmak için örnek komutlar
1. Çeşitli Linux ve SysV türevleri için: /etc/rc.d/init.d/httpd restart 2. apachectl betiği ile: /bir/yer/apachectl stop /bir/yer/apachectl start 3. httpdctl ve httpsdctl (OpenSSL kullanarak), apachectl gibidir: /bir/yer/httpsdctl stop /bir/yer/httpsdctl start 4. mod_ssl veya başka bir SSL sunucu kullanıyorsanız, elle durdurup başlatmanız gerekebilir: /bir/yer/apachectl stop /bir/yer/apachectl startssl
apachectl and http(s)dctl
çalıştırılabilirlerinin yerleri sık sık değişir. Sisteminizde
locate, whereis,
which gibi araçlar kuruluysa bunların yerlerini bu
araçları kullanarak öğrenebilirsiniz.
PHP'yi Apache için derlerken kullanılabilecek farklı yapılandırma örnekleri:
./configure --with-apxs --with-pgsql
Bu yapılandırmayla, Apache'nin httpd.conf dosyasında LoadModule yönergesi ile Apache'ye yüklenebilecek şekilde bir libphp5.so (veya PHP4 için libphp4.so) paylaşımlı kütüphanesi oluşturulacak, PostgreSQL desteği bu kütüphaneye gömülü olacaktır.
./configure --with-apxs --with-pgsql=shared
Bu yapılandırmayla, Apache için bir libphp4.so
paylaşımlı kütüphanesi oluşturulacak fakat önceki örnekten farklı olarak
PostgreSQL desteği için pgsql.so adında ayrı bir
paylaşımlı kütüphane oluşturulacaktır. PHP'ye PostgreSQL desteğini,
eklentiyi php.ini içinde bir extension yönergesinde
belirterek veya doğrudan bir betik içinde dl()
işlevini kullanarak verebilirsiniz.
./configure --with-apache=/bir/yer/apache_kaynak_paketi --with-pgsql
Bu yapılandırmayla, bir libmodphp5.a kütüphanesi, mod_php5.c diye bir dosya ve bunlara eşlik eden bazı dosyalar oluşturulacak ve bunlar Apache kaynak ağacının altında src/modules/php5 dizinine kopyalanacaktır. Bundan sonra Apache --activate-module=src/modules/php5/libphp5.a seçeneği kullanılarak derlendiğinde Apache libphp5.a kütüphanesini oluşturacak (PHP 4 için 5 yerine 4 yazın) ve onu httpd çalıştırılabiliri ile duruk olarak ilintileyecektir. PostgreSQL desteği de doğrudan httpd çalıştırılabiliri içinde olacaktır. Böylece sonuçta tek bir httpd çalıştırılabiliri Apache ve PHP'nin tamamını içerecektir.
./configure --with-apache=/bir/yer/apache_kaynak_paketi --with-pgsql=shared
Yukarıdakinden farklı olarak PostgreSQL desteği, doğrudan sonuncu httpd çalıştırılabiliri içinde değil, ayrı bir pgsql.so paylaşımlı kütüphanesiyle php.ini dosyası üzerinden veya doğrudan dl() işlevi kullanılarak PHP'ye yüklemek suretiyle elde edilecektir.
PHP'yi derlemek için seçtiğiniz her yolun getirileri olacağı gibi götürüleri de olacaktır. Paylaşımlı nesne olarak derlemek, Apache'yi ayrı olarak derleyip, PHP ile ilgili hiçbir şey için Apache'yi tekrar derleme ihtiyacı duymamak demektir. PHP'yi Apache içinde (duruk yöntem) derlerseniz PHP daha çabuk yüklenecek ve daha hızlı çalışacaktır. Bu konularda daha ayrıntılı bilgi edinmek için Apache'nin » DSO desteği sayfasına bakınız.
Bilginize: Apache'nin öntanımlı httpd.conf dosyası şöyle bir bölümle gelmektedir:
User nobody Group "#-1"Burada
Groupsatırı, Group nogroup veya Group daemon gibi bir satırla değiştirilmedikçe, PHP dosyaları açamayacaktır.
Bilginize: --with-apxs=/bir/yer/apxs seçeneğini kullanırken apxs'in kaynak paketindeki yerini değil, sisteminizde kurulu olduğu yeri belirtmeye dikkat edin.
Bu bölüm Unix sistemlerde PHP'nin Apache 2.x'e kurulumu hakkında bilgiler ve ipuçları içerir.
Apache 2'nin bir hizmet ortamında evreli MPM'lerle kullanımını önermiyoruz. Bunun yerine prefork MPM'sini veya Apache 1 kullanmanızı öneririz. Bunun sebebini SSS altında Apache ve evreli MPM'ler başlığı altında bulabilirsiniz.
Apache 2.x HTTP Sunucusu hakkında temel bir bilgi edinmek için mutlaka » Apache HTTP Sunucusu Sürüm 2.x Belgelerine bakmanızı öneririz.
Bilginize: PHP ve Apache 2.0.x uyumluluk bilgileri
Aşağıdaki PHP sürümlerinin Apache 2.0.x'in en son sürümleri ile çalıştığı bilinmektedir:
- PHP 4.3.0 ve sonrası » http://www.php.net/downloads.php adresinden indirilebilir.
- En son kararlı geliştirme sürümü. Kaynak kod paketini » http://snaps.php.net/php5-latest.tar.gz olarak, Windows çalıştırılabilirlerini ise » http://snaps.php.net/win32/php5-win32-latest.zip olarak indirebilirsiniz.
- Kararlı sürüm adayı sürümü » http://qa.php.net/ adresinden indirebilirsiniz.
- PHP'yi » anonim SVN'den indirme seçeneği elbette daima mevcut.
PHP'nin bu sürümleri Apache 2.0.40 ve sonrası ile uyumludur.
Apache 2.0 SAPI desteği PHP 4.2.0 ile başlamıştır. PHP'nin 4.2.3 sürümü Apache 2.0.39'da çalışır. PHP'nin 4.2.3 sürümünü bundan başka bir Apache sürümü ile kullanmayın. Ancak, PHP'nin 4.3.0 ve sonraki sürümlerini Apache2'nin en son sürümleri ile gönül rahatlığıyla kullanabilirsiniz.
PHP'nin bahsi geçen bütün sürümleri hala Apache 1.3.x ile çalışmaktadır. Apache 2.x.x'in Apache 1.3.x ile uyumlu (tek evreli çok süreçli) yapılandırmaları ile de aynı durum sözkonusudur.
En son sürümü » Apache 2.x indirme sitesinden ve buna uygun PHP sürümünü yukarıda bahsedilen yerlerden indirebilirsiniz. Bu kısa kılavuz Apache 2.x ve PHP hakkında sadece temel bilgi sağlar. Daha ayrıntılı bilgi edinmek için » Apache HTTP Sunucusu Belgelerine bakınız. Kurulum talimatlarının sürüm numaralarından ötürü geçerliliğini yitirmemesi için sürüm numaraları 'NN' şeklinde belirtilmiştir, NN yerine kurulan Apache sürümünün sürüm numarası yazılmalıdır.
Apache 2.x'in şu an iki sürümü mevcuttur: 2.0 ve 2.2. Bunlardan birini seçmek için çeşitli sebepler olabilirse de 2.2 şu an için en son ve önerilen sürümdür. Ancak, burada sözü edilen talimatlar hem 2.0 hem de 2.x için çalışır.
Örnek 1 - PHP'nin Paylaşımlı Apache 2 Modülü olarak kurulumu
1. gzip -d httpd-2_x_NN.tar.gz
2. tar xvf httpd-2_x_NN.tar
3. gunzip php-NN.tar.gz
4. tar -xvf php-NN.tar
5. cd httpd-2_x_NN
6. ./configure --enable-so
7. make
8. make install
Böylece standart prefork MPM'si ve yüklenebilir modül desteği ile Apache
2.x.NN /usr/local/apache2 altına kurulmuş oldu. Kurulumu denemek için
Apache HTTP sunucusunu normal yollardan başlatabilirsiniz. Örnek:
/usr/local/apache2/bin/apachectl start
PHP yapılandırmasıyla çalıştırmak üzere şimdilik sunucuyu durduralım:
/usr/local/apache2/bin/apachectl stop.
9. cd ../php-NN
10. Artık PHP'yi yapılandırabiliriz. Hangi eklentilerin etkin olacağını
belirten çeşitli seçenekleri kullanarak PHP'yi özelleştirebilirsiniz.
Olası seçeneklerin listesini görmek için ./configure --help komutunu
kullanın. Bu örnekte Apache 2 ve MySQL ile basit bir yapılandırmaya
gideceğiz. Sizde apxs farklı bir yere kurulmuş olabilir, hatta ismi apxs2
bile olabilir.
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
11. make
12. make install
Eğer kurulumdan sonra yapılandırmanızı değiştirmek isterseniz sadece son
üç adımı yinelemeniz yeterli olacaktır. Yeni modülün etkin olabilmesi
için Apache'yi yeniden başlatmanız gerekir. Apache'yi yeniden derlemeniz
gerekmez.
Aksi özellikle belirtilmedikçe 'make install' ile phpize gibi çeşitli PHP
araçları, PEAR, PHP CLI ve bir takım başka şeylerin de kurulumu yapılır.
13. php.ini dosyanızı yapılandırın:
cp php.ini-development /usr/local/lib/php.ini
PHP seçeneklerini ayarlamak için .ini dosyanızı düzenleyebilirsiniz. .ini
dosyanızın başka bir yerde durmasını istiyorsanız, 10. şıkta
--with-config-file-path=/başka/bir/yer seçeneği ile dosyanız için başka
bir yer belirtebilirsiniz.
php.ini-dist yerine php.ini-production (dağıtımın standart .ini dosyası
yerine önerilen yapılandırmalar dosyasını) kullanmayı tercih ederseniz,
değişiklik listesini okumayı ihmal etmeyin, çünkü bunlar PHP'nin
davranışını etkileyecektir.
14. PHP modülünün yüklenmesi için httpd.conf dosyasını düzenlemelisiniz.
LoadModule yönergesinin değeri PHP modülünün sistemdeki yerini
göstermelidir. Yukarıdaki 'make install' bunu sizin yerinize yapmıştır
ama emin olmak için siz yine de bir bakın.
LoadModule php5_module modules/libphp5.so
15. Apache'ye belli dosya uzantılarını PHP uzantıları olarak ele almasını
söyleyin. Örneğin, .php uzantılı dosyaları Apache'nin PHP dosyaları
olarak ele almasını isteyebiliriz. Apache AddType yönergesini kullanmamak
suretiyle, PHP tarafından çalıştırılmak üzere istismar.php.jpg gibi
dosyaların oluşturulması ve yüklenmesi gibi tehlikeli durumlardan
kaçınmak isteyebilirsiniz. Biz örnek olsun diye .phtml uzantısını
ekledik. Başka uzantıları da buraya ekleyebilirsiniz. Bunları aralarında
boşluk bırakarak aynı satıra yazabilirsiniz.
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Veya .php, .php2, .php3, .php4, .php5, .php6 ve .phtml gibi dosyalar
dışında hiçbir dosyanın PHP tarafından çalıştırılmamasını şöyle
sağlayabilirsiniz:
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
PHP kaynak kodlarını renklendirilmiş olarak göstermek için .phps
uzantısını da yapılandırmanıza ekleyebilirsiniz. Bu, şöyle yapılır:
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
.php dosyalarının uzantılarını .phps olarak değiştirmeden kaynak kodlarını
renklendirilmiş olarak göstermek isterseniz bunu şöyle yapabilirsiniz:
RewriteEngine On
RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
PHP kaynak süzgeci, gizli kalması gereken bilgiler içeren genel kullanıma
açık sunucularda kullanılmamalıdır. Aksi takdirde gizli kalması gereken
bilgiler kaynak koda eklenebilir.
16. Artık Apache'yi başlatabilirsiniz. Bunun için Apache'yi her zaman ki gibi
başlatmanız yetecektir:
/usr/local/apache2/bin/apachectl start
- VEYA -
service httpd restart
Yukarıdaki adımları izleyerek PHP'nin bir SAPI modülü olarak çalıştığı bir Apache 2 HTTP sunucusuna sahip olursunuz. Apache ve PHP için şüphesiz birçok farklı yapılandırma seçeneği vardır. Yapılandırma seçeneklerinin listesi için her kaynak ağacında ./configure --help çalıştırabilirsiniz.
Apache derlenirken prefork MPM modülü yerine , worker MPM modülü seçilerek çok evreli derlenebilir. Bunu yapmak için 6. şıkta derleme seçeneklerinize şu seçeneğini ekleyebilirsiniz:
Bunu yapmadan önce, bunun olası sonuçları hakkında bilgi sahibi olmaya, azından ne gibi etkilerinin olacağını anlamaya çalışın. Bu konuda daha ayrıntılı bilgi edinmek için Apache HTTP sunucusunun belgelerinden » Çok Süreçlilik Modülleri (MPM'ler) belgesini okuyunuz.
Bilginize: İçerik dili uzlaşımı kullanmak isterseniz Apache MultiViews SSS'ine bakınız.
Bilginize: Ayrıca, PHP'yi deneysel Zend Thread Safety (ZTS) motoru ile de derleyebilirsiniz. Böyle bir yapılandırmada bütün eklentiler kullanılamayacaktır. Bu bakımdan Apache'yi standart prefork MPM'si ile derlemenizi öneriyoruz.
Bu bölüm PHP'nin Unix sistemlerde Lighttpd 1.4 ile kurulumu hakkında bilgiler ve ipuçları içerir.
Lütfen devam etmeden önce » Lighttpd redmine sitesini ziyaret edip Lighttpd'nin doğru düzgün nasıl kurulacağını öğreniniz.
PHP ve Lighttpd'ye bağlanmak için tercih edilen SAPI Fastcgi'dir. Fastcgi, PHP 5.3'te php-cgi'yi özdevinimli olarak sihirli bir şekilde etkin kılar. Fakat, eski sürümler için PHP'nin --enable-fastcgi ile derlenmesi gerekir. PHP'nin fastcgi için hazır olduğunu doğrulamak için php -v çıktısının PHP 5.2.5 (cgi-fcgi) içermesi gerekir. PHP 5.2.3 öncesinde, fastcgi, php çalıştırılabiliri üzerinde etkindi (php-cgi diye birşey yoktu).
Lighttpd'nin PHP'ye bağlanmasını ve fastcgi süreçlerini çatallamasını sağlamak üzere yapılandırmak için lighttpd.conf dosyasını düzenlemeniz gerekir. Fastcgi süreçlerine yerel sistemden bağlanmak için soketler tercih edilir.
Örnek 1 - lighttpd.conf'tan bir bölüm
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
((
"socket" => "/tmp/php.socket",
"bin-path" => "/usr/local/bin/php-cgi",
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"min-procs" => 1,
"max-procs" => 1,
"idle-timeout" => 20
))
)
bin-path yönergesi lighttpd'nin fastcgi süreçlerini devingen
olarak çatallamasına izin verir. PHP kendi çocuklarını PHP_FCGI_CHILDREN
ortam değişkenine göre çatallayacaktır. PHP, PHP_FCGI_MAX_REQUESTS
değerinin aşılmasına sebep olan çocuk süreci öldürür. PHP'de
min-procs ve max-procs yönergelerinden genel
olarak kaçınılması gerekir. PHP kendi çocuklarını yönetir ve makine kodu
önbelleklerini APC gibi çocukları arasında paylaştırır.
min-procs yönergesine 1'den büyük bir değer atanmışsa PHP
yanıtçılarının sayısı PHP_FCGI_CHILDREN değerinin katları olacaktır (2
min-procs * 16 çocuk eşittir 32 yanıtçı).
Lighttpd, fastcgi süreçlerinin çatallanmasını kolaylaştırmak için spawn-fcgi adında bir programla gelir.
Süreçleri spawn-fcgi kullanmaksızın çatallamak mümkünse de, biraz ağır kaldırma çalışmak gerekir. Gelen istekleri karşılamak için PHP'nin kaç çocuk çatallayacağı PHP_FCGI_CHILDREN ortam değişkeni ile belirlenir. PHP'nin her çocuğunun kaç isteklik yaşayacağını ise PHP_FCGI_MAX_REQUESTS belirler. Aşağıda, PHP yanıtçılarının çatallanmasına yardımcı olan basit bir bash betiği verilmiştir.
Örnek 2 - FastCGI Yanıtçılarının Çatallanması
#!/bin/sh
# php-cgi çalıştırılabilirinin yeri
PHP=/usr/local/bin/php-cgi
# PID dosyasının yeri
PHP_PID=/tmp/php.pid
# Dinlenecek adres
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Dinlenecek soket
FCGI_BIND_ADDRESS=/tmp/php.sock
PHP_FCGI_CHILDREN=16
PHP_FCGI_MAX_REQUESTS=10000
env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \
PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \
$PHP -b $FCGI_BIND_ADDRESS &
echo $! > "$PHP_PID"
Uygulamaları dengelemek için Fastcgi örnekleri çok sayıda uzak makineye çatallanabilir.
Örnek 3 - Uzak FCGI örneklerine bağlanmak
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)
PHP, » Caudium HTTP Sunucusu için bir Pike modülü olarak derlenebilir. PHP'yi Caudium ile kullanmak için aşağıdaki basit kurulum adımlarını izleyerek kurabilirsiniz:
Örnek 1 Caudium Kurulum Adımları
1. PHP 4 kurulumuna başlamadan önce Caudium kurulmuş olmalıdır. PHP 4'ün
düzgün çalışması için Pike 7.0.268 veya daha yenisi gerekir. Bu örneğin
amaçları gereği, Caudium'un /opt/caudium/server/ altında kurulu olduğunu
varsayacağız.
2. php-x.y.z (x.y.z sürüm numarasıdır) dizinine geçin.
3. ./configure --with-caudium=/opt/caudium/server
4. make
5. make install
6. Çalışmaktaysa Caudium'u yeniden başlatın.
7. Çizgesel kurulum arayüzüne oturum açın ve PHP 4 desteği vermek istediğiniz
sanal sunucuya gidin.
8. Add Module'e tıklayın ve PHP4 Betik Destek modülünü bulup ekleyin.
9. Eğer belgeler, PHP 4 yorumlayıcısının kullanılabilir durumda olmadığını
söylüyorsa sunucuyu yeniden başlatmamış olabilirsiniz, yeniden başlatmayı
deneyin. PHP4.so ile ilgili hatalar için
/opt/caudium/logs/debug/default.1'e bakın. Ayrıca,
caudium/server/lib/[pike-version]/PHP4.so
dosyasının varlığından emin olun.
10. Gerekirse PHP Betik Destek modülünü yapılandırın.
Şüphesiz, Caudium modülünüzü PHP 4'te mevcut çeşitli eklentileri desteklemesi için derleyebilirsiniz. Eklentilere özel yapılandırma seçenekleri için eklenti belgelerine bakınız.
Bilginize: PHP 4'ü MySQL desteği ile derlerken normal MySQL istemci kodunun kullanıldığına emin olun. Aksi takdirde, Pike, MySQL desteğine sahipse çelişkili durumlar ortaya çıkabilir. MySQL kurulum dizinini --with-mysql seçeneği ile belirterek bunu sağlayabilirsiniz.
PHP'yi bir fhttpd modülü olarak derlemek için "Build as an fhttpd module?" sorusuna "yes" yanıtı verip (yapılandırmada --with-fhttpd=DİZİN seçeneği) fhttpd kaynak kök dizinini belirtin. /usr/local/src/fhttpd dizini öntanımlıdır. fhttpd ile çalışırsa PHP'yi bir modül olarak derlemek daha iyi denetim ve uzaktan yönetim yeteneği ile daha yüksek başarım sağlar.
Bilginize: PHP 4.3.0'dan itibaren fhttpd desteklenmemektedir.
Bu bölümde, PHP'nin Sun Solaris üzerinde Sun Java Sistem, Sun ONE, iPlanet ve Netscape HTTP Sunucusu kurulumlarına özgü bilgilere ve ipuçlarına yer verilmiştir.
PHP 4.3.3'ten itibaren PHP betikleri NSAPI modülü ile kullanılarak özel dizin listeleri ve hata sayfaları üretebilebilmektedir. Apache uyumluluğu sağlamak için ek işlevler de mevcuttur. Mevcut HTTP sunucuları desteği hakkında bilgi edinmek için alt istekler ile ilgili bölümü okuyunuz.
Netscape Girişimci Sunucusu (NES) için PHP yapılandırması hakkında daha ayrıntılı bilgiyi » http://benoit.noss.free.fr/php/install-php4.html adresinde bulabilirsiniz.
PHP'yi Sun Java Sistem, Sun ONE, iPlanet ve Netscape HTTP sunucularında derlemek için, kurulum dizinini --with-nsapi=[DiZiN] seçeneği ile belirtin; öntanımlı dizin: /opt/netscape/suitespot/. Ayrıca /php-xxx-version/sapi/nsapi/nsapi-readme.txt dosyasını da okuyun.
Aşağıdaki paketleri » http://www.sunfreeware.com/ veya başka bir siteden indirip kurabilirsiniz:
export PATH
ile sisteminizde kullanılabilir
olmasını sağlayın.
gunzip php-x.x.x.tar.gz
(.gz paketi değilse 4'e gidin).
tar xvf php-x.x.x.tar
cd ../php-x.x.x
Netscape sunucunuz /opt/netscape/suitespot/ dizininde kurulu değilse, aşağıdaki seçeneğe bulunduğu yeri yazın:
./configure --with-mysql=/usr/local/mysql \
--with-nsapi=/opt/netscape/suitespot/ \
--enable-libgcc
Temel kurulum bitip ilgili benioku dosyalarını da okuduktan sonra bir kaç adımlık yapılandırma işlemi kalmış olacak.
Öncelikle, sunucunun bütün paylaşımlı kütüphaneleri bulabilmesi için bazı dizinleri LD_LIBRARY_PATH ortam değişkenine eklemeniz gerekebilir. Bunun yapılacağı en uygun yer HTTP sunucunuzu başlatan betiktir. Bu betik genellikle, /bir/yol/server/https-sunucuismi/start gibi bir dosyadır. HTTP sunucunuzun /bir/yol/server/https-sunucuismi/config/ dizininde yer alan yapılandırma dosyalarını da düzenlemeniz gerekecek.
Aşağıdaki satırı mime.types dosyasına ekleyin (bunu yönetim sunucusunda yapabilirsiniz):
type=magnus-internal/x-httpd-php exts=php
magnus.conf (>= 6 sürümü sunucular için) veya obj.conf (< 6 sürümü sunucular için) dosyalarını düzenlemek için açın ve aşağıdaki satırları mime types init satırının sonrasına ekleyin. shlib (paylaşımlı kütüphane) sisteminize göre değişiklik gösterebilir, genellikle /opt/netscape/suitespot/bin/libphp4.so gibi bir dosyadır.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="/opt/netscape/suitespot/bin/libphp4.so" Init fn="php4_init" LateInit="yes" errorString="PHP ilklendirilemedi!" [php_ini="/bir/yol/php.ini"]
(PHP >= 4.3.3) php_ini değiştirgesi isteğe bağlı olsa da oraya HTTP sunucunuzun yapılandırma dizininde bulunan php.ini dosyanızı yerleştirebilirsiniz.
obj.conf dosyasındaki öntanımlı nesneyi yapılandırın (vserver.obj.conf dosyasında sanal sunucu sınıfları [sürüm 6.0+] için):
<Object name="default"> . . . .#DiKKAT: Bu satır tüm 'ObjectType' satırlarından sonra ve .# tüm 'AddLog' satırlarından önce yer almalıdır. Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] . . </Object>
(PHP >= 4.3.3) Bazı özel php.ini değerlerini ek değiştirgeler olarak ekleyebilirsiniz, örneğin php4_execute çağrısı bağlamına özgü docroot="/bir/yol/docroot" atamasını yapabilirsiniz. Mantıksal ini yönergeleri için lütfen "On","Off",... değil (çünkü doğru çalışmayacaktır), 0 ve 1 değerlerini kullanınız. Örneğin, zlib.output_compression="On" yerine zlib.output_compression=1 yazın.
Bu sadece, içinde PHP betiklerinden başka dosya bulunmayan (bir cgi-bin dizini gibi) bir dizini yapılandırmak istediğiniz takdirde gerekir :
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Bundan sonra, Yönetim sunucusunda bir dizini yapılandırıp ona x-httpd-php MIME türünü atayabilirsiniz. Bu dizindeki tüm dosyalar PHP tarafından çalıştırılacağından oradaki dosyaların uzantılarını .html olarak değiştirip PHP kullanıldığını gizleyebilirsiniz.
Kimlik doğrulama ayarları: PHP kimlik doğrulaması diğer kimlik doğrulamalarıyla kullanılamaz. Bu işlem tamamen PHP betikleriniz üzerinden geçer. PHP kimlik doğrulamasını sunucunun tamamı için yapılandırmak isterseniz aşağıdaki satırı öntanımlı nesnenize ekleyiniz:
<Object name="default"> AuthTrans fn=php4_auth_trans . . . </Object>
PHP kimlik doğrulamasını tek bir dizin için kullanmak istiyorsanız şunu ekleyin:
<Object ppath="d:\kimlik\dogrulaması\yapilacak\dizin\*"> AuthTrans fn=php4_auth_trans </Object>
Bilginize: PHP'nin kullanacağı yığıt boyutu HTTP sunucusunun yapılandırmasına bağlıdır. Çok büyük PHP betiklerinin çalışmaması halinde Yönetim sunucusundan ("MAGNUS EDITOR" bölümünden) boyutu arttırmanızı öneririz.
Bir Sun JSWS/Sun ONE WS/iPlanet/Netscape sunucusu çok evreli bir HTTP sunucusu olarak çalıştığı takdirde PHP betiklerinin yazımı özel bir dikkat gerektirir. Bunun sebebi, tüm isteklerin aynı süreç uzayında (HTTP sunucusunun kendi uzayı) çalışması ve bu uzayın (ortam değişkenlerince) tek bir ortama sahip olmasıdır. PATH_INFO, HTTP_HOST gibi CGI ortam değişkenlerini almak isterseniz, bunu getenv() işlevli eski PHP yöntemleriyle veya benzer yollarla ($_ENV gibi küresellerle) yapmaya çalışmak doğru değildir. Geçerli CGI değişkenleri olmaksızın sadece çalışan HTTP sunucusunun ortamını alırsınız!
Bilginize: Soru: Ortamda neden (geçersiz) CGI değişkenleri var?
Yanıt: Bunun sebebi, HTTP sunucusu sürecini Yönetim sunucusundan başlatmanız ve başlatma betiğinin bir CGI betiği olarak çalışmasıdır (yönetim sunucusu içinde bir CGI betiği!!). Başlatılan HTTP sunucusunun bazı CGI ortam değişkenlerine sahip olmasının sebebi budur. HTTP sunucusunu yönetim sunucusunun dışında çalıştırırsanız bunun sebebini daha iyi anlarsınız. HTTP sunucusunu root kullanıcısı olarak komut satırından kendiniz başlatın ve ortamda artık CGI tarzı ortam değişkenlerinin bulunmadığını görün.
CGI değişkenlerini doğru yöntemle almak için betiklerinizde değişiklik yapmalısınız. PHP 4'te bu işlem için $_SERVER süper küreselini kullanabilirsiniz. $HTTP_HOST gibi değişkenleri kullanan eski betikleriniz varsa php.ini içinde register_globals=On yaptıktan başka değişken sırasını da değiştirin (önemli: Artık ortama ihtiyacınız olmayacağından "E"yi silin):
variables_order = "GPCS" register_globals = On
"404 Not Found" ve benzeri durumlarda hata sayfaları üretimi için PHP'yi kullanabilirsiniz. Üzerine yazmak istediğiniz her hata sayfası için obj.conf dosyasındaki nesneye aşağıdaki satırı ekleyiniz:
Error fn="php4_execute" code=XXX script="/bir/yol/betik.php" [inikey=value inikey=value...]
Burada XXX, HTTP hata kodudur. Sizinkiyle çelişen başka Error yönergeleri varsa onları silin. Tüm hatalar için hep aynı sayfayı kullanacaksanız code değiştirgesini belirtmeyin. Betiğiniz hata kodunu $_SERVER['ERROR_TYPE'] ile alacaktır.
Bir diğer olanak, özel yapım dizin listeleri üretimidir. Dizin içeriğini gösteren bir PHP betiği yazdıktan sonra, obj.conf dosyasında öntanımlı type="magnus-internal/directory" Service satırını şöyle değiştirin:
Service fn="php4_execute" type="magnus-internal/directory" script="/bir/yol/betik.php" [inikey=value inikey=value...]
Hata sayfaları ve dizin listeleri için özgün yol ve dönüşmüş yol $_SERVER['PATH_INFO'] ve $_SERVER['PATH_TRANSLATED'] değişkenlerinden alınabilir.
NSAPI modülü, HTTP sunucusunda alt istekler yapmak ve sonuçları bir sayfaya yerleştirmek için artık nsapi_virtual() işlevine sahiptir (rumuz: virtual()). Bu işlev NSAPI kütüphanesinin bazı belgelenmemiş özelliklerini kullanır. Unix üzerinde modül özdevinimli olarak gerekli işlevlerin varlığını araştırır ve kullanılabilecekse kullanır. Aksi takdirde, nsapi_virtual() iptal edilir.
Bilginize: ÖNEMLİ: nsapi_virtual() desteği DENEYSEL'dir!!!
PHP'yi bir CGI programı olarak derlemek öntanımlıdır. Bu sayede HTTP sunucuda çalışmayacak betikleri yorumlamak için veya CGI işlemleri için kullanılabilecek bir komut satırı yorumlayıcısı oluşturulmuş olur.PHP'nin bir modül olarak çalıştığı bir HTTP sunucusu genellikle başarım sorunlarına bir çözüm olarak kullanılır. Bununla birlikte, CGI sürümü, farklı PHP sayfalarını farklı kullanıcı kimlikleriyle çalıştırabilme imkanı sunar.
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
PHP 4.3.0 ve sonrasında, PHP'ye bazı önemli eklemeler yapıldı. Ayrıca, CGI çalıştırılabiliri ile aynı isimde çalıştırılabilire sahip CLI adında yeni bir SAPI geldi. {PREFIX}/bin/php çalıştırılabilirinde kurulu olan şeyler yapılandırmanızı nasıl yaptığınıza bağlıdır ve bu, PHP'nin komut satırından kullanımı bölümünde ayrıntılı olarak açıklanmıştır.
PHP'yi bir CGI programı olarak derlediyseniz, derlemenizi make test komutunu vererek sınayabilirsiniz. Derlemenizi sınamak daima iyidir. Bu yolla sonradan karşılaşabileceğiniz sorunları daha ortaya çıkmadan yakalama şansınız olur.
Bazı sunucu kaynaklı ortam değişkenleri geçerli » CGI/1.1 belirtiminde tanımlanmamıştır; sadece şu değişkenler tanımlıdır: AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL ve SERVER_SOFTWARE. Bunların dışında kalan herşey 'üretici eklentileri' olarak ele alınmalıdır.
Bu bölüm PHP'nin HP-UX sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.
PHP'nin HP-UX sistemlere kurulumunda iki seçenek söz konusudur: Ya kendiniz derlersiniz ya da bir başkasının derlediği çalıştırılabiliri kurarsınız.
Resmi derlenmiş paketleri » http://software.hp.com/ adresinden edinebilirsiniz.
Kılavuzun bu bölümü yazılana kadar, PHP'nin (ve ilgili eklentilerin) HP-UX sistemlerde derlenmesi ile ilgili belgeler kaldırılmıştı. Bunları artık bir dış kaynaktan okuyabileceksiniz: » Building Apache and PHP on HP-UX 11.11
Bu bölüm PHP'nin » OpenBSD 3.6 sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.
PHP'yi OpenBSD üzerine kurmak için ikil paketlerin kullanımı en basit ve önerilen bir yoldur. Temel paket, modül paketlerinden ayrıdır ve her modül paketi diğerlerinden bağımsız olarak kurulup kaldırılabilir. İhtiyaç duyacağınız dosyaları OpenBSD CD'nizde veya FTP sitesinde bulabilirsiniz.
İhtiyacınız olan ana paket php4-core-4.3.8.tgz olup, temel motoru (artı gettext ve iconv) içerir. Modül paketleri ise php4-mysql-4.3.8.tgz veya php4-imap-4.3.8.tgz gibi isimler alırlar. Bu modülleri php.ini dosyanızda etkin ve etkisiz kılmak için phpxs komutuna ihtiyacınız olacak.
Örnek 1 - OpenBSD Paket Kurulum Örneği
# pkg_add php4-core-4.3.8.tgz # /usr/local/sbin/phpxs -s # cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini (add in mysql) # pkg_add php4-mysql-4.3.8.tgz # /usr/local/sbin/phpxs -a mysql (add in imap) # pkg_add php4-imap-4.3.8.tgz # /usr/local/sbin/phpxs -a imap (remove mysql as a test) # pkg_delete php4-mysql-4.3.8 # /usr/local/sbin/phpxs -r mysql (install the PEAR libraries) # pkg_add php4-pear-4.3.8.tgz
OpenBSD'deki ikil paketler hakkında ayrıntılı bilgi edinmek için » packages(7) kılavuz sayfasını okuyunuz.
Ayrıca, PHP'yi kaynak paketinden » port ağacını kullanarak da derleyebilirsiniz. Ancak, bu sadece OpenBSD üzerinde tecrübeli kullanıcılar için önerilebilecek bir yoldur. PHP4 portu iki alt dizine ayrılır: çekirdek ve eklentiler. Eklentilerin bulunduğu dizin desteklenen tüm PHP modülleri için alt paketler üretir. Bu modüllerden üretilmesini istemedikleriniz için no_* FLAVOR'unu kullanınız. Örneğin imap modülünün derlenmeden geçilmesi için FLAVOR'a no_imap atayınız.
OpenBSD'nin eski dağıtımları PHP'yi duruk ilintili derlemek için FLAVORS sistemini kullanırlar. Bu yöntemle ikil paketleri üretmek zor olduğundan artık bu yol önerilmemektedir. İsterseniz hala eski port ağaçlarını kullanabilirsiniz fakat OpenBSD ekibi tarafından artık desteklenmemektedirler. Bu konuda fikirleriniz varsa port'un şu anki sürdürücüsü: Anil Madhavapeddy (avsm at openbsd dot org).
Bu bölüm PHP'nin Solaris sistemlere kurulumu hakkında bilgiler ve ipuçları içerir.
Solaris kurulumlarında sıklıkla C derleyicilerin ve bunlarla ilgili araçların yokluğu sözkonusu olur. Bu araçların GNU sürümlerinin gerekliliği hakkında bilgi edinmek için lütfen SSS'nin bu bölümünü okuyunuz. Gereken yazılımlar:
Bunlara ek olarak, Oracle veya MySQL gibi yapılandırmanıza özgü bir takım ek yazılımların kurulması da gerekebilir.
Kurulması gereken bileşinlerin çoğunu kurmak için pkgadd kullanarak Solaris kurulum işlemlerini kolaylaştırabilirsiniz.
Bu bölüm Unix sistemlerde PHP'nin » Debian GNU/Linux kurulumu hakkında bilgiler ve ipuçları içerir.
PHP'nin Unix üzerinde derlenmesi ile ilgili talimatlar Debian için de geçerli olsa da bu kılavuz sayfasında ayrıca, hem apt-get hem de aptitude komutlarının kullanımı gibi diğer seçeneklere özgü bilgilere de yer verilmiştir. Bu kılavuz sayfasında bu iki komut kimi zaman diğerinin yerine kullanılmıştır.
Öncelikle dikkat edeceğiniz şey, Apache2 ile tümleştirmek için libapache2-mod-php5 ve PEAR ile tümleştirmek için php-pear gibi PHP ile ilgili diğer paketlerinde gerekli olabileceğidir.
İkinci olarak, bir paketi kurmadan önce paket listesini güncellemeniz yerinde bir hareket olacaktır. Bu işlem genellikle apt-get update komutu çalıştırılarık yapılır.
Örnek 1 - Apache2 ile kurulum örneği
# apt-get install php5-common libapache2-mod-php5 php5-cli
APT, Apache2 için hazırlanmış PHP 5 modülünü ve bu modülü etkinleştirmek için bağımlı olduğu diğer paketleri özdevinimli olarak kuracaktır. Yapılan değişikliğin geçerli olması için Apache2 yeniden başlatılmalıdır. Örnek:
Artık herşey yerli yerine oturduğuna göre aşağıdaki örneği izleyerek Apache ve PHP'yi kurabilirsiniz:
Örnek 2 - PHP kurulduktan sonra Apache2'nin dirdirilip yeniden başlatılması
# /etc/init.d/apache2 stop # /etc/init.d/apache2 start
Bir önceki bölümde PHP sadece çekirdek modüllerle kurulmuştu. Çok geçmeden MySQL, cURL, GD ve benzeri modülleri etkinleştirme ihtiyacı duyabilirsiniz. Bunları da apt-get komutuyla kurabilirsiniz.
Örnek 3 - Ek PHP 5 paketleri listesinin alınma yöntemleri
# apt-cache search php5 # aptitude search php5 # aptitude search php5 |grep -i mysql
Bu örnek komutların çıktısından da görebileceğiniz gibi, php5-cgi, php5-cli ve php5-dev gibi özel paketlerde dahil olmak üzere kurabileceğiniz çok sayıda PHP modülü vardır. Listeyi dikkatlice inceleyip ihtiyacınız olanları seçtikten sonra apt-get veya aptitude ile bunları kurabilirsiniz. Debian bunlar içinde bağımlılık denetimleri yapacağından, örneğin MySQL ve cURL kurmak istediğinizde bunların bağımlı olduğu paketleri de kurmayı teklif edecektir:
Örnek 4 - MySQL ve cURL PHP modüllerinin kurulumu
# apt-get install php5-mysql php5-curl
APT özdevinimli olarak farklı php.ini (/etc/php5/apache2/php.ini, /etc/php5/conf.d/pdo.ini ve benzeri) dosyalarına uygun satırları ve eklentinin türüne bağlı olarak extension=foo.so benzeri girdileri ekleyecektir. Bu değişikliklerin de etkili olabilmesi için Apache2'nin yeniden başlatılması gerekir.
Bu bölümde, PHP'nin Mac OS X üzerindeki kurulumlarına özgü bilgilere ve ipuçlarına yer verilmiştir. Mac OS X'in birbirlerinden pek az farklı iki sürümü vardır: İstemci ve Sunucu. Burada PHP'nin her iki sisteme de kurulumundan bahsedilecektir. PHP'nin MacOS 9 ve öncesinde kullanılamadığına dikkat ediniz.
PHP'nin Mac OS X için bir kaç tane paketlenmiş ve derlenmiş sürümü vardır. Standart bir yapılandırma için bunlar yeterlidir, ancak farklı özelliklere ihtiyaç duyarsanız (güvenli sunucu, farklı bir veritabanı sürücüsü gibi), kendi PHP'nizi ve/veya HTTP sunucunuzu derlemeniz gerekebilir. Bu işleri yapacak tecrübeniz yoksa, sizin ihtiyaçlarınıza uygun olarak derlenmiş paketlerin olup olmadığını araştırmalısınız.
Aşağıdakiler, Mac OS üzerinde PHP için paket ve derlenmiş ikillerin kurulumunu kolaylaştıracaktır:
OS X'in 10.0.0 sürümünden itibaren PHP Meklerde standart hale geldi. PHP'yi öntanımlı HTTP sunucusunda etkin kılmak için Apache yapılandırma dosyası httpd.conf'ta bir kaç satırı etkin duruma getirmek gerekir, bunun yanında CGI ve/veya CLI öntanımlı olarak etkin (Terminal programından kolayca erişilebilir) kılınabilir.
Aşağıdaki talimatları kullanarak PHP'yi etkin kılmak demek çabucak bir yerel geliştirme ortamına sahip olmak demektir. Daima PHP'nin en yeni sürümünü kullanmanızı hararetle öneririz. Gelişimi sürmekte olan çoğu yazılım gibi yeni sürümlerde eski hatalar sürekli düzeltilmekte ve yeni özellikler eklenmektedir. Ayrıntılar için MAC OS X kurulum belgelerine bakınız. Aşağıdaki talimatların ayrıntı düzeyi başlangıç düzeyinde bir kullanıcıya göre olup öntanımlı ayarlarla çalışmak üzere düzenlenmiştir. Daha yeni sürümlerin derlenmesi veya daha yeni paketlerin kurulması tüm kullanıcılara tavsiye edilmektedir.
Standard kurulum türü mod_php kullanmak olup Mac OS X üzerinde Apache HTTP Sunucusu için mod_php'yi etkin kılmak (öntanımlı HTTP sunucusuna Sistem Tercihlerinden erişilebilir) amacıyla şu adımlar izlenmelidir:
Bilginize: Dosyayı açmanın tek yolu Terminal'de nano gibi Unix temelli bir metin düzenleyici kullanmaktır. Dosyanın sahibi root olduğundan dosyayı (root olarak) açmak için Terminal'de sudo komutunu kullanmalıyız (root parolası istenecektir): sudo nano /etc/apache2/httpd.conf Önemli nano komutları: ^w (arama), ^o (kayıt), and ^x (çıkış). Burada ^ imi, Ctrl tuşu anlamındadır.
Bilginize: Mac OS X'in 10.5'ten önceki sürümleri PHP ve Apache'nin eski sürümleriyle gelir. Böyle makinelerde Apache yapılandırma dosyası /etc/httpd/httpd.conf olabilir.
Bir metin düzenleyici ile aşağıdaki satırların başlarındaki # imlerini kaldırın (bu iki satır genelde birarada değildir, onları arayıp bulmalısınız):
# LoadModule php5_module libexec/httpd/libphp5.so # AddModule mod_php5.c
PHP olarak yorumlanacak uzantıları belirleyiniz (örnekler: .php .html ve .inc)
(Mac Panther'den itibaren) httpd.conf dosyasında bulunan aşağıdaki deyimden dolayı PHP etkin kılındığı anda .php uzantılı dosyalar özdevinimli olarak PHP tarafından yorumlanır.
<IfModule mod_php5.c>
# php etkinse, .php ve .phps dosyalarını yorumlasın isteriz.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# Çoğu kullanıcı index.php'yi ister
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
Bilginize: OS X 10.5 (Leopard) öncesinde, PHP 5 yerine PHP 4 kullanılırdı; dolayısıyla yukarıdaki 5'leri 4'lere çevirmeniz gerekir.
phpinfo() işlevi PHP ile ilgili bilgileri gösterir. Aşağıdaki içeriğe sahip bir dosyayı belge kök dizininde oluşturun:
<?php phpinfo(); ?>
CLI (veya eski sürümlerde CGI) çalıştırılabilirinin ismi php olup genellikle bulunduğu yer /usr/bin/php'dir. PHP kılavuzunun komut satırı bölümünü okuyun ve Terminal'i açıp PHP çalıştırılabilirinin sürümünü öğrenmek için php -v komutunu çalıştırın. phpinfo() işlevine yapılacak bir çağrı da bu bilgiyi gösterecektir.
Tar paketlerini açıp aşağıdaki gibi Apache configure betiğini çalıştırın:
./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache
Derleyicinin bazı en iyilemeler yapmasını isterseniz şu satırı da ekleyebilirsiniz:
setenv OPTIM=-O2
PHP 4 kaynak dizinine geçin ve PHP'yi yapılandırın:
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--mandir=/usr/share/man \
--with-xml \
--with-apache=/src/apache_1.3.12
Başka eklentilerin de (MySQL, GD, ve benzeri) kurulmasını istiyorsanız onları da buraya ekleyin. --with-apache seçeneğine Apache kaynak dizininizi yazın (örn, /src/apache_1.3.12).
Artık Apache'yi PHP 4 ile birlikte yeniden derleyebilirsiniz:
./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache \ --activate-module=src/modules/php4/libphp4.a
libmodphp4.a dosyasının güncel olmadığına dair bir hata iletisi alabilirsiniz. Bu durumda, Apacha kaynak ağacının src/modules/php4 dizinine geçip şu komutu verin: ranlib libmodphp4.a. Bu, ilintileme tablosunu güncel hale getirecektir. Ardından kaynak ağacının kök dizinine dönüp yukarıdaki configure komutunu tekrar çalıştırın. Ardından tekrar make ve make install yapın.
cp php.ini-development /usr/local/bin/php.ini
veya (/usr/local dizinine kurmuyorsanız)
cp php.ini-development /usr/bin/php.ini
.
Aşağıdaki talimatlar MacOS X'de bir PHP modülünü Apache HTTP sunucusuna kurmanıza yardımcı olacak. Bu sürüm MySQL, PostgreSQL ve iODBC veritabanlarından başka, cURL, GD, PDFLib, LDAP, vs. desteğini de içermektedir. Bu talimatlar » Marc Liyanage tarafından sağlanmıştır.
Bunu yaparken dikkatli olun, yoksa Apache HTTP sunucunuzu bozabilirsiniz!
Bilginize: Bu talimatlar sadece Apple tarafından dağıtılan özgün Apache HTTP sunucusunda çalışır. Apache’yi günceller veya yeniden derlerseniz PHP modülünü de yeniden derleyip kurmanız gerekir.
Kurulumu gerçekleştirmek için:
wget http://www2.entropy.ch/download/entropy-php-5.2.4-1.tar.gz
wget
http://www2.entropy.ch/download/entropy-php-5.2.4-1-apache2.tar.gz
Hepsi bu kadar! Artık PHP çalışıyor olmalı. Bunu ev dizininizdeki Sites dizinine dnm.php adında bir dosyayı yerleştirip deneyebilirsiniz. Bu dosyaya şu satırı yazın: <?php phpinfo() ?>
Şimdi tarayıcınızda 127.0.0.1/~kullanıcı_adınız/dnm.php sayfasını açın. PHP modülünüz hakkında bilgi içeren bir durum tablosu görüyor olmalısınız.
Bu bölümdeki bilgiler Windows 98/Me ve Windows NT/2000/XP/2003 içindir. PHP, Windows 3.1 gibi 16 bitlik platformlarda çalışmaz ve bazen desteklenen Windows platformlarından Win32 olarak bahsederiz. Windows 95, PHP 4.3.0'dan beri desteklenmemektedir.
Bilginize: Windows 98/ME/NT4, PHP 5.3.0'dan beri desteklenmemektedir.
Bilginize: Windows 95, PHP 4.3.0'dan beri desteklenmemektedir.
PHP'yi Windows'a kurmanın başlıca iki yolu vardır: Ya el yordamıyla kurarsınız ya da kurucuyu kullanırsınız.
Microsoft Visual Studio'ya sahipseniz PHP'yi kaynak kodundan da derleyebilirsiniz.
PHP'yi Windows sisteminize kurduktan sonra çeşitli eklentiler yüklemek suretiyle işlevselliğini arttırabilirsiniz.
Genel Ağ'da çeşitli hepsibiyerde kurucular bulabilirsiniz fakat bunların hiçbiri PHP.net tarafından desteklenmez. Sisteminizin güvenliği ve verimliliği açısından en iyi seçimin » http://www.php.net/downloads.php adresinden edinebileceğiniz resmi Windows paketleri olduğuna inanıyoruz.
The Windows PHP installer is available from the downloads page at » http://www.php.net/downloads.php. This installs the CGI version of PHP and for IIS, PWS, and Xitami, it configures the web server as well. The installer does not include any extra external PHP extensions (php_*.dll) as you'll only find those in the Windows Zip Package and PECL downloads.
Bilginize: While the Windows installer is an easy way to make PHP work, it is restricted in many aspects as, for example, the automatic setup of extensions is not supported. Use of the installer isn't the preferred method for installing PHP.
First, install your selected HTTP (web) server on your system, and make sure that it works.
Run the executable installer and follow the instructions provided by the installation wizard. Two types of installation are supported - standard, which provides sensible defaults for all the settings it can, and advanced, which asks questions as it goes along.
The installation wizard gathers enough information to set up the php.ini file, and configure certain web servers to use PHP. One of the web servers the PHP installer does not configure for is Apache, so you'll need to configure it manually.
Once the installation has completed, the installer will inform you if you need to restart your system, restart the server, or just start using PHP.
Be aware, that this setup of PHP is not secure. If you would like to have a secure PHP setup, you'd better go on the manual way, and set every option carefully. This automatically working setup gives you an instantly working PHP installation, but it is not meant to be used on online servers.
The Windows PHP installer for later versions of PHP is built using MSI technology using the Wix Toolkit (» http://wix.sourceforge.net/). It will install and configure PHP and all the built-in and PECL extensions, as well as configure many of the popular web servers such as IIS, Apache, and Xitami.
First, install your selected HTTP (web) server on your system, and make sure that it works. Then proceed with one of the following install types.
Run the MSI installer and follow the instructions provided by the installation wizard. You will be prompted to select the Web Server you wish to configure first, along with any configuration details needed.
You will then be prompted to select which features and extensions you wish to install and enable. By selecting "Will be installed on local hard drive" in the drop-down menu for each item you can trigger whether to install the feature or not. By selecting "Entire feature will be installed on local hard drive", you will be able to install all sub-features of the included feature ( for example by selecting this options for the feature "PDO" you will install all PDO Drivers ).
It is not recommended to install all extensions by default, since many other them require dependencies from outside PHP in order to function properly. Instead, use the Installation Repair Mode that can be triggered thru the 'Add/Remove Programs' control panel to enable or disable extensions and features after installation.
The installer then sets up PHP to be used in Windows and the php.ini file, and configures certain web servers to use PHP. The installer will currently configure IIS, Apache, Xitami, and Sambar Server; if you are using a different web server you'll need to configure it manually.
The installer also supports a silent mode, which is helpful for Systems Administrators to deploy PHP easily. To use silent mode:
msiexec.exe /i php-VERSION-win32-install.msi /q
You can control the install directory by passing it as a parameter to the install. For example, to install to e:\php:
msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
You can also specify what features to install. For example, to install the mysqli extension and the CGI executable:
msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli
The current list of Features to install is as follows:
MainExecutable - php.exe executable ( no longer available as of PHP 5.2.10/5.3.0; it is now included by default ) ScriptExecutable - php-win.exe executable ext_php_* - the various extensions ( for example: ext_php_mysql for MySQL ) apache13 - Apache 1.3 module apache20 - Apache 2.0 module apache22 - Apache 2,2 module apacheCGI - Apache CGI executable iis4ISAPI - IIS ISAPI module iis4CGI - IIS CGI executable iis4FastCGI - IIS CGI executable NSAPI - Sun/iPlanet/Netscape server module netserve - NetServe Web Server CGI executable Xitami - Xitami CGI executable Sambar - Sambar Server ISAPI module CGI - php-cgi.exe executable PEAR - PEAR installer Manual - PHP Manual in CHM Format
For more information on installing MSI installers from the command line, visit » http://msdn.microsoft.com/en-us/library/aa367988.aspx
To upgrade, run the installer either graphically or from the command line as normal. The installer will read your current install options, remove your old installation, and reinstall PHP with the same options as before. It is recommended that you use this method of keeping PHP updated instead of manually replacing the files in the installation directory.
This section contains instructions for manually installing and configuring PHP on Microsoft Windows. For the instructions on how to use PHP installer to setup and configure PHP and a web server on Windows refer to Windows Installer (PHP 5.2 and later).
Download the PHP zip binary distribution from » PHP for Windows: Binaries and Sources. There are several different versions of the zip package - chose the version that is suitable for the web server being used:
If PHP is used with IIS then choose PHP 5.3 VC9 Non Thread Safe or PHP 5.2 VC6 Non Thread Safe;
If PHP is used with Apache 1 or Apache 2 then choose PHP 5.3 VC6 or PHP 5.2 VC6.
Bilginize: VC9 Versions are compiled with the Visual Studio 2008 compiler and have improvements in performance and stability. The VC9 versions require you to have the » Microsoft 2008 C++ Runtime (x86) or the » Microsoft 2008 C++ Runtime (x64) installed.
Unpack the content of the zip archive into a directory of your choice, for example C:\PHP\. The directory and file structure extracted from the zip will look as below:
Örnek 1 PHP 5 package structure
c:\php | +--dev | | | |-php5ts.lib -- php5.lib in non thread safe version | +--ext -- extension DLLs for PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--extras -- empty | +--pear -- initial copy of PEAR | | |-go-pear.bat -- PEAR setup script | |-... | |-php-cgi.exe -- CGI executable | |-php-win.exe -- executes scripts without an opened command prompt | |-php.exe -- Command line PHP executable (CLI) | |-... | |-php.ini-development -- default php.ini settings | |-php.ini-production -- recommended php.ini settings | |-php5apache2_2.dll -- does not exist in non thread safe version | |-php5apache2_2_filter.dll -- does not exist in non thread safe version | |-... | |-php5ts.dll -- core PHP DLL ( php5.dll in non thread safe version) | |-...
Below is the list of the modules and executables included in the PHP zip distribution:
go-pear.bat - the PEAR setup script. Refer to » Installation (PEAR) for more details.
php-cgi.exe - CGI executable that can be used when running PHP on IIS via CGI or FastCGI.
php-win.exe - the PHP executable for executing PHP scripts without using a command line window (for example PHP applications that use Windows GUI).
php.exe - the PHP executable for executing PHP scripts within a command line interface (CLI).
php5apache2_2.dll - Apache 2.2.X module.
php5apache2_2_filter.dll - Apache 2.2.X filter.
After the php package content has been extracted, copy the php.ini-production into php.ini in the same folder. If necessary, it is also possible to place the php.ini into any other location of your choice but that will require additional configuration steps as described in PHP Configuration.
The php.ini file tells PHP how to configure itself, and how to work with the environment that it runs in. Here are a number of settings for the php.ini file that help PHP work better with Windows. Some of these are optional. There are many other directives that may be relevant to your environment - refer to the list of php.ini directives for more information.
Required directives:
extension_dir = <path to extension directory> - The extension_dir needs to point to the directory where PHP extensions files are stored. The path can be absolute (i.e. "C:\PHP\ext") or relative (i.e. ".\ext"). Extensions that are listed lower in the php.ini file need to be located in the extension_dir.
extension = xxxxx.dll - For each extension you wish to enable, you need a corresponding "extension=" directive that tells PHP which extensions in the extension_dir to load at startup time.
log_errors = On - PHP has an error logging facility that can be used to send errors to a file, or to a service (i.e. syslog) and works in conjunction with the error_log directive below. When running under IIS, the log_errors should be enabled, with a valid error_log.
error_log = <path to the error log file> - The error_log needs to specify the absolute, or relative path to the file where PHP errors should be logged. This file needs to be writable for the web server. The most common places for this file are in various TEMP directories, for example "C:\inetpub\temp\php-errors.log".
cgi.force_redirect = 0 - This directive is required for running under IIS. It is a directory security facility required by many other web servers. However, enabling it under IIS will cause the PHP engine to fail on Windows.
cgi.fix_pathinfo = 1 - This lets PHP access real path info following the CGI Spec. The IIS FastCGI implementation needs this set.
fastcgi.impersonate = 1 - FastCGI under IIS supports the ability to impersonate security tokens of the calling client. This allows IIS to define the security context that the request runs under.
fastcgi.logging = 0 - FastCGI logging should be disabled on IIS. If it is left enabled, then any messages of any class are treated by FastCGI as error conditions which will cause IIS to generate an HTTP 500 exception.
Optional directives
max_execution_time = ## - This directive tells PHP the maximum amount of time that it can spend executing any given script. The default for this is 30 seconds. Increase the value of this directive if PHP application take long time to execute.
memory_limit = ###M - The amount of memory available for the PHP process, in Megabytes. The default is 128, which is fine for most PHP applications. Some of the more complex ones might need more.
display_errors = Off - This directive tells PHP whether to include any error messages in the stream that it returns to the Web server. If this is set to "On", then PHP will send whichever classes of errors that you define with the error_reporting directive back to web server as part of the error stream. For security reasons it is recommended to set it to "Off" on production servers in order not to reveal any security sensitive information that is often included in the error messages.
open_basedir = <paths to directories, separated by semicolon>, e.g. openbasedir="C:\inetpub\wwwroot;C:\inetpub\temp". This directive specified the directory paths where PHP is allowed to perform file system operations. Any file operation outside of the specified paths will result in an error. This directive is especially useful for locking down the PHP installation in shared hosting environments to prevent PHP scripts from accessing any files outside of the web site's root directory.
upload_max_filesize = ###M and post_max_size = ###M - The maximum allowed size of an uploaded file and post data respectively. The values of these directives should be increased if PHP applications need to perform large uploads, such as for example photos or video files.
PHP is now setup on your system. The next step is to choose a web server, and enable it to run PHP. Choose a web server from the table of contents.
In addition to running PHP via a web server, PHP can run from the command line just like a .BAT script. See Command Line PHP on Microsoft Windows for further details.
This section contains notes specific to the ActiveScript installation.
ActiveScript is a Windows only SAPI that enables you to use PHP script in any ActiveScript compliant host, like Windows Script Host, ASP/ASP.NET, Windows Script Components or Microsoft Scriptlet control.
As of PHP 5.0.1, ActiveScript has been moved to the » PECL repository. Bu PECL eklentisi için bir DLL mevcut değildir. Ayrıca, Windows üzerinde kurulum bölümüne de bakınız.
Bilginize: You should read the manual installation steps first!
After installing PHP, you should download the ActiveScript DLL (php5activescript.dll) and place it in the main PHP folder (e.g. C:\php).
After having all the files needed, you must register the DLL on your system. To achieve this, open a Command Prompt window (located in the Start Menu). Then go to your PHP directory by typing something like cd C:\php. To register the DLL just type regsvr32 php5activescript.dll.
To test if ActiveScript is working, create a new file, named test.wsf (the extension is very important) and type:
<job id="test">
<script language="PHPScript">
$WScript->Echo("Hello World!");
</script>
</job>
Save and double-click on the file. If you receive a little window saying "Hello World!" you're done.
Bilginize: In PHP 4, the engine was named 'ActivePHP', so if you are using PHP 4, you should replace 'PHPScript' with 'ActivePHP' in the above example.
Bilginize: ActiveScript doesn't use the default php.ini file. Instead, it will look only in the same directory as the .exe that caused it to load. You should create php-activescript.ini and place it in that folder, if you wish to load extensions, etc.
This section contains PHP installation instructions specific to Microsoft Internet Information Services (IIS).
This section contains instructions for manually setting up Internet Information Services (IIS) 5.1 and IIS 6.0 to work with PHP on Microsoft Windows XP and Windows Server 2003. For instructions on setting up IIS 7.0 and later versions on Windows Vista, Windows Server 2008, Windows 7 and Windows Server 2008 R2 refer to Microsoft IIS 7.0 and later.
Download and install PHP in accordance to the instructions described in manual installation steps
Bilginize: Non-thread-safe build of PHP is recommended when using IIS. The non-thread-safe builds are available at » PHP for Windows: Binaries and Sources Releases.
Configure the CGI- and FastCGI-specific settings in php.ini file as shown below:
Örnek 1 CGI and FastCGI settings in php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Download and install the » Microsoft FastCGI Extension for IIS 5.1 and 6.0. The extension is available for 32-bit and 64-bit platforms - select the right download package for your platform.
Configure the FastCGI extension to handle PHP-specific requests by running the command shown below. Replace the value of the "-path" parameter with the absolute file path to the php-cgi.exe file.
Örnek 2 Configuring FastCGI extension to handle PHP requests
cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe"
This command will create an IIS script mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI extension. Also, it will configure FastCGI extension to use the executable php-cgi.exe to process the PHP requests.
Bilginize: At this point the required installation and configuration steps are completed. The remaining instructions below are optional but highly recommended for achieving optimal functionality and performance of PHP on IIS.
It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by the fastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each others' files as long as different user accounts are used for IIS authentication on each web site.
For example IIS 5.1 and IIS 6.0, in its default configuration, has anonymous authentication enabled with built-in user account IUSR_<MACHINE_NAME> used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR_<MACHINE_NAME> account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR_<MACHINE_NAME> account should have write permission to those.
To determine which user account is used by IIS anonymous authentication, follow these steps:
In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
Expand the list of web sites under the "Web Sites" node in the tree view, right-click on a web site that is being used and select "Properties";
Click the "Directory Security" tab;
Take note of a "User name:" field in the "Authentication Methods" dialog
To modify the permissions settings on files and folders, use the Windows Explorer user interface or icacls command.
Örnek 3 Configuring file access permissions
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, follow these steps:
In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
Right-click on the "Web Sites" node in the tree view and select "Properties";
Click the "Documents" tab;
Click the "Add..." button and enter "index.php" for the "Default content page:".
Configure IIS FastCGI extension settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single php-cgi.exe process before FastCGI extension shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTS controls how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGI InstanceMaxRequests setting is less than or equal to the value specified for PHP_FCGI_MAX_REQUESTS.
Örnek 4 Configuring FastCGI and PHP recycling
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000
Increase the timeout settings for FastCGI extension if there are applications that have long running PHP scripts. The two settings that control timeouts are ActivityTimeout and RequestTimeout. Refer to » Configuring FastCGI Extension for IIS 6.0 for more information about those settings.
Örnek 5 Configuring FastCGI timeout settings
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90
PHP searches for php.ini file in several locations and it is possible to change the default locations of php.ini file by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable.
Örnek 6 Changing the location of php.ini file
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:\Some\Directory\"
This section contains instructions for manually setting up Internet Information Services (IIS) 7.0 and later to work with PHP on Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 and Windows Server 2008 R2. For instructions on setting up IIS 5.1 and IIS 6.0 on Windows XP and Windows Server 2003 refer to Microsoft IIS 5.1 and IIS 6.0.
FastCGI module is disabled in default installation of IIS. The steps to enable it differ based on the version of Windows being used.
To enable FastCGI support on Windows Vista SP1 and Windows 7:
In the Windows Start Menu choose "Run:", type "optionalfeatures.exe" and click "Ok";
In the "Windows Features" dialog expand "Internet Information Services", "World Wide Web Services", "Application Development Features" and then enable the "CGI" checkbox;
Click OK and wait until the installation is complete.
To enable FastCGI support on Windows Server 2008 and Windows Server 2008 R2:
In the Windows Start Menu choose "Run:", type "CompMgmtLauncher" and click "Ok";
If the "Web Server (IIS)" role is not present under the "Roles" node, then add it by clicking "Add Roles";
If the "Web Server (IIS)" role is present, then click "Add Role Services" and then enable the "CGI" checkbox under "Application Development" group;
Click "Next" and then "Install" and wait for the installation to complete.
Download and install PHP in accordance to the instructions described in manual installation steps
Bilginize: Non-thread-safe build of PHP is recommended when using IIS. The non-thread-safe builds are available at » PHP for Windows: Binaries and Sources Releases.
Configure the CGI- and FastCGI-specific settings in php.ini file as shown below:
Örnek 1 CGI and FastCGI settings in php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Configure IIS handler mapping for PHP by using either IIS Manager user interface or a command line tool.
Follow these steps to create an IIS handler mapping for PHP in IIS Manager user interface:
In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
In the IIS Manager user interface select the server node in the "Connections" tree view;
In the "Features View" page open the "Handler Mappings" feature;
In the "Actions" pane click "Add Module Mapping...";
In the "Add Module Mapping" dialog enter the following:
Click "Request Restrictions" button and then configure the mapping to invoke handler only if request is mapped to a file or a folder;
Click OK on all the dialogs to save the configuration.
Use the command shown below to create an IIS FastCGI process pool which will use php-cgi.exe executable for processing PHP requests. Replace the value of the fullPath parameter with the absolute file path to the php-cgi.exe file.
Örnek 2 Creating IIS FastCGI process pool
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^ /+[fullPath='c:\PHP\php-cgi.exe']
Configure IIS to handle PHP specific requests by running the command shown below. Replace the value of the scriptProcessor parameter with the absolute file path to the php-cgi.exe file.
Örnek 3 Creating handler mapping for PHP requests
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^ /+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^ scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
This command creates an IIS handler mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI module.
Bilginize: At this point the required installation and configuration steps are completed. The remaining instructions below are optional but highly recommended for achieving optimal functionality and performance of PHP on IIS.
It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by the fastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each other's files as long as different user accounts are used for IIS authentication on each web site.
For example IIS 7, in its default configuration, has anonymous authentication enabled with built-in user account IUSR used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR account should have write permission to those.
To determine what user account is used as an anonymous identity in IIS 7 use the following command. Replace the "Default Web Site" with the name of IIS web site that you use. In the output XML configuration element look for the userName attribute.
Örnek 4 Determining the account used as IIS anonymous identity
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^
/section:anonymousAuthentication
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="IUSR" />
</authentication>
</security>
</system.webServer>
Bilginize: If userName attribute is not present in the anonymousAuthentication element, or is set to an empty string, then it means that the application pool identity is used as an anonymous identity for that web site.
To modify the permissions settings on files and folders, use the Windows Explorer user interface or icacls command.
Örnek 5 Configuring file access permissions
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, use this command:
Örnek 6 Set index.php as a default document in IIS
%windir%\system32\inetsrv\appcmd.exe set config ^ -section:system.webServer/defaultDocument /+"files.[value='index.php']" ^ /commit:apphost
Configure IIS FastCGI settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single php-cgi.exe process before IIS shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTS controls how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGI InstanceMaxRequests setting is less than or equal to the value specified for PHP_FCGI_MAX_REQUESTS.
Örnek 7 Configuring FastCGI and PHP recycling
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^
[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Increase the timeout settings for FastCGI if it is expected to have long running PHP scripts. The two settings that control timeouts are activityTimeout and requestTimeout. Use the commands below to change the timeout settings. Make sure to replace the value in the fullPath parameter to contain the absolute path to the php-cgi.exe file.
Örnek 8 Configuring FastCGI and PHP recycling
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
PHP searches for php.ini file in several locations and it is possible to change the default locations of php.ini file by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable.
Örnek 9 Changing the location of php.ini file
appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^ [name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
This section contains notes and hints specific to Apache 1.3.x installs of PHP on Microsoft Windows systems. There are also instructions and notes for Apache 2 on a separate page.
Bilginize: Please read the manual installation steps first!
There are two ways to set up PHP to work with Apache 1.3.x on Windows. One is to use the CGI binary (php.exe for PHP 4 and php-cgi.exe for PHP 5), the other is to use the Apache Module DLL. In either case you need to edit your httpd.conf to configure Apache to work with PHP, and then restart the server.
It is worth noting here that now the SAPI module has been made more stable under Windows, we recommend it's use above the CGI binary, since it is more transparent and secure.
Although there can be a few variations of configuring PHP under Apache, these are simple enough to be used by the newcomer. Please consult the Apache Documentation for further configuration directives.
After changing the configuration file, remember to restart the server, for example, NET STOP APACHE followed by NET START APACHE, if you run Apache as a Windows Service, or use your regular shortcuts.
Bilginize: Windows üzerinde, Apache yapılandırma dosyalarına c:\dizin\dosya.uzn gibi dosya yollarını eklerken tüm tersbölü çizgilerini normal bölü çizgilerine çevirmeyi unutmayınız: c:/dizin/dosya.uzn. Dizin yollarını eklerken sona da bir bölü çizgisi eklemeniz gerekebilir.
You should add the following lines to your Apache httpd.conf file:
Örnek 1 PHP as an Apache 1.3.x module
This assumes PHP is installed to c:\php. Adjust the path if this is not the case.
For PHP 4:
# Add to the end of the LoadModule section # Don't forget to copy this file from the sapi directory! LoadModule php4_module "C:/php/php4apache.dll" # Add to the end of the AddModule section AddModule mod_php4.c
For PHP 5:
# Add to the end of the LoadModule section LoadModule php5_module "C:/php/php5apache.dll" # Add to the end of the AddModule section AddModule mod_php5.c
For both:
# Add this line inside the <IfModule mod_mime.c> conditional brace AddType application/x-httpd-php .php # For syntax highlighted .phps files, also add AddType application/x-httpd-php-source .phps
If you unzipped the PHP package to C:\php\ as described in the Manual Installation Steps section, you need to insert these lines to your Apache configuration file to set up the CGI binary:
Örnek 2 PHP and Apache 1.3.x as CGI
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # For PHP 4 Action application/x-httpd-php "/php/php.exe" # For PHP 5 Action application/x-httpd-php "/php/php-cgi.exe" # specify the directory where php.ini is SetEnv PHPRC C:/php
Note that the second line in the list above can be found in the actual versions of httpd.conf, but it is commented out. Remember also to substitute the c:/php/ for your actual path to PHP.
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
If you would like to present PHP source files syntax highlighted, there is no such convenient option as with the module version of PHP. If you chose to configure Apache to use PHP as a CGI binary, you will need to use the highlight_file() function. To do this simply create a PHP script file and add this code: <?php highlight_file('some_php_script.php'); ?>.
This section contains notes and hints specific to Apache 2.0.x installs of PHP on Microsoft Windows systems. We also have instructions and notes for Apache 1.3.x users on a separate page.
Bilginize: You should read the manual installation steps first!
Bilginize: Apache 2.2.x Support
Users of Apache 2.2.x may use the documentation below except the appropriate DLL file is named php5apache2_2.dll and it only exists as of PHP 5.2.0. See also » http://snaps.php.net/
Apache 2'nin bir hizmet ortamında evreli MPM'lerle kullanımını önermiyoruz. Bunun yerine prefork MPM'sini veya Apache 1 kullanmanızı öneririz. Bunun sebebini SSS altında Apache ve evreli MPM'ler başlığı altında bulabilirsiniz.
You are highly encouraged to take a look at the » Apache Documentation to get a basic understanding of the Apache 2.0.x Server. Also consider to read the » Windows specific notes for Apache 2.0.x before reading on here.
Bilginize: PHP ve Apache 2.0.x uyumluluk bilgileri
Aşağıdaki PHP sürümlerinin Apache 2.0.x'in en son sürümleri ile çalıştığı bilinmektedir:
- PHP 4.3.0 ve sonrası » http://www.php.net/downloads.php adresinden indirilebilir.
- En son kararlı geliştirme sürümü. Kaynak kod paketini » http://snaps.php.net/php5-latest.tar.gz olarak, Windows çalıştırılabilirlerini ise » http://snaps.php.net/win32/php5-win32-latest.zip olarak indirebilirsiniz.
- Kararlı sürüm adayı sürümü » http://qa.php.net/ adresinden indirebilirsiniz.
- PHP'yi » anonim SVN'den indirme seçeneği elbette daima mevcut.
PHP'nin bu sürümleri Apache 2.0.40 ve sonrası ile uyumludur.
Apache 2.0 SAPI desteği PHP 4.2.0 ile başlamıştır. PHP'nin 4.2.3 sürümü Apache 2.0.39'da çalışır. PHP'nin 4.2.3 sürümünü bundan başka bir Apache sürümü ile kullanmayın. Ancak, PHP'nin 4.3.0 ve sonraki sürümlerini Apache2'nin en son sürümleri ile gönül rahatlığıyla kullanabilirsiniz.
PHP'nin bahsi geçen bütün sürümleri hala Apache 1.3.x ile çalışmaktadır. Apache 2.x.x'in Apache 1.3.x ile uyumlu (tek evreli çok süreçli) yapılandırmaları ile de aynı durum sözkonusudur.
Apache 2.0.x is designed to run on Windows NT 4.0, Windows 2000 or Windows XP. At this time, support for Windows 9x is incomplete. Apache 2.0.x is not expected to work on those platforms at this time.
Download the most recent version of » Apache 2.0.x and a fitting PHP version. Follow the Manual Installation Steps and come back to go on with the integration of PHP and Apache.
There are two ways to set up PHP to work with Apache 2.0.x on Windows. One is to use the CGI binary the other is to use the Apache module DLL. In either case you need to edit your httpd.conf to configure Apache to work with PHP and then restart the server.
Bilginize: Windows üzerinde, Apache yapılandırma dosyalarına c:\dizin\dosya.uzn gibi dosya yollarını eklerken tüm tersbölü çizgilerini normal bölü çizgilerine çevirmeyi unutmayınız: c:/dizin/dosya.uzn. Dizin yollarını eklerken sona da bir bölü çizgisi eklemeniz gerekebilir.
You need to insert these three lines to your Apache httpd.conf configuration file to set up the CGI binary:
Örnek 1 PHP and Apache 2.0 as CGI
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # For PHP 4 Action application/x-httpd-php "/php/php.exe" # For PHP 5 Action application/x-httpd-php "/php/php-cgi.exe"
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
You need to insert these two lines to your Apache httpd.conf configuration file to set up the PHP module for Apache 2.0:
Örnek 2 PHP and Apache 2.0 as Module
# For PHP 4 do something like this: LoadModule php4_module "c:/php/php4apache2.dll" # Don't forget to copy the php4apache2.dll file from the sapi directory! AddType application/x-httpd-php .php # For PHP 5 do something like this: LoadModule php5_module "c:/php/php5apache2.dll" AddType application/x-httpd-php .php # configure the path to php.ini PHPIniDir "C:/php"
Bilginize: Remember to substitute your actual path to PHP for the c:/php/ in the above examples. Take care to use either php4apache2.dll or php5apache2.dll in your LoadModule directive and not php4apache.dll or php5apache.dll as the latter ones are designed to run with Apache 1.3.x.
Bilginize: If you want to use content negotiation, read related FAQ.
Don't mix up your installation with DLL files from different PHP versions. You have the only choice to use the DLL's and extensions that ship with your downloaded PHP version.
This section contains notes and hints specific to Sun Java System Web Server, Sun ONE Web Server, iPlanet and Netscape server installs of PHP on Windows.
From PHP 4.3.3 on you can use PHP scripts with the NSAPI module to generate custom directory listings and error pages. Additional functions for Apache compatibility are also available. For support in current web servers read the note about subrequests.
To install PHP as a CGI handler, do the following:
Make a file association from the command line. Type the following two lines:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
More details about setting up PHP as a CGI executable can be found here: » http://benoit.noss.free.fr/php/install-php.html
To install PHP with NSAPI, do the following:
Make a file association from the command line. Type the following two lines:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Edit magnus.conf (for servers >= 6) or obj.conf (for servers < 6) and add the following: You should place the lines after mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll" Init fn="php4_init" LateInit="yes" errorString="Failed to initialise PHP!" [php_ini="c:/path/to/php.ini"]
(PHP >= 4.3.3) The php_ini parameter is optional but with it you can place your php.ini in your web server configuration directory.
Configure the default object in obj.conf (for virtual server classes [Sun Web Server 6.0+] in their vserver.obj.conf): In the <Object name="default"> section, place this line necessarily after all 'ObjectType' and before all 'AddLog' lines:
Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...]
(PHP >= 4.3.3) As additional parameters you can add some special php.ini-values, for example you can set a docroot="/path/to/docroot" specific to the context php4_execute is called. For boolean ini-keys please use 0/1 as value, not "On","Off",... (this will not work correctly), e.g. zlib.output_compression=1 instead of zlib.output_compression="On"
This is only needed if you want to configure a directory that only consists of PHP scripts (same like a cgi-bin directory):
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
After that you can configure a directory in the Administration server and assign it the style x-httpd-php. All files in it will get executed as PHP. This is nice to hide PHP usage by renaming files to .html.
Bilginize: More details about setting up PHP as an NSAPI filter can be found here: » http://benoit.noss.free.fr/php/install-php4.html
Bilginize: The stacksize that PHP uses depends on the configuration of the web server. If you get crashes with very large PHP scripts, it is recommended to raise it with the Admin Server (in the section "MAGNUS EDITOR").
Important when writing PHP scripts is the fact that Sun JSWS/Sun ONE WS/iPlanet/Netscape is a multithreaded web server. Because of that all requests are running in the same process space (the space of the web server itself) and this space has only one environment. If you want to get CGI variables like PATH_INFO, HTTP_HOST etc. it is not the correct way to try this in the old PHP way with getenv() or a similar way (register globals to environment, $_ENV). You would only get the environment of the running web server without any valid CGI variables!
Bilginize: Why are there (invalid) CGI variables in the environment?
Answer: This is because you started the web server process from the admin server which runs the startup script of the web server, you wanted to start, as a CGI script (a CGI script inside of the admin server!). This is why the environment of the started web server has some CGI environment variables in it. You can test this by starting the web server not from the administration server. Use the command line as root user and start it manually - you will see there are no CGI-like environment variables.
Simply change your scripts to get CGI variables in the correct way for PHP 4.x by using the superglobal $_SERVER. If you have older scripts which use $HTTP_HOST, etc., you should turn on register_globals in php.ini and change the variable order too (important: remove "E" from it, because you do not need the environment here):
variables_order = "GPCS" register_globals = On
You can use PHP to generate the error pages for "404 Not Found" or similar. Add the following line to the object in obj.conf for every error page you want to overwrite:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
where XXX is the HTTP error code. Please delete any other Error directives which could interfere with yours. If you want to place a page for all errors that could exist, leave the code parameter out. Your script can get the HTTP status code with $_SERVER['ERROR_TYPE'].
Another possibility is to generate self-made directory listings. Just create a PHP script which displays a directory listing and replace the corresponding default Service line for type="magnus-internal/directory" in obj.conf with the following:
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
For both error and directory listing pages the original URI and translated URI are in the variables $_SERVER['PATH_INFO'] and $_SERVER['PATH_TRANSLATED'].
The NSAPI module now supports the nsapi_virtual() function (alias: virtual()) to make subrequests on the web server and insert the result in the web page. The problem is, that this function uses some undocumented features from the NSAPI library.
Under Unix this is not a problem, because the module automatically looks for the needed functions and uses them if available. If not, nsapi_virtual() is disabled.
Under Windows limitations in the DLL handling need the use of a automatic detection of the most recent ns-httpdXX.dll file. This is tested for servers till version 6.1. If a newer version of the Sun server is used, the detection fails and nsapi_virtual() is disabled.
If this is the case, try the following: Add the following parameter to php4_init in magnus.conf/obj.conf:
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
where XX is the correct DLL version number. To get it, look in the server-root for the correct DLL name. The DLL with the biggest filesize is the right one.
You can check the status by using the phpinfo() function.
Bilginize: But be warned: Support for nsapi_virtual() is EXPERIMENTAL!!!
This section contains notes and hints specific to » OmniHTTPd on Windows.
Bilginize: You should read the manual installation steps first!
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
You need to complete the following steps to make PHP work with OmniHTTPd. This is a CGI executable setup. SAPI is supported by OmniHTTPd, but some tests have shown that it is not so stable to use PHP as an ISAPI module.
Bilginize: Important for CGI users
Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0.
Install OmniHTTPd server.
Right click on the blue OmniHTTPd icon in the system tray and select Properties
Click on Web Server Global Settings
On the 'External' tab, enter: virtual = .php | actual = c:\php\php.exe (use php-cgi.exe if installing PHP 5), and use the Add button.
On the Mime tab, enter: virtual = wwwserver/stdcgi | actual = .php, and use the Add button.
Click OK
Repeat steps 2 - 6 for each extension you want to associate with PHP.
Bilginize: Some OmniHTTPd packages come with built in PHP support. You can choose at setup time to do a custom setup, and uncheck the PHP component. We recommend you to use the latest PHP binaries. Some OmniHTTPd servers come with PHP 4 beta distributions, so you should choose not to set up the built in support, but install your own. If the server is already on your machine, use the Replace button in Step 4 and 5 to set the new, correct information.
This section contains notes and hints specific to the » Sambar Server for Windows.
Bilginize: You should read the manual installation steps first!
This list describes how to set up the ISAPI module to work with the Sambar server on Windows.
Find the file called mappings.ini (in the config directory) in the Sambar install directory.
Open mappings.ini and add the following line under [ISAPI]:
Örnek 1 ISAPI configuration of Sambar
#for PHP 4 *.php = c:\php\php4isapi.dll #for PHP 5 *.php = c:\php\php5isapi.dll
(This line assumes that PHP was installed in c:\php.)
Now restart the Sambar server for the changes to take effect.
Bilginize: If you intend to use PHP to communicate with resources which are held on a different computer on your network, then you will need to alter the account used by the Sambar Server Service. The default account used for the Sambar Server Service is LocalSystem which will not have access to remote resources. The account can be amended by using the Services option from within the Windows Control Panel Administation Tools.
This section contains notes and hints specific to » Xitami on Windows.
Bilginize: You should read the manual installation steps first!
This list describes how to set up the PHP CGI binary to work with Xitami on Windows.
Bilginize: Important for CGI users
Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0. If you want to use $_SERVER['PHP_SELF'] you have to enable the cgi.fix_pathinfo directive.
CGI kipinde çalışan bir sunucu olası saldırılara açık hale gelir. Sunucunuzu böyle saldırılardan nasıl koruyacağınızı öğrenmek için CGI güvenliği bölümünü okuyunuz.
Make sure the web server is running, and point your browser to xitamis admin console (usually http://127.0.0.1/admin), and click on Configuration.
Navigate to the Filters, and put the extension which PHP should parse (i.e. .php) into the field File extensions (.xxx).
In Filter command or script put the path and name of your PHP CGI executable i.e. C:\php\php.exe for PHP 4, or C:\php\php-cgi.exe for PHP 5.
Press the 'Save' icon.
Restart the server to reflect changes.
This chapter teaches how to compile PHP from sources on windows, using Microsoft's tools. To compile PHP with cygwin, please refer to Unix Sistemlere Kurulum.
This chapter is outdated therefore it's temporarily been removed from the manual. For now, consider the following:
After installing PHP and a web server on Windows, you will probably want to install some extensions for added functionality. You can choose which extensions you would like to load when PHP starts by modifying your php.ini. You can also load a module dynamically in your script using dl().
The DLLs for PHP extensions are prefixed with php_.
Many extensions are built into the Windows version of PHP. This means additional DLL files, and the extension directive, are not used to load these extensions. The Windows PHP Extensions table lists extensions that require, or used to require, additional PHP DLL files. Here's a list of built in extensions:
In PHP 4 (updated PHP 4.3.11): BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC, Overload, PCRE, Session, Tokenizer, WDDX, XML ve Zlib
In PHP 5 (updated PHP 5.0.4), the following changes exist. Built in: DOM, LibXML, Iconv, SimpleXML, SPL ve SQLite. And the following are no longer built in: MySQL and Overload.
The default location PHP searches for extensions is C:\php4\extensions in PHP 4 and C:\php5 in PHP 5. To change this setting to reflect your setup of PHP edit your php.ini file:
You will need to change the extension_dir setting to point to the directory where your extensions lives, or where you have placed your php_*.dll files. For example:
extension_dir = C:\php\extensions
Enable the extension(s) in php.ini you want to use by uncommenting the extension=php_*.dll lines in php.ini. This is done by deleting the leading ; from the extension you want to load.
Örnek 1 Enable Bzip2 extension for PHP-Windows
// change the following line from ... ;extension=php_bz2.dll // ... to extension=php_bz2.dll
Some of the extensions need extra DLLs to work. Couple of them can be found in the distribution package, in the C:\php\dlls\ folder in PHP 4 or in the main folder in PHP 5, but some, for example Oracle (php_oci8.dll) require DLLs which are not bundled with the distribution package. If you are installing PHP 4, copy the bundled DLLs from C:\php\dlls folder to the main C:\php folder. Don't forget to include C:\php in the system PATH (this process is explained in a separate FAQ entry).
Some of these DLLs are not bundled with the PHP distribution. See each extensions documentation page for details. Also, read the manual section titled Installation of PECL extensions for details on PECL. An increasingly large number of PHP extensions are found in PECL, and these extensions require a separate download.
Bilginize: If you are running a server module version of PHP remember to restart your web server to reflect your changes to php.ini.
The following table describes some of the extensions available and required additional dlls.
| Extension | Description | Notes |
|---|---|---|
| php_bz2.dll | bzip2 compression functions | None |
| php_calendar.dll | Calendar conversion functions | Built in since PHP 4.0.3 |
| php_crack.dll | Crack functions | None |
| php_ctype.dll | ctype family functions | Built in since PHP 4.3.0 |
| php_curl.dll | CURL, Client URL library functions | Requires: libeay32.dll, ssleay32.dll (bundled) |
| php_dba.dll | DBA: DataBase (dbm-style) Abstraction layer functions | None |
| php_dbase.dll | dBase functions | None |
| php_dbx.dll | dbx functions | |
| php_domxml.dll | DOM XML functions | PHP <= 4.2.0 requires: libxml2.dll (bundled) PHP >= 4.3.0 requires: iconv.dll (bundled) |
| php_dotnet.dll | .NET functions | PHP <= 4.1.1 |
| php_exif.dll | EXIF functions | php_mbstring.dll. And, php_exif.dll must be loaded after php_mbstring.dll in php.ini. |
| php_fbsql.dll | FrontBase functions | PHP <= 4.2.0 |
| php_fdf.dll | FDF: Forms Data Format functions. | Requires: fdftk.dll (bundled) |
| php_filepro.dll | filePro functions | Read-only access |
| php_ftp.dll | FTP functions | Built-in since PHP 4.0.3 |
| php_gd.dll | GD library image functions | Removed in PHP 4.3.2. Also note that truecolor functions are not available in GD1, instead, use php_gd2.dll. |
| php_gd2.dll | GD library image functions | GD2 |
| php_gettext.dll | Gettext functions | PHP <= 4.2.0 requires gnu_gettext.dll (bundled), PHP >= 4.2.3 requires libintl-1.dll, iconv.dll (bundled). |
| php_hyperwave.dll | HyperWave functions | None |
| php_iconv.dll | ICONV characterset conversion | Requires: iconv-1.3.dll (bundled), PHP >=4.2.1 iconv.dll |
| php_ifx.dll | Informix functions | Requires: Informix libraries |
| php_iisfunc.dll | IIS management functions | None |
| php_imap.dll | IMAP POP3 and NNTP functions | None |
| php_ingres.dll | Ingres functions | Requires: Ingres libraries |
| php_interbase.dll | InterBase functions | Requires: gds32.dll (bundled) |
| php_java.dll | Java functions | PHP <= 4.0.6 requires: jvm.dll (bundled) |
| php_ldap.dll | LDAP functions | PHP <= 4.2.0 requires libsasl.dll (bundled), PHP >= 4.3.0 requires libeay32.dll, ssleay32.dll (bundled) |
| php_mbstring.dll | Multi-Byte String functions | None |
| php_mcrypt.dll | Mcrypt Encryption functions | Requires: libmcrypt.dll |
| php_mhash.dll | Mhash functions | PHP >= 4.3.0 requires: libmhash.dll (bundled) |
| php_mime_magic.dll | Mimetype functions | Requires: magic.mime (bundled) |
| php_ming.dll | Ming functions for Flash | None |
| php_msql.dll | mSQL functions | Requires: msql.dll (bundled) |
| php_mssql.dll | MSSQL functions | Requires: ntwdblib.dll (bundled) |
| php_mysql.dll | MySQL functions | PHP >= 5.0.0, requires libmysql.dll (bundled) |
| php_mysqli.dll | MySQLi functions | PHP >= 5.0.0, requires libmysql.dll (libmysqli.dll in PHP <= 5.0.2) (bundled) |
| php_oci8.dll | Oracle 8 functions | Requires: Oracle 8.1+ client libraries |
| php_openssl.dll | OpenSSL functions | Requires: libeay32.dll (bundled) |
| php_overload.dll | Object overloading functions | Built in since PHP 4.3.0 |
| php_pdf.dll | PDF functions | None |
| php_pgsql.dll | PostgreSQL functions | None |
| php_printer.dll | Printer functions | None |
| php_shmop.dll | Shared Memory functions | None |
| php_snmp.dll | SNMP get and walk functions | NT only! |
| php_soap.dll | SOAP functions | PHP >= 5.0.0 |
| php_sockets.dll | Socket functions | None |
| php_sybase_ct.dll | Sybase functions | Requires: Sybase client libraries |
| php_tidy.dll | Tidy functions | PHP >= 5.0.0 |
| php_tokenizer.dll | Tokenizer functions | Built in since PHP 4.3.0 |
| php_w32api.dll | W32api functions | None |
| php_xmlrpc.dll | XML-RPC functions | PHP >= 4.2.1 requires: iconv.dll (bundled) |
| php_xslt.dll | XSLT functions | PHP <= 4.2.0 requires sablot.dll, expat.dll (bundled). PHP >= 4.2.1 requires sablot.dll, expat.dll, iconv.dll (bundled). |
| php_yaz.dll | YAZ functions | Requires: yaz.dll (bundled) |
| php_zip.dll | Zip File functions | Read only access |
| php_zlib.dll | ZLib compression functions | Built in since PHP 4.3.0 |
This section contains notes and hints specific to getting PHP running from the command line for Windows.
Bilginize: You should read the manual installation steps first!
Getting PHP to run from the command line can be performed without making any changes to Windows.
C:\PHP5\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
But there are some easy steps that can be followed to make this simpler. Some of these steps should already have been taken, but are repeated here to be able to provide a complete step-by-step sequence.
Add the location of the PHP executable (php.exe, php-win.exe or php-cli.exe depending upon your PHP version and display preferences) to the PATH environment variable. Read more about how to add your PHP directory to PATH in the corresponding FAQ entry.
Add the .PHP extension to the PATHEXT environment variable. This can be done at the same time as amending the PATH environment variable. Follow the same steps as described in the FAQ but amend the PATHEXT environment variable rather than the PATH environment variable.
Bilginize: The position in which you place the .PHP will determine which script or program is executed when there are matching filenames. For example, placing .PHP before .BAT will cause your script to run, rather than the batch file, if there is a batch file with the same name.
Associate the .PHP extension with a file type. This is done by running the following command:
assoc .php=phpfile
Associate the phpfile file type with the appropriate PHP executable. This is done by running the following command:
ftype phpfile="C:\PHP5\php.exe" -f "%1" -- %~2
Following these steps will allow PHP scripts to be run from any directory without the need to type the PHP executable or the .PHP extension and all parameters will be supplied to the script for processing.
The example below details some of the registry changes that can be made manually.
Örnek 1 Registry changes
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php] @="phpfile" "Content Type"="application/php" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile] @="PHP Script" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 "AlwaysShowExt"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon] @="C:\\PHP5\\php-win.exe0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell] @="Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open] @="&Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command] @="\"C:\\PHP5\\php.exe\" -f \"%1\" -- %~2"
With these changes the same command can be written as:
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
script -arg1 -arg2 -arg3
Bilginize: There is a small problem if you intend to use this technique and use your PHP scripts as commandline filter, like the example below:
ordir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3You may find that the script simply hangs and nothing is output. To get this operational, you need to make another registry change.dir | script -arg1 -arg2 -arg3Further information regarding this issue can be found in this » Microsoft Knowledgebase Article : 321788.Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer] "InheritConsoleHandles"=dword:00000001
» PECL, » PEAR üzerinden kullanılabililen bir PHP eklentileri deposudur. Kılavuzun bu bölümü PECL eklentilerinin nasıl edinileceği ve nasıl kurulacağını göstermek için tasarlanmıştır.
Bu talimatlarda, PHP kaynak kodunun /php/kaynak/dizininiz/ altında bulunduğu ve PECL eklentisinin isminin eklenti olduğu varsayılacaktır. Hazırlıklarınızı buna göre yapın. Bu talimatlarda ayrıca, » pear komutunu kullanmayı bildiğiniz varsayılacaktır. PEAR kılavuzundaki pear komutu ile ilgili bilgiler pecl komutu için de geçerlidir.
Burada genel olarak eklentinin paylaşımlı olarak derlenmesi, kurulması ve yüklenmesi üzerinde durulacaktır. Sonraki bölümlerde açıklanan yöntemler eklentiyi nasıl derleyip kuracağınızla ilgili çeşitli talimatlar içerir, fakat bunları sizin yerinize özdevinimli olarak yüklemezler. Eklentiler bir extension yönergesi eklenerek yüklenebilirler. Bunun için php.ini dosyasını veya dl() işlevini kullanabilirsiniz.
PHP modüllerini derlerken, derleme için gerekli araçların (autoconf, automake, libtool gibi) birbirleriyle en uyumlu sürümlerini kullanıyor olmak önemlidir. Gerekli araçlar ve bunların gerekli sürümleriyle ilgili ayrıntılı bilgiyi » Anonim SVN Talimatları sayfasında bulabilirsiniz.
PECL eklentilerini indirmek için çeşitli seçenekler vardır:
Windows'ta bir PHP eklentisini yüklemenin iki yolu vardır: Ya eklentiyi PHP içinde derlersiniz ya da DLL olarak yüklersiniz. Derlenmiş bir eklentiyi yüklemek en kolay ve en çok tercih edilen yoldur.
Bir eklentiyi yüklemek için sisteminizde o eklentinin ".dll" dosyasının bulunması gerekir. Tüm eklentiler özdevinimli olarak belirli aralıklarla PHP Grubu tarafından derlenirler (bunları indirmek için sonraki bölüme bakınız).
Bir eklentiyi PHP içinde derlemek için Kaynak kod paketinden derleme belgesine bakınız.
Bir eklentiyi tek başına (yani bir DLL olarak) derlemek için Kaynak kod paketinden derleme belgesine bakınız. Eğer DLL dosyası ne PHP dağıtımınızda ne de PECL sitesinde mevcutsa, eklentiyi kullanmaya başlamadan önce derlemek zorunda kalabilirsiniz.
PHP eklentileri genellikle "php_*.dll" biçeminde isimlendirilirler (yıldız iminin yerine eklentinin ismi gelir) ve "PHP\ext" (PHP 4'te "PHP\extensions") dizini altında bulunurlar.
PHP, geliştiricilerin büyük çoğunluğunca en faydalı bulunan eklentilerle birlikte gelir. Bunlara "çekirdek" eklentiler adı verilir.
Bununla birlikte, çekirdek eklentilerle sağlanmamış bir işlevselliğe ihtiyaç duyarsanız, PECL sitesinde bakabilirsiniz. PHP Eklentileri Halk Kütüphanesi (PECL - PHP Extension Community Library) bir PHP Eklentileri deposu olup PHP eklentilerinin geliştirilmesi ve indirilmesi için barındırma oluşumlarını ve bilinen tüm eklentilerin bir dizinini içerir.
Kendi kullanımınız için bir eklenti geliştiriyorsanız PECL'de barındırılmasını isteyebilirsiniz, böylece ihtiyaçları aynı olan başkaları da eklentinizden yararlanabilir. Bunun bazı olumlu yan etkileri de vardır: Geribildirim, teşekkür, hata bildirimi, hatta düzeltme ve yama alma şansınız olur. Eklentinizi barındırılmak üzere PECL'ye göndermeden önce lütfen http://pecl.php.net/package-new.php adresini ziyaret ediniz.
Çoğu zaman her DLL'nin çok sayıda sürümü vardır:
Şunu aklınızdan çıkarmayın: Eklenti ayarlarınız kullandığınız PHP çalıştırılabilirinin ayarları ile aynı olmalıdır. Aşağıdaki PHP betiği PHP ayarlarınızın tamamını size söyleyecektir:
Örnek 1 phpinfo() kullanımı
<?php
phpinfo();
?>
Ya da komut satırından şunu çalıştırın:
sürücü:\\dizin\yolu\php\executable\php.exe -i
Bir PHP eklentisini yüklemenin en bilinen yolu eklentiyi php.ini dosyasına eklemektir. Dikkatli incelerseniz php.ini dosyanızda bir çok eklentinin zaten ekli olduğunu görürsünüz. Eklentiyi etkin kılmak için tek yapacağınız eklentinin belirtildiği satırın başındaki noktalı virgülü silmek olacaktır.
;extension=php_eklenti.dll
extension=php_eklenti.dll
Bununla birlikte, bazı HTTP sunucuları, PHP çalıştırılabilirinin yanına konmuş php.ini dosyasını kullanmadıklarından eklentinizi göremeyebilirler. HTTP sunucunuzun kullandığı php.ini dosyasının bulunduğu yeri phpinfo() işlevini kullanarak öğrenebilirsiniz:
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
Eklentiyi etkin kıldıktan sonra php.ini dosyanızı kaydedin ve HTTP sunucunuzu yeniden başlattıktan sonra tekrar phpinfo() çıktısına bakın. Yeni eklentiyi artık kendi bölümünde görüyor olmanız gerekir.
Eğer eklenti phpinfo() çıktısında görünmüyorsa sorunun kaynağını bulmak için günlük dosyalarınıza bakmalısınız.
PHP'yi komut satırından kullanıyorsanız (CGI), eklenti yükleme hatasını doğrudan ekranda görebilirsiniz.
PHP'yi bir HTTP sunucusu ile kullanıyorsanız günlük dosyalarının yeri ve biçemi kullandığınız yazılıma göre değişir. Günlüklerin yerini bulmak için kullandığınız HTTP sunucusunun belgelerine bakınız.
Sorunların çoğu DLL dosyasının yeri ile ilgilidir. php.ini içindeki "extension_dir" yönergesinin değeri ile derleme sırasında yapılan ayarlar arasında bir tutarsızlık olabilir.
Eğer sorun derleme sırasında yapılan ayarlarla uyumsuzluktan kaynaklanıyorsa muhtemelen indirdiğiniz DLL dosyasını doğru yere koymamışsınız demektir. Eklentiyi doğru ayarlarla tekrar indirmeyi deneyin. Bunu yaptıktan sonra tekrar phpinfo() çıktısına bakmayı unutmayın.
pecl komutu ile
derlenmesiPECL, paylaşımlı PHP eklentilerinin oluşturulmasını kolaylaştırır. » pecl komutunu şöyle kullanabilirsiniz:
Bu komutla eklentinin kaynak kodu indirilecek, derlenecek ve eklenti.so adıyla extension_dir yönergesinde belirtilen dizine kurulacaktır. Böylece eklenti.so php.ini üzerinden yüklenebilir duruma gelmiş olacaktır.
Öntanımlı olarak, pecl komutu, alfa veya beta olarak imlenmiş paketleri kurmaz. Eklentinin henüz kararlı bir sürümü yoksa, beta sürümü şöyle kurabilirsiniz:
Ayrıca belli bir sürümü şu şekilde kurabilirsiniz:
Bilginize: Eklentiyi php.ini dosyasında etkin kıldıktan sonra değişikliklerin etkin olması için HTTP sunucunuzu (hizmetini) yeniden başlatın.
phpize ile derlenmesi
pecl komutu ile kurulumun mümkün olmadığı durumlar olabilir. Bir güvenlik duvarı arkasındasınızdır veya eklentinin PECL uyumlu paketi yoktur ya da henüz dağıtılmamış SVN sürümünü kurmak istiyorsunuzdur, vs. Böyle bir eklentinin derleme işlemini daha alt seviye derleme araçlarını kullanarak kendiniz gerçekleştirebilirsiniz.
Bir PHP eklentisini derleme işlemine hazırlamak için phpize komutu kullanılır. Aşağıdaki örnekte, eklentinin kaynak kod paketinin eklenti dizininde bulunduğu varsayılmıştır:
$ cd eklenti $ phpize $ ./configure $ make # make install
Başarılı bir kurulum sonucunda eklenti PHP eklentileri dizinine eklenti.so adıyla yerleştirilir. Eklentiyi etkin kılmak için php.ini dosyanıza bir extension=eklenti.so satırı eklemeniz gerekecektir.
Eğer sisteminizde phpize komutu yoksa ve RPM gibi önceden derlenmiş paketleri kullanabiliyorsanız, phpize komutunu ve PHP eklentilerini derlemek için gerekli başlık dosyalarını içermesi muhtemel uygun bir PHP geliştirme sürümünü kurmanız gerekebilir.
Komutun kullanım bilgilerini görmek için phpize --help komutunu verin.
Bazen bir PECL eklentisini PHP çalıştırılabilirinin içinde duruk olarak
derlemeniz gerekebilir. Bunu yapmak için eklentiyi
/php/kaynak/dizininiz/ext/ dizinine yerleştirmeniz
ve PHP kaynak paketinin configure betiğini yeniden
çalıştırmanız gerekir.
$ cd /php/kaynak/dizininiz/ext $ pecl download eklenti $ gzip -d < eklenti.tgz | tar -xvf - $ mv eklenti-x.x.x eklenti
Bu işlemin sonucunda eklenti şöyle bir dizinin altına yerleştirilmiş olacaktır:
Artık PHP kaynak paketinin configure betiğini yeniden
oluşturup PHP'yi her zamanki gibi derleyebilirsiniz:
Bilginize:
buildconfbetiğini çalıştırabilmek için autoconf 2.13 ve automake 1.4+ paketlerinin sisteminizde kurulu olması gerekir (daha yeni autoconf sürümleri de çalışır ama onlar desteklenmemektedir).
--enable-eklenti seçeneğinin mi yoksa
--with-eklenti seçeneğinin mi kullanılacağı eklentiye
bağlıdır. Genellikle harici kütüphanelere ihtiyacı olmayan eklentiler
--enable seçeneğini kullanırlar. Hangisinin
kullanılacağından emin olmak için buildconf'tan sonra şunu
çalıştırın:
Bazı sorunlar diğerlerine göre daha sık karşımıza çıkar. En bilinenlerini bu kılavuzun SSS bölümünde liste halinde bulabilirsiniz.
Hala bir çözüme ulaşamadıysanız, PHP kurulum posta listesinden birileri belki size yardımcı olabilir. Sizin sorununuzla daha önce karşılaşan biri olmuş mu acaba diye önce liste arşivlerini bir araştırın, hala uygun bir çözüm bulamadıysanız sorununuzu listeye yazın, aynı sorunla daha önce karşılaşmış biri size yardımcı olabilir. Liste arşivlerine » http://www.php.net/support.php adresindeki destek sayfasından erişebilirsiniz. PHP kurulum listesine üye olmak için » php-install-subscribe@lists.php.net adresine boş bir ileti gönderiniz. Posta listesinin adresi: » php-install@lists.php.net.
Posta listesinde yardım almak istiyorsanız, ortamınız hakkında gerekli
bilgiler (kullandığınız işletim sistemi, PHP sürümü, HTTP sunucusu,
PHP'yi CGI olarak mı yoksa modül olarak mı çalıştırdığınız, safe_mode,
vs. kullanımı) dikkatlice ve ayrıntılı olarak vermeye
çalışın. Bunun yanında sorununuzu denemeyi veya aynı sorunu üretmeyi
mümkün kılacak kodları veya ayrıntıları vermeye çalışın.
PHP'de bir hata bulduğunuzu düşünüyorsanız, lütfen bize bildirin. Siz bildirmezseniz PHP geliştiricilerinin muhtemelen bundan haberleri olmayacak ve gerekli değişiklikleri yapmayacaklardır. Hataları » http://bugs.php.net/ adresindeki hata izleme sistemini kullanarak bildirebilirsiniz. Hataları lütfen posta listelerine ve kişisel posta adreslerine bildirmeyiniz. Hata izleme sistemine özellik isteklerinizi de bildirebilirsiniz.
Bir hatayı bildirmeden önce lütfen » Hata nasıl bildirilir? sayfasını okuyunuz!
Yapılandırma dosyası (php.ini) PHP başlatıldığında okunur. PHP'nin sunucu modülü sürümlerinde bu işlem bir kereliğine HTTP sunucusu başlatıldığında gerçekleşir. CGI ve CLI sürümlerinde ise PHP'nin her çağrılışında işlem tekrarlanır.
php.ini sırasıyla şuralarda aranır:
SAPI modülüne özgü konum (Apache 2'de PHPIniDir yönergesi, CGI ve CLI için -c komut satırı seçeneği, NSAPI'de php_ini değiştirgesi, THTTPD'de PHP_INI_PATH ortam değişkeni)
PHPRC ortam değişkeni. PHP 5.2.0 öncesinde aşağıda bahsedilen kayıt defteri anahtarından sonra bu değişkene bakılırdı.
PHP 5.2.0'dan itibaren, PHP'nin farklı sürümlerine ait php.ini dosyaları için Windows kayıt defterinde sırayla aşağıdaki yerlere bakılmaktadır: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] ve [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]. Burada x, y ve z harfleri PHP'nin ana, alt ve yama sürümlerini belirtir. Bu anahtarlarda bir IniFilePath değeri varsa ilk bulunan php.ini konumu kullanılır.
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP] anahtarının \IniFilePath değeri. (Windows Kayıt Defteri kaydı)
Geçerli çalışma dizini (CLI dışında)
HTTP sunucusunun dizini (SAPI modülleri için) veya PHP dizini (Windows için)
Windows dizini (C:\windows veya C:\winnt) (Windows için) veya --with-config-file-path derleme seçeneği ile belirtilen dizin.
php-SAPI.ini mevcutsa (burada SAPI, kullanılan SAPI'dir, dolayısıyla php-cli.ini veya php-apache.ini gibi bir dosya ismidir), php.ini yerine bu dosya kullanılır. SAPI ismi php_sapi_name() işlevi ile saptanabilir.
Bilginize: Apache HTTP sunucusunun başlatıldığında kök dizine geçmesi PHP'nin php.ini dosyasını dosya sisteminin kök dizininde aramasına sebep olur.
php.ini yönergelerinin eklentilerle ilgili olanlarının belgeleri her eklentinin kendi belgeleri içindedir. Temel yönergelerin listesini eklerde bulabilirsiniz. Tamamı olmasa da yönergelerin büyük çoğunluğu kılavuzda belgelenmiş durumdadır. Kurulu PHP sürümünüzde geçerli yönergelerin tam listesi için kendi içinde iyi açıklanmış php.ini dosyanızı okuyun. Ayrıca, SVN'de bulunan » en son php.ini dosyası da bu konuda size yardımcı olabilir.
Örnek 1 - php.ini örneği
; bir noktalı virgülden (;) sonra gelen tüm metin parçaları yok sayılır [php] ; bölüm imleyiciler de (köşeli ayraç içindeki metinler) yok sayılır ; Mantıksal değerler için şu değerlerden herhangi biri kullanılabilir: ; true, on, yes ; false, off, no, none register_globals = off track_errors = yes ; Dizgeleri çift tırnak imlerinin arasında belirtebilirsiniz include_path = ".:/usr/local/lib/php" ; tersbölü karakterleri diğer karakterler gibi ele alınır include_path = ".;c:\php\lib"
PHP'nin 5.1.0 sürümünden beri .ini dosyalarında bulunan yönergelere isimleriyle değişken olarak erişilebilmektedir. Örnek: open_basedir = ${open_basedir} ":/new/dir".
PHP 5.3.0'dan beri, dizinler için .htaccess tarzı INI dosyaları desteklenmektedir. Bu dosyalar sadece CGI/FastCGI SAPI tarafından işlenir. Bu işlevsellik ile PECL htscanner eklentisi atıl duruma düşmüştür. Apache kullanıyorsanız aynı etkiyi elde etmek için .htaccess dosyalarını kullanın.
Ana php.ini dosyasına ek olarak, PHP istenen PHP dosyasının bulunduğu dizinden itibaren her dizini INI dosyaları için tarar ve bunları geçerli belge kök dizinine uygulanıyormuş gibi uygular ($_SERVER['DOCUMENT_ROOT'] değişkenine atandığı gibi). .user.ini tarzı INI dosyalarında sadece PHP_INI_PERDIR ve PHP_INI_USER kipindeki INI ayarları işleme sokulur.
Kullanıcı INI dosyalarını denetlemek için iki yeni INI yönergesi kullanılmaktadır: user_ini.filename ve user_ini.cache_ttl.
user_ini.filename ile PHP'nin dizinlerde arayacağı dosyanın ismi belirtilir. .user.ini öntanımlı değerdir.
user_ini.cache_ttl ile kullanıcı INI dosyalarının ne sıklıkta denetleneceği belirtilir. 300 saniye (5 dakika) öntanımlı değerdir.
Bu kipler, bir PHP yönergesinin nerede ve ne zaman atanabileceğini belirlerler ve bu kılavuzdaki her yönerge bu kiplerden biri ile ilişkilidir. Örneğin, bazı ayarlar bir PHP betiğinin içinde ini_set() kullanarak atanabilirken bazıları da php.ini veya httpd.conf dosyasında atanabilirler.
Örneğin, output_buffering ayarı için kip PHP_INI_PERDIR olup ini_set() kullanarak atanamaz. Bununla birlikte, display_errors yönergesinin kipi PHP_INI_ALL olup ini_set() kullanımı dahil her yerde atanabilir.
| Kip | 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. |
PHP'yi bir Apache modülü olarak kullanırken, yapılandırma ayarlarını Apache yapılandırma dosyalarındaki (httpd.conf ve .htaccess dosyaları) yönergeleri kullanarak da değiştirebilirsiniz. Bunu yapabilmek için Apache yapılandırmasında "AllowOverride Options" veya "AllowOverride All" olması gerekir.
PHP yapılandırmasını Apache yapılandırma dosyaları içinden değiştirmenize imkan veren çeşitli Apache yönergeleri vardır. PHP_INI_ALL, PHP_INI_PERDIR veya PHP_INI_SYSTEM olarak belirtilebilen yönergeleri eklerdeki php.ini yönergelerinin listesi sayfasında bulabilirsiniz.
php_value
isim
değer
Belirtilen değeri ismi belirtilen yönergeye atar. Sadece PHP_INI_ALL ve PHP_INI_PERDIR türü yönergeler için kullanılabilir. Önceki atanan değeri silmek için değer olarak none kullanın.
Bilginize: Mantıksal değer atamak için
php_valueyönergesini değil,php_flag(aşağıya bakınız) yönergesini kullanmalısınız.
php_flag
isim
on|off
Bir mantıksal yapılandırma yönergesi atamak için kullanılır. Sadece PHP_INI_ALL ve PHP_INI_PERDIR türü yönergeler için kullanılabilir.
php_admin_value
isim
değer
İsmi belirtilen yönergeye belirtilen değeri atar. .htaccess dosyalarında kullanılamaz. Bu yönerge ile atanan hiçbir yönerge türü ini_set() veya .htaccess tarafından geçersiz kılınamaz. Önceki atanan değeri silmek için değer olarak none kullanın.
php_admin_flag
isim
on|off
Bir mantıksal yapılandırma yönergesi atamak için kullanılır. .htaccess dosyalarında kullanılamaz. Bu yönerge ile atanan hiçbir yönerge türü .htaccess tarafından geçersiz kılınamaz.
Örnek 1 - Apache yapılandırma örneği
<IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on </IfModule>
PHP sabitleri PHP dışında mevcut değildir. Örneğin, httpd.conf dosyasında error_reporting yönergesine E_ALL veya E_NOTICE PHP sabitlerini atayamazsınız. Bunu yaparsanız daima 0 olarak değerlendirileceklerdir. Sabitleri kullanmak yerine bunların bit maskelerini kullanın. Bu sabitler php.ini içinde kullanılabilir.
PHP, Windows üzerinde çalışırken, yapılandırma değerleri Windows kayıt defteri kullanılarak her dizin için ayrı ayrı değiştirilebilir. Yapılandırma değerleri defterde HKLM\SOFTWARE\PHP\Per Directory Values anahtarının dizin isimlerine karşılık gelen alt anahtarlarında saklanır. Örneğin, c:\inetpub\wwwroot dizini için yapılandırma değerleri HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot anahtarında saklanır. Dizin ile ilgili ayarlar, dizin içinde ve alt dizinlerde çalıştırılan her betik için geçerli olur. Anahtar altındaki değerler PHP yapılandırma yönergelerinin isimlerini ve dizge değerlerini içermelidir. Değerlerde bulunan PHP sabitleri çözümlenmez. Sadece, PHP_INI_USER türü değişebilir yapılandırma değerleri bu yolla atanabilir, PHP_INI_PERDIR değerleri atanamaz.
PHP'yi nasıl çalıştırdığınızdan bağımsız olarak, belli değerleri betiğinizin çalışması sırasında ini_set() işlevi sayesinde değiştirebilirsiniz. Bu konuda daha ayrıntılı bilgi için ini_set() sayfasına bakınız.
Sistem yapılandırmanızla ilgili ayarlar ve mevcut değerleri ilginizi çekiyorsa phpinfo() işlevini çalıştırabilir ve elde ettiğiniz sayfayı inceleyebilirsiniz. Ayrıca, yapılandırma yönergelerinin her birine çalışma anında ini_get() veya get_cfg_var() işlevini kullanarak erişebilirsiniz.
PHP bir dosyayı çözümlerken, hangi bölümü yorumlayıp hangi bölümü yorumlamadan geçeceğine açılış ve kapanış etiketlerine bakarak karar verir. PHP'nin bu şekilde çalışıyor olması, PHP'nin çesitli türde birçok belgenin içine gömülebilmesini sağlar, çünkü PHP başlangıç ve bitiş etiketlerinin dışında kalan her şey PHP çözümleyicisi tarafından gözardı edilir. Çoğu zaman, bu örnekte olduğu gibi PHP'nin HTML içine gömülmüş olduğunu göreceksiniz.
<p>Bu bölüm gözardı edilecektir.</p>
<?php echo 'Bu bölüm PHP tarafından çözümlenecektir.'; ?>
<p>Bu bölüm de gözardı edilecektir.</p>
Daha gelişmiş yapılar da kullanmanız mümkündür:
Örnek 1 - Gelişmiş önceleme
<?php
if ($ifade) {
?>
<strong>Bu önerme doğrudur.</strong>
<?php
} else {
?>
<strong>Bu önerme yanlıştır.</strong>
<?php
}
?>
Bu beklendiği gibi çalışacaktır, çünkü PHP, ?> kapanış etiketi ile karşılaştığında, tekrar bir açılış etiketi ile karşılaşana kadar bulduğu herşeyi (kapanış etiketinden sonraki satırsonu karakteri hariç - bkz, deyim ayırma) çıktılayacaktır. Buradaki örnek oldukça basit, ancak büyük metin bloklarını görüntülemek istediğimizde PHP'yi çözümleme kipinden çıkartmak çoğu zaman tüm metni echo() ya da print() ile görüntülemekten daha verimlidir.
PHP ile kullanılabilecek dört farklı açılış ve kapanış etiketi çifti vardır. Bunlardan ikisi, <?php ?> ve <script language="php"> </script> her zaman kullanılabilir durumdadır. Diğer ikisi, kısa etiketler ve ASP tarzı etiketler olup php.ini yapılandırma dosyası içersinden açılıp kapatılabilirler. Bazı kişiler kısa etiketleri ve ASP tarzı etiketleri daha kullanışlı bulmaktadır, ancak bu ikisi daha az taşınabilir olduklarından genellikle tavsiye edilmemektedir.
Bilginize: Bir diğer önemli nokta, PHP'yi XML ya da XHTML içine gömmek istiyorsanız standartlarla uyumlu kalabilmek için <?php ?> etiketlerini kullanmanız gerektiğidir.
Örnek 2 - PHP Açılış ve Kapanış Etiketleri
1. <?php echo 'XHTML ya da XML belgeleri sunacaksanız, böyle yapın'; ?>
2. <script language="php">
echo 'bazı düzenleyiciler (FrontPage gibi) işlem
yönergelerini sevmezler';
</script>
3. <? echo 'Bu en basit, SGML işlem yönergesidir'; ?>
<?= ifade ?> Bu "<? echo ifade ?>" için bir kısayoldur.
4. <% echo 'İsterseniz ASP tarzı etiketler kullanabilirsiniz'; %>
<%= $degisken; # Bu "<% echo . . ." %> için bir kısayoldur.
Bir ve iki numaralı örneklerde gözüken etiketler her zaman kullanılabilirler. Bu ikisinden birincisi en geniş kullanıma sahip olanı ve en çok tercih edilenidir.
Kısa etiketler (üçüncü gibi) yalnızca php.ini içersinde short_open_tag yapılandırma
yönergesiyle etkinleştirilmişlerse ya da PHP,
--enable-short-tags derleme seçeneği ile
yapılandırılmışsa kullanılabilirler.
ASP tarzı etiketler (dördüncü örnek) php.ini dosyasında asp_tags yapılandırma yönergesiyle etkinleştirilmişlerse kullanılabilirler.
Bilginize: Geliştirdiğiniz uygulamaları ya da kütüphaneleri başkalarına dağıtacaksanız ya da bu uygulamaları denetiminizde olmayan PHP sunucularına kuracaksanız kısa etiketleri kullanmaktan kaçınmalısınız, çünkü hedef sunucu kısa etiketleri desteklemiyor olabilir. Kodlarınızın taşınabilir ve yeniden dağıtılabilir olması için, alışkanlıkla kısa etiketleri kullanmadığınızdan emin olun.
C ya da Perl'de olduğu gibi, PHP de deyimlerin birbirlerinden her bir deyimin sonuna konulacak noktalı virgülle ayrılmasını gerektirir. Bir PHP kod bloğunun sonunda yer alan kapanış etiketi kendinden önceki deyim için noktalı virgül işlevi görür; yani, bir PHP bloğunun son satırının sonuna noktalı virgül koymak zorunda değilsiniz. Kapanış etiketi aynı zamanda satırsonu karakterini de kendisi ekleyecektir.
<?php
echo 'Bu bir denemedir';
?>
<?php echo 'Bu bir denemedir' ?>
<?php echo 'Son kapanış etiketini koymadık';
Bilginize: Dosya sonunda PHP kapanış etiketini kullanmak isteğe bağlıdır, hatta dosya sonlarında istemdışı boş satırlar oluşması gibi durumlarda include(), require() gibi işlevlerin kullanımında yararlı bile olabilir, dahası sonradan yanıta başlık eklemeye devam edebilirsiniz. Bu özellik ayrıca, çıktı tamponlama kullanıyorsanız ve betiğe include() ile eklediğiniz dosyalar tarafından üretilen kısımların sonunda gereksiz boş satırların oluşmasını istemediğinizde de işe yarar.
PHP, 'C', 'C++' ve Unix kabuk tarzı (Perl tarzı) açıklamaların hepsini destekler. Örnegin:
<?php
echo 'Bu bir denemedir'; // Bu tek satırlık c++ tarzı açıklamadır
/* Bu, C tarzı çok satırlı
bir açıklamadır */
echo 'Bir deneme daha';
echo 'Bu da sonuncusu'; # Bu tek satırlık kabuk tarzı açıklamadır
?>
"Tek satırlık" bir açıklamanın etki alanı yalnızca satır sonuna ya da PHP
kod bloğunun sonuna kadardır. Yani, // ... ?> ya da
# ... ?> kullanımından sonra gelecek HTML kodu
YAZDIRILACAKTIR: ?> etiketi PHP kipinden çıkılmasına ve
HTML kipine dönülmesini sağlar, // ya da
# kullanımı bunu etkileyemez asp_tags yapılandırma yönergesi etkinse,
asp tarzı // %> ve # %>
kullanımı da böyle çalışır. Bununla birlikte,
</script> etiketi tek satırlık açıklama için
böyle duruma yol açmaz.
<h1>Bu <?php # echo 'basit';?> bir örnektir.</h1>
<p>Yukarıdaki başlık 'Bu bir örnektir' diye gösterilecektir.</p>
Bir 'C' tarzı açıklama ilk */ ile karşılaşıldığı noktada sona erer. 'C' tarzı açıklamaları iç içe kullanmamalısınız. Büyük miktarda kod bloğunu açıklama haline getirirken bu yanlış genellikle yapılır.
<?php
/*
echo 'Bu bir denemedir'; /* Bu açıklama sorun çıkaracak. */
*/
?>
PHP sekiz ilkel veri türü destekler.
Dört sayıl tür:
İki bileşik tür:
Ve son olarak iki özel tür:
Bu kılavuzda ayrıca, okunabilirliği arttırmak için bazı sözde türlere de yer verilmiştir:
Ve sözde değişken: $... .
Kılavuzun bazı yerlerinde tür ismi olarak "double" hala kalmış olabilir. Bunları "float" olarak ele alın; iki isminde varlık sebebi tamamen tarihseldir.
Normal olarak, değişken türünü programcı belirlemez; çalışma anında değişkenin bulunduğu bağlama göre buna PHP karar verir.
Bilginize: Bir ifadenin değerinin ve türünün ne olduğuna bakmak için var_dump() işlevini kullanabilirsiniz. Hata ayıklama amacıyla bir değişkenin türünü öğrenmek için gettype() işlevini kullanın. Belli bir türü sınamak için gettype() değil is_tür işlevlerini kullanın. Bazı örnekler:
<?php
$a_bool = TRUE; // boolean türünde
$a_str = "foo"; // string türünde
$a_str2 = 'foo'; // string türünde
$an_int = 12; // integer türünde
echo gettype($a_bool); // boolean basar
echo gettype($a_str); // string basar
// Değişken bir tamsayı ise değeri dört arttır
if (is_int($an_int)) {
$an_int += 4;
}
// $bool bir dizge ise değeri çıktıla
// (hiçbir şey çıktılanmayacaktır)
if (is_string($a_bool)) {
echo "Dizge: $a_bool";
}
?>
Bir değişkenin türünün mutlaka belli bir türe dönüşmesini isterseniz ya tür çarpıtma yapın ya da settype() işlevini kullanın.
Yerine göre bazı durumlarda bir değişkenin değeri farklı değerlendirilir. Daha ayrıntılı bilgi için Tür Dönüşümü bölümüne bakınız. Ayrıca, türlerle ilgili çeşitli karşılaştırmaların listelendiği Tür karşılaştırma tabloları da yararlı olabilir.
booleanEn basit türdür. Bir mantıksal ifadenin sonucu TRUE veya FALSE olan bir doğruluk değeridir.
Bilginize: boolean türü PHP 4'ten beri vardır.
Bir boolean sayılını belirtmek için TRUE veya FALSE anahtar sözcüğü kullanılır. Her ikisi de harf büyüklüğüne duyarsızdır.
<?php
$foo = True; // $foo değişkenine TRUE değeri atanır.
?>
Genelde, boolean türünde bir değer döndüren bir çeşit işleç vardır ve bu değer bir denetim yapısına aktarılır.
<?php
// == işleci, eşitliği sınar ve
// boolean türünde bir değer döndürür
if ($eylem == "sürümü göster") {
echo "Sürüm numarası 1.23'tür.";
}
// Bu gereksizdir...
if ($ayırıcı_göster == TRUE) {
echo "<hr>\n";
}
// ... böylesi daha iyidir:
if ($ayırıcı_göster) {
echo "<hr>\n";
}
?>
boolean türüne dönüşümBir değeri doğrudan boolean türüne dönüştürmek için (bool) veya (boolean) çarpıtmalarını kullanabilirsiniz. Ancak, bir boolean değiştirge gerektiren bir işleç, işlev veya denetim yapısı dönüşümün özdevinimli olarak yapılmasını sağladığından çoğu durumda tür çarpıtma gereksizdir.
Ayrıca, Tür Dönüşümü bölümüne de bakınız.
Aşağıdaki değerler boolean türüne dönüşümde FALSE olarak ele alınırlar:
Bunların dışında kalan tüm değerler TRUE olarak ele alınır (resource türler dahil).
-1 ve sıfırdan farklı diğer değerler (pozitif veya negatif) TRUE olarak ele alınır.
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
integerBir integer türünde değer şu kümeden bir tamsayıdır: Z = {..., -2, -1, 0, 1, 2, ...}.
Bunlara da bakınız:
integer türünde değerler onluk, sekizlik veya onaltılık tabanda belirtilebilirler ve önlerinde isteğe bağlı bir + veya - işareti bulunabilir.
Sekizlik gösterimde sayıların önüne 0 (sıfır), onaltılık gösterimde ise 0x getirilir.
Örnek 1 - Tamsayı sayıllar
<?php
$a = 1234; // onluk tabanda bir sayı
$a = -123; // negatif bir sayı
$a = 0123; // sekizlik tabanda bir sayı (onluk: 83)
$a = 0x1A; // onaltılık tabanda bir sayı (onluk: 26)
?>
Biçimsel olarak integer sayılların yapısı:
onluk : [1-9][0-9]*
| 0
onaltılık : 0[xX][0-9a-fA-F]+
sekizlik : 0[0-7]+
tamsayı : [+-]?onluk
| [+-]?onaltılık
| [+-]?sekizlik
Bir integer türün genişliği platforma göre değişir. 32 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.
Sekizlik bir değer içinde geçersiz bir rakam kullanılmışsa (8, 9 gibi) o ve kalan tüm rakamlar yok sayılır.
Örnek 2 - Sekizlik garabeti
<?php
var_dump(01090); // sekizlik: 010, onluk: 8
?>
PHP, integer türünde bir değerin bellekte integer türüne ayrılan genişliğe sığmadığını saptarsa float türünde bir değer olarak ele alır ve bu durum yapılan bir işlem sırasında ortaya çıkmışsa işlemden dönen değer float türünde olur.
<?php
$büyük_sayı = 2147483647;
var_dump($büyük_sayı);
// çıktısı: int(2147483647)
$büyük_sayı = 2147483648;
var_dump($büyük_sayı);
// çıktısı: float(2147483648)
// aynısı 2^31 ve 2^32-1 arasındaki onaltılık değerler için de geçerlidir:
var_dump( 0xffffffff );
// çıktısı: float(4294967295)
// ancak 2^32-1'den büyük onaltılık değerler için geçersizdir:
var_dump( 0x100000000 );
// output: int(2147483647)
$milyon = 1000000;
$büyük_sayı = 50000 * $million;
var_dump($büyük_sayı);
// çıktısı: float(50000000000)
?>
Ne yazık ki, bunun negatif sayılar için her zaman çalışmaması şeklinde kendini gösteren bir PHP yazılım hatası mevcuttu. Örneğin, -50000 * $milyon işleminin sonucu -429496728 olmaktadır. Ancak, her iki terimin işareti pozitif olduğunda hiçbir sorun çıkmamaktadır.
Bu hata PHP 4.1.0'da düzeltilmiştir.
PHP'de sonucun integer türünde elde edileceği bir bölme işlemi mevcut değildir. 1/2 işleminin sonucu float türünde 0.5 değeridir. Bu değer (integer) ile çarpıtılarak aşağı yuvarlamak suretiyle bir tamsayıya dönüştürülebilirse de round() işlevini kullanırsanız dönüşümün nasıl yapılacağını kendiniz belirleyebilirsiniz.
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
integer türüne dönüşümBir değeri doğrudan integer türüne dönüştürmek için (int) veya (integer) çarpıtmasını kullanabilirsiniz. Ancak, çoğu durumda türü çarpıtmak gerekmez, bir tamsayı değer gerektiren bir işlev veya denetim yapısı, değeri özdevinimli olarak integer türüne dönüştürecektir. Ayrıca, bir değer integer türüne intval() işleviyle de dönüştürülebilir.
Ayrıca, Tür Dönüşümü bölümüne de bakınız.
boolean türünden dönüşümFALSE, 0'a (sıfır); TRUE, 1'e (bir) dönüştürülür.
float türünden dönüşümfloat türünden integer türüne dönüşümde sayı sıfıra yaklaştırılarak yuvarlanır.
Dönüşüm sonucu integer türüne ayrılan genişliğe (normalde +/- 2.15e+9 = 2^31) sığmıyorsa, float türün hassasiyeti integer türünde tam bir sonuç vermeyeceğinden sonuç tanımsızdır. Bu durumda ne bir uyarı ne de bir bilgi verilir!
Ondalık kısmı integer türüne asla dönüştürmeyin, yoksa beklenmedik sonuçlar elde edebilirsiniz.
<?php
echo (int) ( (0.1+0.7) * 10 ); // çıktısı: 7!
?>
Ayrıca bakınız: Kayan noktalı sayılarda hassasiyet uyarısı.
string türünden dönüşümDizgelerin sayılara dönüşümü bölümüne bakınız.
Diğer türlerden integer türüne dönüşümün nasıl davranacağı henüz kesin olarak tanımlanmamıştır. Gözlemlediğiniz bir davranışın doğruluğuna güvenmeyiniz, ileride bu davranış hiçbir bilgi verilmeden değiştirilebilir.
floatGerçek sayılar (veya kayan noktalı sayılar) şu sözdizimleri ile belirtilebilir:
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
Biçimsel olarak:
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
USTEL_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
Bir gerçek sayının bellekte kapladığı genişlik platforma göre değişmekteyse de kabaca 14 hanelik bir hassasiyetle ~1.8e308'lik olası bir en büyük değer (64 bitlik IEEE biçemi) hepsi için sağlanır.
Normal olarak, 0.1 veya 0.7 gibi
basit ondalık sayılar az da olsa bir kayıp olmaksızın dahili ikil
karşılıklarına dönüştürülemezler. Bunun şöyle bir sonucu olur: örneğin,
floor((0.1+0.7)*10) işlevinden beklendiği gibi
8 değil, 7 döner; bunun sebebi
dahili gösterimin aslında 7.9 gibi bir
değer olmasıdır.
Bunun asıl sebebi, noktanın sağındaki rakam sayısı sonsuz olan bazı ondalık sayıları ifade etmekteki zorluktur. Örneğin, 1/3 ifadesinin ondalık sonucu 0.3'tür.
Bu bakımdan, son ondalık hanesine bakarak sonucun ne olacağına karar verilemez, bu bakımdan kayan noktalı sayılar arasında asla eşitlik karşılaştırmaları yapılmaz. Eğer daha yüksek hassasiyet isteniyorsa keyfi hassasiyetli matematik işlevleri ve gmp işlevleri kullanılabilir.
float türüne dönüşümstring türleri float türlere dönüştürmek için gereken bilgileri Dizgelerin sayılara dönüşümü bölümünde bulabilirsiniz. Diğer türlerden float türüne dönüşüm için değer önce integer türüne dönüştürülür. Daha fazla bilgi için integer türüne dönüşüm bölümüne bakınız. PHP 5 itibariyle, bir object tür float türe dönüştürülmeye çalışılırsa bir uyarı üretilir.
stringBir dizge string türünde bir sayıl değer olup bir dizi karakterden oluşur. PHP 6 öncesi her karakter tek bayt ile ifade ediliyordu. Yani, olası karakter sayısı 256'dan ibaretti. Bu yüzden PHP Evrenkod için yerleşik desteğe sahip olamıyordu. Temel Evrenkod işlevselliği hakkında bilgi edinmek için utf8_encode() ve utf8_decode() işlevlerine bakınız.
Bilginize: Bir dizgenin çok büyük olması bir sorun teşkil etmez. PHP, string türünde bir değer için boyut sınırlaması yapmaz; tek sınırlama PHP'nin çalıştığı makinede PHP'nin kullanımına ayrılan bellek miktarıdır.
string türünde bir sayıl dört şekilde belirtilebilir:
Bir dizgeyi belirtmenin en basit yolu dizgeyi tek tırnak (') imlerinin arasına almaktır.
Tek tırnaklı bir dizge içinde tek tırnağı sayıl değeriyle kullanmak isterseniz önüne bir tersbölü imi getirmelisiniz (\). Bir tersbölü imini sayıl değeriyle kullanmak isterseniz onun da önüne bir tersbölü imi getirmelisiniz (\\). Tersbölü imini bunlardan başka bir karakterin önünde kullanırsanız, tersbölü imi karakterle birlikte basılır.
Bilginize: Diğer iki sözdiziminin aksine, değişkenler ve özel karakterlerin öncelemleri tek tırnaklı dizgelerin içinde kullanıldıklarında yorumlanmazlar.
<?php
echo 'Bu basit bir dizgedir';
echo 'Dizgelerin içinde satırsonu karakterlerini
tıpkı buradaki gibi
kullanabilirsiniz';
// Çıktısı: Arnold dedi ki: "I'll be back"
echo 'Arnold dedi ki: "I\'ll be back"';
// Çıktısı: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// Çıktısı: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// Çıktısı: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// Çıktısı: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
Eğer bir dizge çift tırnak (") içine alınmışsa PHP, aşağıdaki özel karakter öncelemlerini yorumlayacaktır:
| Öncelem | Anlamı |
|---|---|
| \n | satırsonu (LF veya ASCII 10 (0x0A)) |
| \r | satırbaşı (CR veya ASCII 13 (0x0D)) |
| \t | yatay sekme (HT veya ASCII 9 (0x09)) |
| \v | düşey sekme (VT veya ASCII 11 (0x0B)) (PHP 5.2.5 ve sonrası) |
| \f | sayfa ileri (FF veya ASCII 12 (0x0C)) (PHP 5.2.5 ve sonrası) |
| \\ | tersbölü |
| \$ | dolar imi |
| \" | çift tırnak |
| \[0-7]{1,3} | Bu düzenli ifade ile eşleşen dizilim, karakterin sekizlik gösterimidir. |
| \x[0-9A-Fa-f]{1,2} | Bu düzenli ifade ile eşleşen dizilim, karakterin onaltılık gösterimidir. |
Tersbölü imini bunlardan başka bir karakterin önünde kullanırsanız, tersbölü imi karakterle birlikte basılır. PHP 5.1.1'den önce, \{$var} içindeki tersbölü imi basılmıyordu.
Çift tırnaklı dizgelerin en önemli özelliği içerdiği değişkenlerin yorumlanmasıdır. Bu konuda daha ayrıntılı bilgi edinmek için Değişken çözümleme bölümüne bakınız.
Bir dizgenin sınırlarını belirlemenin üçüncü yolu, yorumlu metin sözdizimidir. Bir yorumlu metin daima <<< karakterleri ile başlar ve hemen ardından bir betimleyici ve bir satırsonu karakteri gelir. Asıl dizge satırsonu karakterinden sonra yer alır. Dizgenin sonunu belirtmek üzere dizgenin sonuna, baştaki betimleyici konur.
Kapanış betimleyicisinin dizgeden sonraki satırın başında olması gerekir. Ayrıca, betimleyici PHP'deki diğer isimlere uygulanan kurallara uygun olmalıdır: Sadece bir harfle veya alt çizgi imi ile başlayabilir; sadece harfler, rakamlar veya alt çizgi imleri içerebilir.
Kapanış betimleyicisinin bulunduğu satırda betimleyicinin hemen ardına konan noktalı virgül (;) dışında hiçbir karakter bulunmaması çok önemli olup buna özellikle dikkat etmelisiniz. Yani, betimleyici özellikle girintilenmemeli; noktalı virgülden önce ve sonra herhangi bir boşluk karakteri bulunmamalıdır. Ayrıca, kapanış betimleyicisinden hemen önce gelen karakterin yerel işletim sistemine özgü satırsonu karakteri olması çok önemlidir. Bu karakter Unix ve Mac OS X için \n'dir. Kapanış betimleyicisinden (ve olası noktalı virgül karakterinden) sonraki karakter de böyle bir satırsonu karakteri olmalıdır.
Eğer bu kurallara uyulmaz ve kapanış betimleyicisinin etrafı temiz tutulmazsa kapanış betimleyicisi algılanamayacağından PHP kapanış betimleyicisini aramaya devam edecektir. Eğer dosyanın sonuna kadar uygun bir kapanış betimleyicisi bulunamazsa son satırda bir çözümleme hatası oluşacaktır.
Yorumlu metinler sınıf özelliklerini ilklendirmek için kullanılamazlar. PHP 5.3'ten beri bu sınırlama sadece değişken içeren yorumlu metinler için geçerlidir. Bunun yerine yorumsuz metinler kullanılabilir.
Örnek 1 - Geçersiz örnek
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Yorumlu metinler tıpkı çift tırnaklı dizgeler gibi davranırlar. Yorumlu metin çift tırnaklar arasına alınmaz ve metin içindeki çift tırnak imlerinin tersbölü ile öncelenmesi gerekmez, ancak yukarıda çift tırnaklı dizgeler için belirtilen öncelem kodları kullanılabilir. Değişkenler yorumlanır, fakat yorumlanan metin içinde yer alan karmaşık değişkenler ifade edilirken dizgelerde dikkate alınması gerekenler yorumlu metinlerde de dikkate alınmalıdır.
Örnek 2 - Yorumlu metin örneği
<?php
$str = <<<EOD
Yorumlu metin sözdizimi
kullanılarak çok sayıda
satıra bölünmüş dizge örneği.
EOD;
/* Değişkenlerin de kullanıldığı daha karmaşık bir örnek */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Kimimben';
echo <<<EOT
Adım "$name" ve işim $foo->foo basmak.
Şimdi {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41\n
EOT;
?>
Yukarıdaki örneğin çıktısı:
Adım "Kimimben" ve işim Foo basmak. Şimdi Bar2 basıyorum. Bu büyük 'A' basmalı: A
Ayrıca işlev değiştirgesinde veri aktarırken de yorumlu metin kullanılabilir:
Örnek 3 - Değiştirgelerde yorumlu metin kullanımı
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
PHP 5.3.0'dan itibaren, duruk değişkenleri ve sınıf özelliklerini veya sabitlerini yorumlu metin sözdizimini kullanarak ilklendirmek mümkündür:
Örnek 4 - Duruk değer olarak yorumlu metin kullanımı
<?php
// Duruk değişkenler
function foo()
{
static $bar = <<<LABEL
Burada hiçbir şey yok...
LABEL;
}
// Sınıf özellikleri ve sabitleri
class foo
{
const BAR = <<<FOOBAR
Sınıf sabiti örneği
FOOBAR;
public $baz = <<<FOOBAR
Özellik örneği
FOOBAR;
}
?>
PHP 5.3.0 ile ayrıca, yorumlu metinlerin bildiriminde çift tırnak kullanımı olasılığı da dikkate alınmıştır:
Örnek 5 - Yorumlu metin bildiriminde çift tırnak kullanımı
<?php
echo <<<"TIRNAKLI"
Merhaba Dünya!
TIRNAKLI;
?>
Bilginize: Yorumlu metin desteği PHP 4'te eklenmiştir.
Yorumlu metinlerin çift tırnaklı dizgelere karşılık gelmesi gibi yorumsuz metinler de tek tırnaklı dizgelere karşılık gelir. Yorumsuz metinler de yorumlular gibi belirtilir ama, yorumsuz metin içinde çözümleme yapılmaz. Yorumsuz metinler, PHP kodlarını veya büyük metin bloklarını herhangi bir önlem almaksızın içine yerleştirmek için elverişlidirler. Belirtilen metin bloğunun çözümlenmemesinden dolayı SGML'nin <![CDATA[ ]]> oluşumu ile benzer özelliklere sahiptir.
Yorumsuz metin de yorumlu metindeki <<< dizgesini kullanır fakat betimleyicisi tek tırnak içine alınır; yani, şuna benzer: <<<'EOT'. Yorumlu metin için geçerli tüm diğer kurallar yorumsuz metin için de geçerlidir; özellikle de kapanış betimleyici ile ilgili olanlar.
Örnek 6 - Yorumsuz metin örneği
<?php
$str = <<<'EOD'
Yorumlu metin sözdizimi
kullanılarak çok sayıda
satıra bölünmüş dizge örneği.
EOD;
/* Değişkenli daha karmaşık bir örnek. */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Kimimben';
echo <<<'EOT'
İsmim "$name" ve işim $foo->foo basmak.
Artık {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41
EOT;
?>
Yukarıdaki örneğin çıktısı:
İsmim "$name" ve işim $foo->foo basmak.
Artık {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41Bilginize: Yorumlu metinlerin aksine yorumsuz metinler herhangi bir duruk veri bağlamında kullanılabilirler. Sınıf özelliklerini veya sabitlerini yorumsuz metin kullanarak ilklendirme örneği:
Örnek 7 - Duruk veri örneği
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Bilginize: Yorumlu metin desteği PHP 5.3.0'da eklenmiştir.
Bir dizge çift tırnaklar arasında veya bir yorumlu metin olarak belirtilmişse içindeki değişkenler çözümlenir.
İki sözdizimi türü vardır: Biri basit, diğeri karmaşık. Basit sözdizimi en çok kullanılanı ve elverişli olanıdır; bir değişken, bir dizi değeri veya bir nesne özelliğini bir dizge içinde en az çabayla kullanmayı sağlar.
Karmaşık sözdizimi PHP4'ten itibaren kullanılmakta olup ifadeyi sarmalayan kaşlı ayraçlar biçiminde kendini gösterir.
Çözümleyici, bir dolar imine ($) rastlandığında, geçerli bir değişken ismi oluşturmak için alabildiği bütün dizgecikleri açgözlülükle toplar. Değişken isminin kaşlı ayraçlar arasına alınması ismin sonunun açıkça belirtilmesini sağlar.
<?php
$bira = 'Bira';
echo "$bira'nın tadı berbattır"; // çalışır; "'" değişken adında geçersizdir
echo "$biralar geldi"; // çalışmaz; 'lar' değişken isminde geçerlidir
// ama değişken "$biralar" değildir.
echo "${bira}lar geldi"; // çalışır
echo "{$bira}lar geldi"; // çalışır
?>
Bir dizi indisi veya bir nesne özelliği de benzer şekilde çözümlenebilir. Dizi indislerinde indis sonunu, kapayan köşeli ayraç (]) belirler. Aynı kural, basit değişkenler olarak nesne özelliklerine de uygulanır.
<?php
// Bu örnekler dizge içinde dizi kullanımına özgüdür.
// Dizilerin dizgesel anahtarları daima tırnak içine alınır,
// bu amaçla kaşlı ayraçlar kullanılmaz.
// Bütün hataları görelim
error_reporting(E_ALL);
$meyve = array('çilek' => 'kırmızı', 'muz' => 'sarı');
// Çalışır, fakat bunun dizge dışında farklı çalışacağına dikkat edin
echo "Bir muz $meyve[muz] renktedir.";
// Çalışır
echo "Bir muz {$meyve['muz']} renktedir.";
// çalışır, fakat PHP aşağıda açıklandığı gibi önce muz adında bir sabit arar
echo "Bir muz {$meyve[muz]} renktedir.";
// Çalışmaz, kaşlı ayraç kullanın. Bir çözümleme hatasına yol açar.
echo "Bir muz $meyve['muz'] renktedir.";
// Çalışır
echo "Bir muz " . $meyve['muz'] . " renktedir.";
// Çalışır
echo "Bu karenin bir kenarı $square->width metre uzunluktadır.";
// Çalışmaz. Çözüm için karmaşık sözdizimine bakın.
echo "Bu karenin bir kenarı $square->width00 santimetre uzunluktadır.";
?>
Bunlardan daha karmaşık herşey için karmaşık sözdizimini kullanmalısınız.
Buna karmaşık denmesinin sebebi sözdiziminin karmaşıklığı değil, karmaşık ifadelerin kullanımını mümkün kılmasıdır.
Aslında, isim alanındaki her değer, bir dizge içinde bu sözdizimi ile yer alabilir. İfade basitçe dizge dışındaki gösterimiyle yazılıp { ve } arasına alınır. { öncelenemeyeceğinden bu sözdizimi sadece $ iminin { iminin hemen ardında yer aldığı durumlarda tanınır. {\$ kullanımı bir sayıl {$ alınmasıyla sonuçlanır. Bazı örnekler:
<?php
// Tüm hataları görelim
error_reporting(E_ALL);
$şahane = 'harika';
// Çalışmaz, çıktısı: Bu çok { harika}
echo "Bu çok { $şahane}";
// Çalışır, çıktısı: Bu çok harika
echo "Bu çok {$şahane}";
echo "Bu çok ${şahane}";
// Çalışır
echo "Bu karenin bir kenarı {$square->width}00 santimetre uzunluktadır.";
// Çalışır
echo "Bu çalışır: {$arr[4][3]}";
// $foo[bar] bir dizge dışında neden yanlışsa bu da o yüzden yanlıştır.
// Yani, bu yine de çalışır fakat PHP önce foo adında bir sabit
// arayacağından çalışır; bununla birlikte E_NOTICE seviyesinde
// bir hata oluşacaktır (tanımsız sabit).
echo "Bu yanlış: {$arr[foo][3]}";
// Çalışır. Çok boyutlu dizileri dizgelerin içinde kullanılırken,
// dizileri daima kaşlı ayraçlar arasına alın.
echo "Bu çalışır: {$arr['foo'][3]}";
// Çalışır.
echo "Bu çalışır: " . $arr['foo'][3];
echo "Bu da çalışır: {$obj->values[3]->name}";
echo "$name adlı değişkenin değeri: {${$name}}";
echo "Adı getName() işlevinin dönüş değeri olan değişkenin değeri: {${getName()}}";
echo "Adı \$object->getName() yönteminin dönüş değeri olan değişkenin değeri: {${$object->getName()}}";
?>
Bu sözdizimini kullanan dizgeler içindeki değişkenler üzerinden de sınıf özelliklerine erişmek mümkündür.
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
Yukarıdaki örneğin çıktısı:
Bilginize: İşlev ve yöntem çağrılarının, duruk sınıf değişkenlerinin ve sınıf sabitlerinin {$} içinde çağrılması PHP 5'ten beri çalışmaktadır. Erişilen değer, dizgenin tanımlandığı etki alanındaki bir değişkenin ismi olarak yorumlanır. Kaşlı ayraçların tek başına kullanımı ({}), duruk sınıf değişkenlerinin veya sınıf sabitlerinin değerlerine veya işlev ve yöntemlerin dönüş değerlerine erişim için kullanılmaz.
<?php
// Tüm hatalar gösterilsin.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// Bu çalışır; çıktısı: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// Bu da çalışır; çıktısı: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
Dizgelerin içindeki karakterlere, dizilerin köşeli ayraçları arasında karakterin dizinin başlangıcından itibaren (ilk karakterin indisi sıfır olmak üzere) kaçıncı karakter olduğu belirtilerek ($dizge[42] gibi) erişilebilir veya o karakterde değişiklik yapılabilir. Dizgeler bu nedenle bir karakter dizisi olarak düşünülür.
Bilginize: Dizge karakterlerine ayrıca $str{42} biçeminde kaşlı ayraçlar kullanılarak da erişilebilirse de bu sözdiziminin kullanımı PHP 5.3.0 itibariyle önerilmemektedir. Bu amaçla kaşlı ayraçları değil, daima köşeli ayraçları tercih edin; örnek: $str[42].
Karakter indisi olarak dizgenin uzunluğundan büyük bir değer belirtmek, dizgenin sonuna boşlukların eklenmesine sebep olur. Tamsayı olmayan indis değerleri tamsayıya dönüştürülür. Kuraldışı indis belirtimi E_NOTICE'e sebep olur. Yazma sırasında negatif indisler bir E_NOTICE çıktılanmasına sebep olurken okuma işlemi boş dizge okunmasıyla sonuçlanır. Atanmış bir dizgenin sadece ilk karakteri kullanılır. Boş dizge atamak NULL atamasıyla sonuçlanır.
Örnek 8 - Bazı dizge örnekleri
<?php
// Dizgenin ilk karakterini alalım
$str = 'This is a test.';
$first = $str[0];
// Dizgenin üçüncü karakterini alalım
$third = $str[2];
// Dizgenin son karakterini alalım
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Dizgenin son karakterini değiştirelim
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
Bilginize: Diğer türlerdeki değişkenlere [] veya {} kullanarak erişme çabası NULL dönmesiyle sonuçlanır.
Dizgeler '.' (nokta) işleci kullanılarak ardarda eklenebilir. '+' (toplama) işlecinin bu amaçla kullanımının yararsız oluşuna dikkat ediniz. Daha ayrıntılı bilgi edinmek için Dizge İşleçleri belgesine bakınız.
Dizgelerde değişiklik yapmak için çok sayıda yararlı işlev mevcuttur.
Genel işlevler için Dizge İşlevlerine, ileri düzey bul ve değiştir işlevselliği için düzenli ifade işlevlerine veya Perl uyumlu düzenli ifade işlevlerine bakınız.
Ayrıca, URL dizgeleri için işlevler ve dizgeleri şifrelemek veya şifrelerini çözmek için mcrypt ve mhash işlevleri vardır.
Son olarak, karakter türü işlevlerine de bakabilirsiniz.
Bir değer bir dizgeye (string) tür çarpıtması veya strval() işleviyle dönüştürülür. Bir dizgenin gerekli olduğu ifade bağlamlarında dizgeye dönüşüm özdevinimli olarak gerçekleşir. Bu genellikle, echo() veya print() işlevleri kullanılırken veya bir değişken bir dizge ile karşılaştırılırken gerçekleşir. Aşağıdakilere, Türler ve Tür Dönüşümü bölümlerinde daha ayrıntılı değinilmiştir. Ayrıca, settype() işlevine de bakabilirsiniz.
boolean türündeki TRUE değeri string türündeki "1" değerine dönüştürülür. boolean türündeki FALSE değeri string türündeki "" değerine (boş dizgeye) dönüştürülür. Bu şekilde, boolean ve string değerler arasında her iki yönde de dönüşüm yapılabilmektedir.
integer veya float türünde bir değerin string türüne dönüşümü sayının dizgesel gösterimiyle (üstel gösterim dahil) sonuçlanır. Kayan noktalı sayılar üstel gösterim kullanılarak dönüştürülebilir (4.1E+6 gibi).
Bilginize: Ondalık nokta karakteri betiğin çalıştığı yerele (LC_NUMERIC) özgüdür. Bakınız: setlocale() işlevi.
Diziler daima "Array" dizgesine dönüştürülür; bundan dolayı echo() ve print() bir dizinin içeriğini kendiliklerinden gösteremezler. Tek bir dizi elemanını görüntüleyebilmek için echo $arr['foo'] gibi bir oluşum kullanınız. İçeriğin tamamının görüntülenebilmesiyle ilgili ipuçları için aşağıya bakınız.
object türler PHP 4'te daima "Object" dizgesine dönüştürülür. Nesne özelliklerinin değerlerini hata ayıklama amacıyla basmak için aşağıdaki paragrafı okuyunuz. Nesne sınıfının ismini öğrenmek için get_class() işlevini kullanınız. PHP 5 itibariyle, uygulanabildiği takdirde, __toString yöntemi kullanılır.
resource türler daima "Resource id #1" benzeri bir dizgeye dönüştürülürler; buradaki 1, özkaynağa PHP tarafından çalışma anında atanan eşsiz bir sayıdır. Bu yapıya güvenmeseniz iyi olur; ilerde değişebilir. Özkaynağın türünü öğrenmek için get_resource_type() işlevini kullanınız.
NULL daima boş bir dizgeye dönüştürülür.
Yukarıda bahsedildiği gibi, bir diziyi, nesneyi veya özkaynağı doğrudan dönüştürmek, bunların değerleri hakkında işe yarar hiçbir bilgi sağlamaz. Bu tür içerikleri daha verimli şekilde incelemek isterseniz print_r() ve var_dump() işlevlerine bakınız.
Çoğu PHP değeri kalıcı olarak saklamak amacıyla dizgelere dönüştürülebilir. Bu yönteme dizgeleştirme adı verilir ve serialize() işlevi tarafından gerçekleştirilir. Eğer PHP motoru WDDX desteğiyle derlenmişse PHP değerleri ayrıca iyi biçimli XML metin olarak da dizgeleştirilebilir.
Bir dizge, sayısal bir bağlamda değerlendirildiğinde sonuçlanacak değer ve türün nasıl belirleneceği aşağıda açıklanmıştır.
Dizge, '.', 'e' veya 'E' karakterlerini içermiyorsa ve sayısal değeri PHP_INT_MAX ile tanımlanan genişlikte bir tamsayı ise string tür bir integer tür olarak, aksi takdirde bir float olarak değerlendirilir.
Değerin dizgenin başında belirtileceği varsayılır. Eğer dizge geçerli bir sayısal veri ile başlıyorsa sayısal değer olarak bu kullanılır. Aksi takdirde değer 0 (sıfır) olacaktır. Geçerli sayısal veri isteğe bağlı bir işaret ile başlar, bir veya daha fazla sayıda rakam ile isteğe bağlı bir ondalık nokta içerebilir ve isteğe bağlı bir üstel gösterimle sona erer. Üs, 'e' veya 'E' harfini takibeden bir veya daha fazla rakamdan oluşur.
<?php
$foo = 1 + "10.5"; // $foo float'tır (11.5)
$foo = 1 + "-1.3e3"; // $foo float'tır (-1299)
$foo = 1 + "bob-1.3e3"; // $foo integer'dir (1)
$foo = 1 + "bob3"; // $foo integer'dir (1)
$foo = 1 + "10 Small Pigs"; // $foo integer'dir (11)
$foo = 4 + "10.2 Little Piggies"; // $foo float'tır (14.2)
$foo = "10.0 pigs " + 1; // $foo float'tır (11)
$foo = "10.0 pigs " + 1.0; // $foo float'tır (11)
?>
Bu dönüşüm nakkında daha ayrıntılı bilgi edinmek için strtod(3) Unix kılavuz sayfasına bakınız.
Bu bölümdeki örneklerden birini denemek isterseniz örnekleri kopyala/yapıştır yöntemiyle aşağıdaki satıra yerleştirip neler olup bittiğini görebilirsiniz:
<?php
echo "\$foo==$foo; " . gettype ($foo) . " türündedir<br />\n";
?>
Tamsayıya dönüştürerek C'deki gibi bir karakterin kodunu alabilmeyi beklemeyin. Karakter/ASCII kod dönüşümleri için ord() ve chr() işlevlerini kullanınız.
arrayPHP'de bir dizi aslında sıralı bir eşlemdir. Bir eşlem, değerleri anahtarlarla ilişkilendiren bir veri türüdür. Bu veri türü farklı kullanım amaçları için en iyilenebilir; bir dizi, bir yöneysel liste, bir isim-değer çiftleri tablosu, bir sözlük, bir nesne listesi, yığıt, kuyruk ve daha bir sürü başka şey olarak ele alınabilir. Dizilerin değerleri, ağaçlar, diziler ve hatta çok boyutlu diziler bile olabilir.
Tüm bu veri yapılarının açıklanması bu kılavuzun amacını aşar. Fakat, en azından her biri için birer örnek verilebilir. Bu konuda daha fazla bilgi edinmek için bu konuyla ilgili olarak yayımlanmış eserleri inceleyiniz.
Bir dizi array() işlevi kullanılarak belirtilebilir. Değiştirge olarak, birbirlerinden virgüllerle ayrılmış çok sayıda anahtar => değer çifti alabilir.
array( anahtar => değer , ... ) // anahtar sadece integer veya string türünde olabilir. // değer herhangi bir türde herhangi bir değer olabilir.
<?php
$dizi = array("fu" => "bar", 12 => true);
echo $dizi["fu"]; // bar
echo $dizi[12]; // 1
?>
Bir anahtar ya integer ya da string türünde olabilir. Bir anahtar, sadece onluk tamsayı gösterimiyle belirtilmişse bir tamsayı anahtar olarak yorumlanır. Yani, "8" belirtilmeşse bu tamsayı 8 olarak ele alınacak ama "08" belirtilmişse dizge "08" olarak ele alınacaktır. float türünde belirtilen bir anahtar integer türüne aşağı yuvarlanır. PHP için indisli ve ilişkisel diziler, her ikisi de integer ve string türünde indisler içerebildiğinden aynı çeşitten dizilerdir.
değer herhangi bir PHP türünde herhangi bir değer olabilir.
Bilginize: Tanımlanmamış bir dizi anahtarına erişmeye çalışmakla tanımsız bir değişkene erişmeye çalışmak arasında fark yoktur: E_NOTICE seviyesinde bir hata iletisi çıktılanır ve sonuç NULL olur
<?php
$dizi = array("birdizi" => array(6 => 5, 13 => 9, "a" => 42));
echo $dizi["birdizi"][6]; // 5
echo $dizi["birdizi"][13]; // 9
echo $dizi["birdizi"]["a"]; // 42
?>
Bir anahtar belirtmeksizin bir değer atanıyorsa değer, mevcut tamsayı anahtarların en büyüğüne bir eklenerek elde edilen tamsayı anahtarlı elemana atanır. Bir anahtar mevcut anahtarlardan biriyle değer atıyorsa, yeni değer mevcut eleman değerinin üzerine yazılır.
<?php
// Bu iki dizi birbirinin aynıdır:
array(5 => 43, 32, 56, "b" => 12);
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>
PHP 4.3.0 öncesinde, en büyük indisi bir negatif tamsayı olan bir diziye anahtarsız değer atanması durumunda değere anahtarı yukarıda açıklandığı gibi atanırdı. PHP 4.3.0 ve sonrasında ise böyle bir durumda yeni değer 0 anahtarına atanmaktadır.
anahtar olarak TRUE belirtilirse bu tamsayı 1 olarak, FALSE belirtilirse tamsayı 0 olarak yorumlanır. anahtar olarak NULL kullanımı bir boş dizge olarak yorumlanır. Boş dizgeyle anahtar belirtimi, yeni değerin boş dizge anahtarlı olarak atanmasına sebep olur ve bu, anahtar belirtmeksizin (boş köşeli ayraçlarla) atama yapmak anlamında değerlendirilmez.
array veya object türünde anahtar belirtilemez. Aksi takdirde şöyle bir uyarı alırsınız: Illegal offset type (Kuraldışı konumlama türü).
Mevcut bir dizi, doğrudan değer atamak suretiyle değiştirilebilir.
Bu işlem, diziye köşeli ayraçlar arasında belirtilen bir anahtar kullanılarak değer atamak biçeminde yapılır. Diziye yeni bir değer atamak için köşeli ayraçlar boş olarak ([]) belirtilebilir.
$dizi[anahtar] = değer; $dizi[] = değer; // anahtar sadece integer veya string türünde olabilir. // değer herhangi bir türde herhangi bir değer olabilir.
$dizi mevcut değilse oluşturulur, dolayısıyla bu da yeni bir dizi oluşturma yöntemidir. Belli bir değeri değiştirmek için yeni değer elemana mevcut anahtar kullanılarak atanır. Belli bir elemanı (anahtar/değer çiftini) diziden silmek için unset() işlevi kullanılır.
<?php
$dizi = array(5 => 1, 12 => 2);
$dizi[] = 56; // Betiğin bu noktasında bu atama
// $dizi[13] = 56; ile aynıdır
$dizi["x"] = 42; // "x" anahtarlı yeni bir eleman atar
unset($dizi[5]); // Elemanı diziden siler
unset($dizi); // Dizinin tamamını siler
?>
Bilginize: Yukarıda değinildiği gibi, bir diziye yeni değeri bir anahtar belirtmeden atamak, mevcut en büyük tamsayı indisine bir eklenerek elde edilen anahtar kullanılarak gerçekleşir. Dizide henüz bir tamsayı indis yoksa anahtar olarak 0 (sıfır) kullanılır.
Dikkat ederseniz, dizinin mevcut olması halinde, yeni bir değer atamak için en büyük tamsayı indisli anahtar kullanmaya gerek yoktur. Buna sadece dizi yeniden indislenmişse gerek olabilir. Aşağıdaki örnek anlatımı pekiştirecektir:
<?php
// Basit bir dizi oluşturalım.
$dizi = array(1, 2, 3, 4, 5);
print_r($dizi);
// Şimdi bütün elemanları silelim ama dizi kalsın:
foreach ($dizi as $i => $value) {
unset($dizi[$i]);
}
print_r($dizi);
// Bir eleman ekleyelim (dikkat: yeni anahtar 0 değil 5 olacak!)
$dizi[] = 6;
print_r($dizi);
// Yeniden indisleyelim:
$dizi = array_values($dizi);
$dizi[] = 7;
print_r($dizi);
?>Yukarıdaki örneğin çıktısı:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Dizilerle çalışmak için kullanılabilecek işlevlerin tamamını Dizi İşlevleri bölümünde bulabilirsiniz.
Bilginize: unset() işlevi bir diziden anahtar silmeyi mümkün kılar. Ama bu silme işlemi dizinin yeniden indislenmesiyle sonuçlanmaz. Eğer silme işleminin gerçekten "sil ve kaydır" yapmasını istiyorsanız, anahtarı sildikten sonra array_values() işlevini kullanarak diziyi yeniden indislemelisiniz.
<?php
$a = array(1 => 'bir', 2 => 'iki', 3 => 'üç');
unset($a[2]);
/* Bu silme işlemi dizi şöyle tanımlanmış gibi sonuçlanacaktır:
$a = array(1 => 'bir', 3 => 'üç');
böyle DEĞİL:
$a = array(1 => 'bir', 2 =>'üç');
*/
$b = array_values($a);
// $b artık array(0 => 'bir', 1 =>'üç') olmuştur
?>
foreach denetim yapısı özellikle diziler için tasarlanmıştır. Diziler üzerinde hareket edilmesini kolaylaştırır.
Bir dizge sayıllı indis daima tırnak içinde kullanılır. Örneğin, $foo[bar] yanlışken $foo['bar'] doğrudur. Ama, neden? Eski betiklerde şu sözdizimine sıkça rastlanır:
<?php
$foo[bar] = 'düşman';
echo $foo[bar];
// ve saire
?>
Bu yanlıştır, ama çalışır. Bunun sebebi, bu kodun bir dizgeden ziyade tanımsız bir sabit (bar) belirtiyor olmasıdır. PHP ilerde şans eseri ismi aynı zamanda değeri olan bir sabit tanımlayabilir. PHP özdevinimli olarak bir çıplak dizgeyi (tırnak içine alınmamış bir dizgeyi), bu çıplak dizgeyi içeren bir dizgeye dönüştüreceğinden bu çalışır. Örneğin, bar isminde tanımlanmış bir sabit yoksa, PHP bar sabitine 'bar' dizgesini yerleştirecek ve bunu kullanacaktır.
Bilginize: Bu, "anahtarlar daima tırnak içine alınır" demek değildir. sabitleri ve değişkenleri tek tırnak içine almayın, çünkü o zaman yorumlanmazlar.
<?php
error_reporting(E_ALL);
ini_set('hataları_göster', true);
ini_set('html_hataları', false);
// Basit bir dizi:
$dizi = array(1, 2);
$sayaç = count($dizi);
for ($i = 0; $i < $sayaç; $i++) {
echo "\n$i indisi inceleniyor: \n";
echo "Kötü: " . $dizi['$i'] . "\n";
echo "İyi: " . $dizi[$i] . "\n";
echo "Kötü: {$dizi['$i']}\n";
echo "İyi: {$dizi[$i]}\n";
}
?>Yukarıdaki örneğin çıktısı:
0 indisi inceleniyor: Notice: Undefined index: $i in /dosya/yolu/betik.php on line 10 Kötü: İyi: 1 Notice: Undefined index: $i in /dosya/yolu/betik.php on line 12 Kötü: İyi: 1 1 indisi inceleniyor: Notice: Undefined index: $i in /dosya/yolu/betik.php on line 10 Kötü: İyi: 2 Notice: Undefined index: $i in /dosya/yolu/betik.php on line 12 Kötü: İyi: 2
Bu davranışla ilgili diğer örnekler:
<?php
// Tüm hataları görelim
error_reporting(E_ALL);
$dizi = array('meyve' => 'elma', 'sebze' => 'havuç');
// Doğru
print $dizi['meyve']; // elma
print $dizi['sebze']; // havuç
// Yanlış. Bu çalışır, fakat meyve tanımlanmamış bir sabit
// olmadığından E_NOTICE seviyesinde bir PHP hatası oluşur
//
// Notice: Use of undefined constant meyve - assumed 'meyve'...
print $dizi[meyve]; // elma
// Bu, neler olup bittiğini gösteren bir sabit tanımlar;
// 'sebze' değeri meyve sabitine atanır.
define('meyve', 'sebze');
// Şimdi farkı görelim
print $dizi['meyve']; // elma
print $dizi[meyve]; // havuç
// Bir dizge içinde olduğundan bu da doğrudur.
// Dizge içinde kalan sabitler, sabit olarak ele alınmazlar;
// dolayısıyla burada bir E_NOTICE oluşmaz.
print "Turfanda $dizi[meyve]"; // Turfanda elma
// Bir istisna: Dizge içinde kaşlı ayraç içine alınmış
// sabitler, sabit olarak ele alınırlar.
print "Turfanda {$dizi[meyve]}"; // Turfanda havuç
print "Turfanda {$dizi['meyve']}"; // Turfanda elma
// Bu çalışmaz ve şöyle bir çözümleme hatasıyla sonuçlanır:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Bu, dizgeler içindeki süper küresellere de uygulanır.
print "Turfanda $dizi['meyve']";
print "Turfanda $_GET['foo']";
// Ard arda eklemek de bir seçenektir
print "Turfanda " . $dizi['meyve']; // Turfanda elma
?>
error_reporting yönergesine E_NOTICE seviyesinden hataları gösterecek bir atama yapılırsa (örneğin, E_ALL atanarak), böyle kullanımlar hemen görünür duruma gelir. error_reporting yönergesinin öntanımlı değeriyle E_NOTICE seviyesinden hatalar gösterilmez.
Sözdizimi bölümünde değinildiği gibi, köşeli ayraçlar ('[' ve ']') içinde belirtilenlerin birer ifade olması gerekir. Yani, aşağıdaki gibi bir kod çalışacaktır:
<?php
echo $dizi[birişlev($bar)];
?>
Bu, bir işlevin dönüş değerinin dizi indisi olarak kullanımına bir örnektir. PHP kendi sabitlerini de tanır:
<?php
$error_descriptions[E_ERROR] = "Ölümcül bir hata oluştu";
$error_descriptions[E_WARNING] = "PHP bir uyarı verdi";
$error_descriptions[E_NOTICE] = "Bu sadece bilgilendirici bir uyarı";
?>
E_ERROR sabitinin de ilk örnekteki bar kadar geçerli bir betimleyici oluşuna dikkat ediniz. Fakat, E_ERROR eşittir 1, vb. olduğundan aşağıdaki örnek de aynı işi yapar:
<?php
$error_descriptions[1] = "Ölümcül bir hata oluştu";
$error_descriptions[2] = "PHP bir uyarı verdi";
$error_descriptions[8] = "Bu sadece bilgilendirici bir uyarı";
?>
Bilinmeyen bir gelecekte PHP ekibi başkalarının kodlarıyla çelişen bir
sabit, bir anahtar sözcük veya bir değişken eklemek isteyebilir.
Örneğin, empty ve default birer anahtar sözcük olduklarından bu amaçla
kullanılmaları yanlıştır.
Bilginize: Yinelemek gerekirse, çift tırnak imleri arasına alınmış bir dizge, dizi indisini tırnak içine almadığından geçerlidir; yani, "$foo[bar]" geçeridir. Yukarıdaki örnekleri bu gözle tekrar inceleyin ve ayrıca dizgelerin içinde değişken çözümleme bölümüne de bakın.
integer, float, string, boolean veya resource türünde bir değeri array türünde bir değere dönüştürme işlemi, sıfır indisli bir elemana bu değerin atanması ile sonuçlanır. Başka bir deyişle, (array)$sayılDeğer ile array($sayılDeğer) arasında bir fark yoktur.
Bir object türü array türüne dönüştürme işlemi, elemanları nesnenin üyeleri olan bir dizi ile sonuçlanır. Anahtarlar, bir kaç istisnai durum dışında üyelerin isimleridir: Tamsayı özellikler erişilebilir değildir; private değişkenlerin önüne sınıf isimleri getirilir; public değişkenlerin önünde bir '*' olur. Diğer taraftan, başlarına birşeyler eklenmiş böyle değişkenlerin değerleri NULL olur. Bu durum beklenmedik davranışlara yol açabilir:
<?php
class A {
private $A; // Bu '\0A\0A' haline gelir.
}
class B extends A {
private $A; // Bu '\0B\0A' haline gelir.
public $AA; // Bu 'AA' haline gelir.
}
var_dump((array) new B());
?>
Bu örneğin çıktısı 'AA' isimli iki anahtar görüntülerse de onlardan birinin ismi aslında '\0A\0A''dır.
NULL, bir diziye dönüştürülmek istenirse sonuç boş bir dizi olur.
Dizileri array_diff() işleviyle veya dizi işleçleri kullanılarak karşılaştırmak mümkündür.
PHP'nin array türü çok yeteneklidir. Bazı örnekler:
<?php
// Bu:
$a = array( 'renk' => 'kırmızı',
'lezzet' => 'tatlı',
'şekil' => 'yuvarlak',
'isim' => 'elma',
4 // anahtarı 0 olacaktır
);
$b = array('a', 'b', 'c');
// . . . buna tamamen eşdeğerdir:
$a = array();
$a['renk'] = 'kırmızı';
$a['lezzet'] = 'tatlı';
$a['şekil'] = 'yuvarlak';
$a['isim'] = 'elma';
$a[] = 4; // anahtarı 0 olacaktır
$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// Yukarıdaki kod çalıştırıldığında $a, array('renk' => 'kırmızı',
// 'lezzet' => 'tatlı', 'şekil' => 'yuvarlak', 'isim' => 'elma', 0 => 4)
// dizisiyle, $b ise array(0 => 'a', 1 => 'b', 2 => 'c') veya basitçe
// array('a', 'b', 'c') dizisiyle sonuçlanacaktır.
?>
Örnek 1 - array() kullanımı
<?php
// Özellik eşlemeli dizi
$map = array( 'sürüm' => 4,
'sistem' => 'Linux',
'dil' => 'english',
'kısaltma' => true
);
// tamamen sayısal anahtarlar
$dizi = array( 7,
8,
0,
156,
-10
);
// Bu, array(0 => 7, 1 => 8, ...) ile aynıdır
$geçişli = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // anahtar = 6 (en büyük tamsayı indis 5 idi)
'8' => 2, // anahtar = 8 (tamsayı!)
'02' => 77, // anahtar = '02'
0 => 12 // 10 değerinin üzerine 12 yazılacak
);
// boş dizi
$boş = array();
?>
Örnek 2 - Derlem
<?php
$renkler = array('Turuncu', 'Pembe', 'Mor', 'Turkuaz');
foreach ($renkler as $renk) {
echo "$renk rengi sever misiniz?\n";
}
?>
Yukarıdaki örneğin çıktısı:
Turuncu rengi sever misiniz? Pembe rengi sever misiniz? Mor rengi sever misiniz? Turkuaz rengi sever misiniz?
PHP5'ten beri dizi değerleri gönderimli aktarıldıklarından dizi değerlerini doğrudan değiştirmek mümkündür. Fakat arada bazı şeyler yapmak gerekir:
Örnek 3 - Derlem
<?php
<?php
$renkler = array('Turuncu', 'Pembe', 'Mor', 'Turkuaz');
// PHP 5
foreach ($renkler as &$renk) {
$renk = strtoupper($renk);
}
unset($renk); /* Aşağıdaki atamalarda $renk son
dizi elemanını değiştirmesin */
// Eski sürümü yeniden elde edelim
foreach ($renkler as $anahtar => $renk) {
$renkler[$anahtar] = strtoupper($renk);
}
print_r($renkler);
?>
Yukarıdaki örneğin çıktısı:
Array
(
[0] => TURUNCU
[1] => PEMBE
[2] => MOR
[3] => TURKUAZ
)
Bu örnekte dizi indisleri 1'den başlatılmaktadır.
Örnek 4 - İndisi 1'den başlatmak
<?php
$ilkçeyrek = array(1 => 'Ocak', 'Şubat', 'Mart');
print_r($ilkçeyrek);
?>
Yukarıdaki örneğin çıktısı:
Array
(
[1] => Ocak
[2] => Şubat
[3] => Mart
)
Örnek 5 - Diziyi doldurmak
<?php
// bir diziyi bir dizin'in içeriği ile dolduralım
$tutamak = opendir('.');
while (false !== ($dosya = readdir($tutamak))) {
$dosyalar[] = $dosya;
}
closedir($tutamak);
?>
Diziler sıralıdır. Sıralama çeşitli sıralama işlevleri ile değiştirilebilir. Daha fazla bilgi için Dizi İşlevleri bölümüne bakınız. Bir dizinin eleman sayısını öğrenmek için count()işlevi kullanılabilir.
Örnek 6 - Dizi elemanlarının sıraya sokulması
<?php
sort($dosyalar);
print_r($dosyalar);
?>
Bir dizinin elemanlarına her türlü değer atanabileceğinden başka bir dizi de atanabilir. Böylece iç içe ve çok boyutlu dizilerin oluşturulması mümkün olur.
Örnek 7 - İç içe ve çok boyutlu diziler
<?php
$yemişler = array ( "yemişler" => array ( "a" => "iğde",
"b" => "badem",
"c" => "ceviz"
),
"sayılar" => array ( 1,
2,
3,
4,
5,
6
),
"yuvalar" => array ( "birinci",
5 => "ikinci",
"üçüncü"
)
);
// Yukarıdaki dizinin değerlerinin kullanıldığı bazı örnekler
echo $yemişler["yuvalar"][5]; // "ikinci" basar
echo $yemişler["meyveler"]["a"]; // "iğde" basar
unset($yemişler["yuvalar"][0]); // "birinci" silinir
// Yeni bir çok boyutlu dizi oluşturalım
$meyveler["elma"]["yeşil"] = "ekşi";
?>
Dizi atamaları daima değerleri kopyalamak şeklinde gerçekleşir. Bir diziyi gönderimli olarak kopyalamak için gönderim işleci kullanılır.
<?php
$dizi1 = array(2, 3);
$dizi2 = $dizi1;
$dizi2[] = 4; // $dizi2 değişti,
// $dizi1 hala array(2, 3)
$dizi3 = &$dizi1;
$dizi3[] = 4; // şimdi $dizi1 ve $dizi3 aynı
?>
objectYeni bir nesne oluşturmak için (bir sınıfın bir örneğini oluşturmak için) new deyimi kullanılır:
<?php
class kediler
{
function birŞeySöyle()
{
echo "Miyav.";
}
}
$kedi = new kediler;
$kedi->birŞeySöyle();
?>
Çok daha ayrıntılı bilgiyi Sınıflar ve Nesneler faslında bulabilirsiniz.
object türüne dönüşümEğer object türünde bir değer object türüne dönüştürülürse bir değişiklik olmaz. Başka türde bir değer object türüne dönüştürülürse yerleşik stdClass sınıfının yeni bir örneği oluşturulmuş olur. Eğer değer NULL ise yeni örnek boş olur. Bir dizi object türüne dönüştürülürse dizi elemanlarının isimleri değerleriyle birlikte nesnenin özellikleri haline gelirler. Diğer değerler ise, scalar adlı üye değişkenin değeri haline gelirler.
<?php
$nesne = (object) 'heyo';
echo $nesne->scalar; // çıktısı: 'heyo'
?>
resourceresource türünde bir değişken harici bir özkaynağa bir gönderim içeren özel bir değişkendir. Özkaynaklar özel işlevler tarafından oluşturulur ve kullanılırlar. resource türüyle ilişkilendirilebilen özkaynakların ve özel işlevlerin bir listesini eklerde bulabilirsiniz.
Bilginize: resource türü PHP 4'ten itibaren mevcuttur.
Ayrıca, get_resource_type() işlevine de bakınız.
resource türüne dönüşümAçık dosyalara, veritabanı bağlantılarına, resim tuval alanlarına ve benzerlerine birer tanıtıcı sağlayan değişkenleri resource türüne dönüştürmenin bir anlamı yoktur.
PHP 4'ün Zend Motoru sayesinde gönderimsiz kalan özkaynaklar özdevinimli olarak saptanarak bunlara ayrılan bellek çöp toplayıcı tarafından serbest bırakılmaktadır. Bu sebeple bir özkaynağa ayrılan belleği serbest bırakmak ihtiyacı nadiren ortaya çıkar.
Bilginize: Kalıcı veritabanı bağlantıları bu kuralın bir istisnasıdır. Çöp toplayıcı tarafından yok edilmezler. Bu konuda daha ayrıntılı bilgi edinmek için kalıcı bağlantılar bölümüne bakınız.
NULLÖzel NULL değeri, değeri olmayan bir değişken anlamına gelir. NULL değerinin olası tek türü NULL'dur.
Bilginize: NULL türü PHP 4'ten itibaren mevcuttur.
Bir değişken NULL türündeyse:
Kendisine NULL sabiti atanmış demektir.
Kendisine herhangi bir değer atanmamış demektir.
unset() işlevine aktarılmış demektir.
NULL türünde, büyük-küçük harfe duyarlı olarak tek bir değer vardır: NULL.
<?php
$var = NULL;
?>
Bir değişkenin türü (null) ile çarpıtılırsa değişken değersiz bırakılarak tanımsız hale getirilmiş olur.
mixedmixed anahtar sözcüğü, bir değiştirgenin çok sayıda tür (ama hepsini değil) kabul edebileceğini belirtir.
Örneğin, str_replace() işlevi sadece string veya array türünde değer kabul ederken, gettype() işlevi tüm PHP türlerini kabul eder.
numbernumber anahtar sözcüğü, bir değiştirgenin integer veya float türünde değer kabul edeceğini belirtir.
callbackcall_user_func(), usort() gibi işlevler değiştirge olarak kullanıcı tanımlı geriçağırım işlevlerini kabul ederler. Geriçağırım işlevleri her zaman basit işlevler olmayabilir, nesne yöntemleri ve hatta duruk sınıf yöntemleri bile olabilirler.
Bir PHP işlevi, string türündeki ismiyle aktarılır. Şu dil oluşumları dışında herhangi bir yerleşik veya kullanıcı tanımlı işlev kullanılabilir: array(), echo(), empty(), eval(), exit(), isset(), list(), print() veya unset().
Örneklenmiş bir nesnenin bir yöntemi, nesnenin ismi 0. indiste, yöntem ismi 1. indiste yer alan bir dizi olarak aktarılır.
Duruk sınıf yöntemleri de sınıf ismi 0. indiste içerilerek, sınıf bir nesne olarak örneklenmeksizin aktarılabilir.
create_function() işlevi bildik kullanıcı tanımlı işlevlerden başka, bir anonim geriçağırım işlevi oluşturmak için de kullanılabilir. PHP 5.3.0'dan itibaren işleve değiştirge olarak bir anonim işlev aktarmak mümkün oldu.
Örnek 1 - Geriçağırım işlevi örnekleri
<?php
// Bir geriçağırım işlevi örneği
function geriçağırım_işlevim() {
echo 'merhaba dünya!';
}
// Bir geriçağırım yöntemi örneği
class Sınıfım {
static function geriçağırımYöntemim() {
echo 'Merhaba Dünya!';
}
}
// 1. tür: Basit geriçağırım
call_user_func('geriçağırım_işlevim');
// 2. tür: Duruk sınıf yöntemi çağrısı
call_user_func(array('Sınıfım', 'geriçağırımYöntemim'));
// 3. tür: Nesne yöntemi çağrısı
$nesne = new Sınıfım();
call_user_func(array($nesne, 'geriçağırımYöntemim'));
// 4. tür: Duruk sınıf yöntemi çağrısı (PHP 5.2.3 ve sonrası)
call_user_func('Sınıfım::geriçağırımYöntemim');
// 5. tür: Göreli duruk sınıf yöntemi çağrısı (PHP 5.2.3 ve sonrası)
class A {
public static function kimsin() {
echo "A\n";
}
}
class B extends A {
public static function kimsin() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::kimsin')); // A
?>
Örnek 2 - Anonim işlev kullanan bir geriçağırım işlevi örneği
<?php
// Anonim işlevimiz
$double = function($a) {
return $a * 2;
};
// Sayı aralığımız
$numbers = range(1, 5);
// Aralık içindeki her elemanın boyutunu
// ikiye katlamak için geriçağırım işlevi
// olarak burada anonim bir işlev kullanalım
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
Yukarıdaki örneğin çıktısı:
2 4 6 8 10
Bilginize: PHP4'te, kopyayı değil de asıl nesneyi işaret eden bir geriçağırım oluşturmak için gönderim kullanmak gerekir. Daha fazla bilgi için Gönderimler Hakkında bölümüne bakınız.
voidvoid bir dönüş türü olarak dönüş değerinin yararsız olduğu anlamına gelir. void bir değiştirge listesinde kullanıldığında işlevin değiştirge kabul etmediği anlamına gelir.
$... değiştirgesi işlev bildirimlerinde "ve benzerleri" anlamına gelir. Bu değişken ismi bir işlevde kullanıldığında işlev sonsuz sayıda değiştirge alabilir.
PHP değişken bildiriminde tür tanımlamayı gerektirmez (veya desteklemez); bir değişkenin türü kullanıldığı bağlama göre saptanır. Yani, string türünde bir değer $var değişkenine atanırsa $var, string türünde bir değişken haline gelir. $var değişkenine bir integer değer atanırsa $var, integer türünde bir değişken haline gelir.
Toplama işleci '+', PHP'nin özdevinimli tür dönüşümüne iyi bir örnektir. Bir toplama işleminde terimlerden biri float türündeyse her iki terim float olarak ele alınır ve sonuç float türünde olur. Aksi takdirde, terimler integer olarak yorumlanır ve sonuç integer türünde olur. Yalnız dikkat edin, bu işlem ne terimlerin kendi türlerini ne de ifadenin kendi türünü değiştirir.
<?php
$foo = "0"; // $foo string türündedir (ASCII 48)
$foo += 2; // $foo integer türündedir (2)
$foo = $foo + 1.3; // $foo float türündedir (3.3)
$foo = 5 + "10 Little Piggies"; // $foo integer türündedir (15)
$foo = 5 + "10 Small Pigs"; // $foo integer türündedir (15)
?>
Eğer yukarıdaki son iki örnek size tuhaf geldiyse Dizgelerin sayıya dönüşümü konusuna bakınız.
Bir değişkeni belli bir türe dönüşmeye zorlamak istiyorsanız Tür Çarpıtma konusuna bakınız. Bir değişkenin türünü değiştirmek istiyorsanız settype() işlevine bakınız.
Bu bölümdeki örnekleri sınamak için var_dump() işlevini kullanınız.
Bilginize: array türüne özdevinimli dönüşüm şimdilik tanımsızdır.
Ayrıca, PHP dizgelerde konumlar üzerinden indislemeyi dizi indislemede kullanılan sözdizimiyle desteklediğinden aşağıdaki örnek tüm PHP sürümleri için geçerli bir örnektir:
<?php
$a = 'car'; // $a string türündedir
$a[0] = 'b'; // $a hala string türündedir
echo $a; // -> bar
?>Daha fazla bilgi edinmek için Karakterinden dizgeye erişim konusuna bakınız.
PHP'de tür çarpıtma (type casting) C'deki gibi çalışır: İstenen türün ismi parantez içinde türü çarpıtılacak değişkenin önüne yazılır.
<?php
$foo = 10; // $foo integer türündedir
$bar = (boolean) $foo; // $bar boolean türündedir
?>
İzin verilen çarpıtmalar:
(binary) çarpıtması ve b önekinin ileriye dönük desteği PHP 5.2.1'de eklenmiştir.
Parantezler içinde sekmelere ve boşluklara izin verildiğinden aşağıdaki iki deyim eşdeğerdir:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Normal dizgelerin ikil dizgelere dönüştürülmesi:
<?php
$binary = (binary) $string;
$binary = b"ikil dizge";
?>
Bilginize: Bir değişkenin türünü string türüne çarpıtmak yerine değişkeni çift tırnak içine almak aynı sonucu sağlar:
<?php
$foo = 10; // $foo integer türündedir
$str = "$foo"; // $str string türündedir
$fst = (string) $foo; // $fst de string türündedir
// Bu, "bunlar aynı" basar
if ($fst === $str) {
echo "bunlar aynı";
}
?>
Belli türler arasında çarpıtma yapılırken tam olarak ne olup bittiği açıkça belli olmayabilir. Daha fazla bilgi için şu bölümlere bakınız:
PHP'de değişkenler dolar işaretini takip eden bir değişken adı ile gösterilir. Değişken adı büyük-küçük harf duyarlıdır.
Değişken isimleri PHP'deki diğer yaftalarla aynı kurallara tabidir. Geçerli bir değişken ismi bir harf veya alt çizgi imi ile başlar, herhangi sayıda harf, sayı veya alt çizgi iminden oluşur. Düzenli ifade olarak, şu şekilde ifade edilebilir: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Bilginize: Burada kastedilen harf a-z veya A-Z arasındaki ASCII harfler ve 127 ile 255 (0x7f-0xff) arasındaki baytlardır.
Bilginize: $this atama yapılamayan özel bir değişkendir.
Ayrıca Kullanıcı Alanı İsimlendirme Kılavuzu belgesine de bakınız.
Değişkenlerle ilgili işlevler hakkında bilgi için, Değişkenlerle ilgili işlevler belgesine bakınız.
<?php
$var = 'Kemal';
$Var = 'gel';
echo "$var, $Var"; // "Kemal, gel" yazdırır
$4site = 'dene bakalım'; // geçersiz; sayı ile başlar
$_4site = 'dene bakalım'; // geçerli; alt çizgi ile başlar
$diğer = 'gerekirse diye'; // geçerli; ISO-8859-9'da 'ğ' harfi 127-255
// arasında, UTF-8'de ise iki baytı 127-255
// arasındadır.
?>
Öntanımlı olarak, değişkenler her zaman değerleriyle atanır. Başka bir deyişle, bir değişkene bir ifade atandığında özgün ifade bütün değeriyle hedef değişkene kopyalanır. Bu demektir ki, örneğin, bir değişkenin değerini başka bir değişkene atadıktan sonra, değişkenlerden birisinin değerini değiştirmenin diğeri üzerinde etkisi olmayacaktır. Bu çeşit atama hakkında daha fazla bilgi için, İfadeler bölümüne bakınız.
PHP değişkenlere değer atamak için başka bir yol daha sunar: Gönderimli atama. Yani, yeni değişken sadece asıl değişkene gönderim yapar (diğer bir deyişle, "onun takma adı olur" veya "onu gösterir") Gönderim yapılan değişkendeki değişiklikler aslını da etkiler, tersi de geçerlidir.
Gönderimli atama için, gönderim yapılacak (daha önce değer atanmış) değişkenin başına ve imi (&) ekleyin. Örneğin, aşağıdaki kod parçası iki kez 'Benim adım Mustafa' yazar:
<?php
$foo = 'Mustafa'; // 'Mustafa' değerini $foo değişkenine ata
$bar = &$foo; // $foo değişkenini $bar değişkenine gönderimli ata
$bar = "Benim adım $bar"; // $bar değişkenini değiştir ...
echo $bar;
echo $foo; // $foo değişkeninin değeri de değişti.
?>
Dikkat edilmesi gereken önemli bir şey de sadece isimli değişkenlerin gönderimle atanabileceğidir.
<?php
$foo = 25;
$bar = &$foo; // Bu geçerli bir atamadır.
$bar = &(24 * 7); // Geçersiz; isimlendirilmemiş bir ifadeye gönderim yapıyor
function test()
{
return 25;
}
$bar = &test(); // Geçersiz.
?>
PHP'de değişkenleri ilklendirmek gerekmez ancak baştan bir değer atamak oldukça iyi bir alışkanlıktır. İlklendirilmeyen değişkenlerin kullanıldıkları bağlamda türlerine bağlı olarak öntanımlı değerleri vardır; öntanımlı değer boolean için FALSE, integer ve float için sıfır, string için boş metin (örnekte echo() da kullanıldı), array için ise boş bir dizidir.
Örnek 1 - İlklendirilmemiş değişkenlerin öntanımlı değerleri
<?php
// Herhangi bir bağlamda tanımlanmamış veya
// gönderim yapılmamış değişken; NULL sonuç verir.
var_dump($tanımsız_değişken);
// Mantıksal değer kullanımı; 'false' çıktısı verir
// (Bu sözdizimi için üç terimli işlecine bakınız)
echo($tanımsız_mantıksallık ? "true\n" : "false\n");
// Dizge kullanımı; çıktısı: 'string(3) "abc"'
$tanımsız_metin .= 'abc';
var_dump($tanımsız_metin);
// Tamsayı kullanımı; 'int(25)' çıktılar.
$tanımsız_tamsayı += 25; // 0 + 25 => 25
var_dump($tanımsız_tamsayı);
// Gerçek sayı kullanımı; 'float(1.25)' çıktılar.
$tanımsız_sayı += 1.25;
var_dump($tanımsız_sayı);
// Dizi kullanımı; çıktısı: array(1) { [3]=> string(3) "def" }
$tanımsız_dizi[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($tanımsız_dizi);
// Nesne kullanımı; yeni stdClass nesnesi oluşturur
// (Öntanımlı sınıflar belgesine bakınız:
// http://www.php.net/manual/tr/reserved.classes.php)
// Çıktısı: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$tanımsız_nesne->foo = 'bar';
var_dump($tanımsız_nesne);
?>
İlklendirilmemiş bir değişkenin öntanımlı değerine güvenmek, içinde aynı değişken isminin kullanıldığı bir dosyayı betiğe dahil ettiğinizde sorun çıkarır. Bunun aynı zamanda büyük bir güvenlik riski omuşturmaması için register_globals yönergesine 'on' değeri atanmalıdır. İlklendirilmemiş değişken kullanımı E_NOTICE seviyesinde hata oluşturur, ancak ilklendirilmemiş bir diziye eleman eklenmesi halinde hata oluşmaz. isset() dil oluşumu bir değişkenin ilklendirilip ilklendirilmediğini öğrenmek için kullanılabilir.
PHP çalıştırdığı herhangi bir betiğe çok sayıda önceden tanımlı değişken sağlar. Ancak, bu değişkenlerin çoğu hangi sunucunun çalıştığına, sunucunun sürümüne ve kurulumuna ve başka bir çok şeye bağlı olduğu için tam olarak belgelendirilememektedir. Bu değişkenlerden bazıları PHP komut satırından çalıştığında mevcut olmayacaktır. Bu değişkenlerin listesi için, lütfen Öntanımlı Değişkenler kısmına bakınız.
PHP 4.2.0 ve sonrasında, register_globals PHP yönergesinin öntanımlı değeri off'tur. Bu PHP'de büyük bir değişikliktir. register_globals'ın off olması betik genelinde geçerli önceden tanımlı bir gurup değişkeni etkiler. Örneğin, DOCUMENT_ROOT'u almak için $DOCUMENT_ROOT yerine $_SERVER['DOCUMENT_ROOT'], http://mesela.dom/dnm.php?id=3 adresi için $id yerine $_GET['id'] veya $HOME yerine $_ENV['HOME'] kullanmalısınız.
Bu değişiklikle ilgili bilgi için, register_globals yapılandırma yönergesini, güvenlik bölümündeki Küresel Kayıtların Kullanımı belgesini, PHP » 4.1.0 ve » 4.2.0 sürüm duyurularını okuyun.
Süper küresel diziler gibi PHP'nin Önceden Tanımlı Değişkenlerinin de kullanımı önerilmektedir.
PHP, 4.1.0 sürümünden sonra, ortam değişkenleri ve kullanıcı girdi değişkenleri ile HTTP sunucusundaki değişkenleri (eğer uygulanabiliyorsa) içeren bir takım önceden tanımlı diziler sağlamaktadır. Bu yeni diziler özel olmaktan ziyade özdevinimli olarak küreseldir, yani, özdevinimli olarak her etki alanında bulunurlar. Bu nedenle, "Süper küreseller" olarak bilinirler. (PHP'de kullanıcı-tanımlı süper küreseller için bir mekanizma yoktur.) Süper küreseller aşağıda listelenmiştir; PHP önceden tanımlı değişkenlerin açıklamaları ve doğaları ise Öntanımlı Değişkenler bölümünde listelenmiştir. Ayrıca, eskiden kalma öntanımlı değişkenlerin de ($HTTP_*_VARS) hala mevcut olduğunu bilmenizde yarar var. PHP 5.0.0'dan itibaren öntanımlı değişken dizileri register_long_arrays yönergesi ile iptal edilebilmektedir.
Bilginize: Değişken değişkenler
İşlevler veya sınıf yöntemleri içinde süper küreseller değişken değişkenleri olarak kullanılamazlar.
Bilginize: Süper küreseller ve HTTP_*_VARS aynı anda var olabilirlerse de birbirlerinin yerine kullanılamazlar, yani birini değiştirmekle diğerini değiştirmiş olmazsınız.
Eğer variables_order yönergesine uygun değişkenler atanmamışsa, ilgili oldukları PHP önceden tanımlı dizileri de boş bırakılır.
Bir değişkenin etki alanı içinde tanımlandığı bağlamdır. Hemen her PHP değişkeninin sadece tek bir etki alanı vardır. Bu tek etki alanı betiğe include() ve require() ile dahil edilen dosyalara da uzanır. Örneğin:
<?php
$a = 1;
include 'b.inc';
?>
Burada $a değişkeni içerilen b.inc betiğinin içinde mevcut olacaktır. Fakat, kullanıcı tanımlı işlevlerin etki alanı işleve özeldir. Yani, bir işlev içinde kullanılan herhangi bir değişkenin etki alanı öntanımlı olarak işlevin yerel etki alanı ile sınırlıdır. Örneğin:
<?php
$a = 1; /* küresel etki alanı */
function deneme()
{
echo $a; /* işlevin etki alanı */
}
deneme();
?>
Bu betik herhangi bir çıktı üretmeyecektir, çünkü echo ifadesi $a değişkeninin yerel sürümüne atıf yapmakta olup bu etki alanı içinde değişkene bir değer atanmamıştır. Bunun C dilinden bir miktar farklı olduğuna dikkat etmiş olabilirsiniz, C dilinde küresel değişkenler, özellikle yerel bir tanımla geçersiz kılınmadıkları sürece, işlevler tarafından özdevinimli olarak erişilebilir olacaktır. Bu bazı sorunlara neden olabilir, öyle ki birileri dikkatsizlikle küresel değişkeni değiştirebilir. PHP'de küresel değişkenler eğer bir işlev içinde kullanılacaksa, o işlev içinde global sözcüğü ile bildirilmeleri gerekir.
İlk olarak, global kullanımına bir örnek verelim:
Örnek 1 - global kullanımı
<?php
$a = 1;
$b = 2;
function topla()
{
global $a, $b;
$b = $a + $b;
}
topla();
echo $b;
?>
Yukarıdaki betik 3 çıktısı verecektir. $a ve $b işlev içinde küresel tanımlanarak, her iki değişkene yapılan bütün atıflar küresel sürüme yapılmış olacaktır. Bir işlev tarafından işlenebilecek küresel değişken sayısında bir sınır yoktur.
Küresel etki alanındaki değişkenlere erişimin ikinci yolu PHP tarafından tanımlanmış özel $GLOBALS dizisini kullanmaktır. Önceki örnek şu şekilde yazılabilir:
Örnek 2 - global yerine $GLOBALS kullanımı
<?php
$a = 1;
$b = 2;
function topla()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
topla();
echo $b;
?>
$GLOBALS dizisi, anahtarı küresel değişkenin ismi, elemanının değeri değişkenin içeriği olan bir ilişkisel dizidir. $GLOBALS dizisinin her etki alanında mevcut oluşuna dikkat edin, bunun sebebi$GLOBALS dizisinin bir süper küresel olmasıdır. Süper küresellerin gücünü gösteren bir örnek aşağıda verilmiştir:
Örnek 3 - Süper küreselleri ve etki alanlarını gösteren örnek
<?php
function test_global()
{
// Çoğu öntanımlı değişken "süper" değildir ve işlev etki
// alanında geçerli olmak 'global' olmayı gerektirir.
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['isim'];
// Süper küreseller her etki alanında geçerlidirler ve
// 'global' olarak bildirilmeleri gerekmez. Süper küreseller
// PHP 4.1.0'dan beri mevcutturlar ve HTTP_POST_VARS'ın
// kullanımı artık önerilmemektedir.
echo $_POST['isim'];
}
?>
Değişken etki alanı ile ilgili önemli özelliklerden biri duruk değişkenlerdir. Bir duruk bir değişken sadece işlevin etki alanında geçerli olup, programın çalışması bu etki alanını terkettiği zaman değerini kaybetmez. Aşağıdaki örneğı ele alalım:
Örnek 4 - Duruk değişkenlere ihtiyacı gösteren örnek
<?php
function dene()
{
$a = 0;
echo $a;
$a++;
}
?>
Bu işlev her çağrıldığında $a'yı 0 yapar ve 0 yazdırır, bu nedenle oldukça kullanışsızdır. Değişkeni artıran $a++ bir işe yaramaz çünkü işlev çıktığı gibi $a değişkeni kaybolur. Kaldığı değeri kaybetmeyecek kullanışlı bir sayaç işlevi yapması için $a değişkeni aşağıda static olarak bildirilmiştir.
Örnek 5 - Duruk değişkenlerin kullanım örneği
<?php
function dene()
{
static $a = 0;
echo $a;
$a++;
}
?>
Artık, $a değişkeni sadece dene() işlevinin ilk çağrılışında ilklendirilecek ve işlevin her çağrılışında $a değişkeninin değerini bastıktan sonra değerini bir artıracaktır.
Duruk değişkenler aynı zamanda kendini çağıran işlevlerle çalışmak için de bir yol sunar. Kendini çağıran (recursive) işlev kendi kendini çağırır. Böyle bir işlev dikkatli yazılmazsa sonsuza kadar kendi kendini çağırır. Kendini çağırmayı bir noktada sonlandıracak uygun bir yönteminiz olmalıdır. Aşağıdaki basit işlev, kendini çağırmayı nerede durduracağını bilerek 10'a kadar sayar:
Örnek 6 - Kendini çağıran işlevlerle duruk değişkenler
<?php
function say()
{
static $sayaç = 0;
$sayaç++;
echo "$sayaç\n";
if ($sayaç < 10) {
say();
}
$sayaç--;
}
say();
?>
Bilginize: Duruk değişkenler yukarıdaki örneklerde yapıldığı gibi tanımlanabilir. Bu değişkenlere ifadelerin sonuçlarını değer olarak atamaya çalışmak çözümleme hatasına neden olacaktır.
Örnek 7 - Duruk değişken bildirimi
<?php
function foo(){
static $int = 0; // doğru
static $int = 1+2; // yanlış (ifade olduğu için)
static $int = sqrt(121); // yanlış (bu da ifade olduğu için)
$int++;
echo $int;
}
?>
Bilginize: Duruk bildirimler derleme sırasında çözümlenir.
PHP 4'ün işletmeni olan Zend Motoru 1, static ve global değişken niteleyicilerini gönderim olarak gerçeklemiştir. Örneğin, global deyimi ile bir işlevin etki alanında geçerli kılınan bir küresel değişken aslında kendine bir gönderim oluşturur. Bu durum aşağıdaki örnekte de görüldüğü gibi beklenmedik davranışlara yol açabilir:
<?php
function gönderimli_küresel_dene() {
global $nesne;
$nesne = &new stdclass;
}
function gönderimsiz_küresel_dene() {
global $nesne;
$nesne = new stdclass;
}
gönderimli_küresel_dene();
var_dump($nesne);
gönderimsiz_küresel_dene();
var_dump($nesne);
?>
Yukarıdaki örneğin çıktısı:
Aynı davranış static deyimine de uyar. Gönderimler duruk olarak saklanmazlar:
<?php
function &gönderimli_örnek() {
static $obj;
echo 'Duruk nesne: ';
var_dump($obj);
if (!isset($obj)) {
// Duruk değişkene gönderim atayalım
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}
function &gönderimsiz_örnek() {
static $obj;
echo 'Duruk nesne: ';
var_dump($obj);
if (!isset($obj)) {
// Duruk değişkene nesne atayalım
$obj = new stdclass;
}
$obj->property++;
return $obj;
}
$nesne1 = gönderimli_örnek();
$bu_da_nesne1 = gönderimli_örnek();
echo "\n";
$nesne2 = gönderimsiz_örnek();
$bu_da_nesne2 = gönderimsiz_örnek();
?>
Yukarıdaki örneğin çıktısı:
Bu örnek, bir duruk değişkene gönderimli atama yapılması halinde, &gönderimli_örnek() işlevi ikinci kez çağrıldığında değişkene atanan değerin saklanmadığını gösterir.
Bazen değişken değişken isimlerine sahip olabilmek kullanışlı olur. Bu, devingen olarak belirtilebilen ve kullanılabilen bir değişken ismidir. Normal bir değişken şöyle bir deyimle atanır:
<?php
$a = 'merhaba';
?>
Bir değişken değişken bir değişkenin değerini alır ve bir değişkenin ismi gibi davranır. Yukarıdaki örnekteki, merhaba, iki tane dolar imi ile bir değişken ismi olarak kullanlabilir
<?php
$$a = 'dünya';
?>
Bu noktada PHP sembol ağacında iki değişken tanımlanmış ve saklanmış olur: $a "merhaba" içerirken $merhaba ise "dünya" içerir. Bu nedenle, aşağıdaki iki örnek aynı sonucu üretir:
<?php
echo "$a ${$a}";
?>
<?php
echo "$a $merhaba";
?>
Her ikisi de 'merhaba dünya' üretir.
Değişken değişkenleri dizilerle kullanmak için, bir anlam karmaşası sorununu çözümlemeniz gerekir. $$a[1] yazdığınızda değişken olarak $a[1]'i mi kastettiğiniz, yoksa $$a'nın değişken olmasını isteyip [1] ile o değişkenin indisini mi kastettiğinizi çözümleyicinin bilmesi gerekir. Bu anlam karmaşasını çözümleyen söz dizimi, birinci durum için ${$a[1]} ve ikinci için ${$a}[1]'dir.
Sınıf özelliklerine değişken özellik isimlerinden de erişilebilir. Değişken özellik ismi çağrının yapıldığı etki alanı içinde çözümlenir. Örneğin, $foo->$zam gibi bir değişkeniniz olsun; burada $zam'ın etki alanı incelenir ve $foo özelliğinin ismi olarak kullanılır. $zam, bir diziye erişim için kullanılıyorsa yine aynı durum geçerlidir.
Örnek 1 - Değişken işlevi örneği
<?php
class foo {
var $zam = 'Buna zam derler.';
}
$foo = new foo();
$zam = 'zam';
$maz = array('foo', 'zam', 'maz', 'para');
echo $foo->$zam . "\n";
echo $foo->$maz[1] . "\n";
?>
Yukarıdaki örneğin çıktısı:
Değişken değişkenlerin işlev ve sınıf yöntemleri içinde PHP'nin Süper küresel dizileri ile kullanılamayacağını unutmayınız. $this değişkeni de devingen olarak gönderimli olamayan özel bir değişkendir.
Bir PHP betiğine bir form gönderildiğinde o formdaki bilgi betik tarafından özdevinimli olarak kullanılır. Bu bilgiye erişmek için birçok yol vardır, örneğin:
Örnek 1 - Basit bir HTML formu
<form action="foo.php" method="post">
Name: <input type="text" name="kullanici_adi" /><br />
Email: <input type="text" name="eposta" /><br />
<input type="submit" name="submit" value="Beni gönder!" />
</form>
Kurulumunuza ve kişisel tercihlerinize bağlı olarak, HTML formlarınızdaki bilgiye erişimin birçok yolu vardır. Bazı örnekler:
Örnek 2 - Basit bir POST HTML formundan bilgiye erişim
<?php
// PHP 4.1.0'dan beri vardır
echo $_POST['kullanici_adi'];
echo $_REQUEST['kullanici_adi'];
import_request_variables('p', 'p_');
echo $p_kullanici_adi;
// PHP 6'dan beri yoktur. PHP 5.0.0'dan itibaren, bu uzun öntanımlı
// değişkenler register_long_arrays yönergesi ile etkisiz kılınabilir.
echo $HTTP_POST_VARS['kullanici_adi'];
// Eğer PHP yönergesi register_globals = on ise kullanılabilir.
// PHP 4.2.0'dan itibaren register_globals'ın öntanımlı değeri off'dur.
// Bu yöntemin kullanımı/güvenilmesi tercih edilmez.
echo $kullanici_adi;
?>
Bunun yerine önceden tanımlı uygun bir GET değişkeni kullanmak dışında, GET formunun kullanımı aynıdır. GET ayrıca QUERY_STRING (Bir URL'de '?' iminden sonraki bilgi) sorgu dizgesine de uygulanır. Bu bakımdan örneğin, http://mesela.dom/dnm.php?id=3 $_GET['id'] ile erişilebilen GET verisini içerir. Ayrıca, $_REQUEST değişkenine ve import_request_variables() işlevine de bakınız.
Bilginize: $_POST ve $_GET gibi Süper küresel diziler PHP 4.1.0'dan itibaren vardır.
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($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Adı: <input type="text" name="personal[isim]" /><br />
Eposta: <input type="text" name="personal[eposta]" /><br />
Bira: <br />
<select multiple name="bira[]">
<option value="efes">Efes</option>
<option value="tuborg">Tuborg</option>
<option value="venus">Venüs</option>
</select><br />
<input type="submit" value="Gönder!" />
</form>
Bir formu gönderirken, şöyle bir etiketle standart gönder düğmesi yerine resim kullanılabilir:
<input type="image" src="image.gif" name="sub" />
Kullanıcı resim üzerinde bir yere tıkladığında, eşlik eden form iki ek değişkenle sunucuya iletilmiş olur: sub_x ve sub_y. Bunlar kullanıcın resim üzerinde tıkladığı noktanın koordinatlarını içerir. Deneyimliler tarayıcı tarafından gönderilen asıl değişken isimlerinin alt çizgi yerine nokta içerdiğine dikkat etmiş olabilirler, fakat PHP noktaları özdevinimli olarak alt çizgiye çevirir.
Genellikle, PHP bir betiğe aktarılan değişken isimlerini değiştirmez. Fakat, nokta iminin PHP'de değişken isimlerinde geçerli bir karakter olmadığına dikkat edilmelidir. Örnek:
<?php
$varname.ext; /* geçersiz değişken ismi */
?>
Burada, yazım denetleyicinin gördüğü $varname isimli bir değişkeni takip eden bir dizge birleştirme işlemi ve çıplak bir (tırnaklarla çevrilmemiş, herhangi bir anahtar veya anahtar sözcük ile eşleşmeyen dizge) 'ext' metnidir. Açıkça görülüyor ki, bu istenen sonucu vermemektedir.
Bu nedenle, PHP'nin gelen değişken isimlerindeki nokta imlerini alt çizgi imi ile değiştirdiğini bilmekte yarar vardır.
Değişken türlerini PHP belirlediği ve (genellikle) gerektiği gibi değiştirdiği için, verilen bir değişkenin herhangi bir anda hangi türde olduğu sorgulanmadan bilinemez. PHP'de bir değişkenin hangi türde olduğunu bulan birçok işlev vardır. Örnek: gettype(), is_array(), is_float(), is_int(), is_object() ve is_string(). Ayrıca Türler bölümüne de bakınız.
Bir sabit basit bir değerin betimleyicisidir (ismidir). İsminden de anlaşılacağı gibi, betiğin çalışması sırasında bu değer değiştirilemez (aslında birer sabit olmayan sihirli sabitler hariç). Sabitler öntanımlı olarak büyük-küçük harf duyarlıdır. Geleneksel olarak, sabit isimleri daima büyük harfle yazılır.
Bir sabite verilen isim PHP'de varolan diğer tüm isimlerle aynı kurallara tabidir. Geçerli bir sabit ismi bir harfle ya da alt çizgi imi ile başlar, herhangi bir sayıda harf, rakam ya da alt çizgi ile devam eder. Bir sabit ismi düzenli ifade olarak, şu şekilde ifade edilebilir: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Ayrıca Kullanıcı Alanı İsimlendirme Kılavuzu belgesine de bakınız.
Örnek 1 - Geçerli ve geçersiz sabit isimleri
<?php
// Geçerli sabit isimleri
define("FOO", "bir şey");
define("FOO2", "başka bir şey");
define("FOO_BAR", "daha başka bir şey");
// Geçersiz sabit isimleri
define("2FOO", "bir şey");
// Bu geçerli olmasına rağmen kullanmaktan kaçınılmalıdır.
// PHP bir gün betiğinizin çalışmasını bozacak bir sihirli
// sabit kullanmaya karar verebilir.
define("__FOO__", "bir şey");
?>
Bilginize: Burada bir harften söz ettiğimiz zaman, ASCII a-Z veya A-Z arasındaki ki bir karakterden veya karakter kodu 127-255 (0x7f-0xff) arasındaki bir karakterden bahsetmiş oluyoruz.
Süper küresellerde olduğu gibi, sabitlerin etki alanı da betiklerin genelidir. "Etki alanı" hakkında daha ayrıntılı bilgi edinmek için Değişken Etki Alanı bölümünü okuyunuz.
Bir sabiti define() işlevini kullanarak veya PHP 5.3.0'dan itibaren sınf tanımlarının dışında const anahtar sözcüğünü kullanarak tanımlayabilirsiniz. Bir sabit tanımlandıktan sonra, asla değiştirilemez ya da tanımsız yapılamaz.
Bir sabit ismine yalnızca bir sayıl değer (boolean, integer, float veya string) atanabilir. Sabitleri resource olarak kayıt altına almak mümkündür, fakat umulmadık sonuçlara yol açabileceğinden bundan kaçınılmalıdır.
Bir sabitin değerini basitçe ismini belirterek alabilirsiniz. Değişkenlerin aksine, sabitlerin önüne $ imi eklemeniz gerekmez. Bunun yanında, bir sabitin ismini devingen şekilde elde etmek isterseniz, sabitin değerini okumak için constant() işlevini de kullanabilirsiniz. Tanımlanmış sabitlerin tamamının bir listesini almak için, get_defined_constants() işlevini kullanabilirsiniz.
Bilginize: Sabitlerin ve (genel) değişkenlerin isim alanları farklıdır. Bu, örneğin TRUE ile $TRUE değerlerinin farklı olabilecekleri anlamına gelir.
Tanımlanmamış bir sabit ismi kullanırsanız, PHP, bir sabit değil bir
sayıl değer kullanmak istediğinizi varsayar ve sabiti string
türünde bir değer (SABIT yerine "SABIT" ) olarak ele alır. Böyle bir
durumda E_NOTICE seviyesinde bir
hata çıktılanır. Ayrıca, $foo[bar] kullanımının (evvelce
define() işleviyle bar isminde bir
sabit tanımlamamışsanız) neden yanlış olduğuyla ilgili açıklamayı $foo[bar] neden
yanlıştır? başlığı altında bulabilirsiniz. Bir sabitin tanımlı
olup olmadığını defined() işlevi sayesinde kolayca
öğrenebilirsiniz.
Sabitler ve değişkenler arasındaki farklar:
Örnek 1 - Sabitlerin Tanımlanması
<?php
define("CONSTANT", "Merhaba dünya.");
echo CONSTANT; // "Merhaba dünya" çıktılar.
echo Constant; // "Constant" çıktılar ve bir bilgi iletisi gösterir.
?>
Örnek 2 - Sabitlerin const ile tanımlanması
<?php
// PHP 5.3.0 ve sonrasında çalışır
const CONSTANT = 'Merhaba Dünya';
echo CONSTANT;
?>
Ayrıca, Sınıf Sabitleri belgesine de bakınız.
PHP, çalışan her betiğin erişebileceği çok sayıda öntanımlı sabit'e sahiptir. Öte yandan, bu sabitlerin çoğu, çeşitli eklentiler tarafından tanımlandığından, sadece eklenti bir modül olarak veya PHP içinde derlenmişse kullanılabilir.
Değerleri kullanıldıkları yere göre değişen beş sihirli sabit vardır. Örneğin, __LINE__ sabitinin değeri betiğin hangi satırında kullanıldığına bağlıdır. Bu özel sabitler büyük-küçük harf farkına duyarsızdır ve aşağıda listelenmişlerdir:
| İsim | Açıklama |
|---|---|
| __LINE__ | Dosyada bu sabitin bulunduğu satırın numarası. |
| __FILE__ | Dosyanın tam dosya yolu ve dosya ismi. include() işlevi ile betiğe eklenen bir dosyanın içinde kullanıldığında betiğin ismini değil, eklenen dosyanın ismini içerir. PHP 4.0.2'den itibaren, __FILE__ değeri daima sembolik bağları çözümlenmiş olarak mutlak dosya yolunu içerirken, daha eski sürümler bazı durumlarda göreli dosya yolunu içerebilir. |
| __DIR__ | Dosyanın bulurduğu dizin. Dahil edilen bir dosyanın içinde kullanıldığında dahil edilen dosyanın dizini döner. Bu dirname(__FILE__) işlevine eşdeğerder. Bu dizin isminin sonuna bir kök dizin olmadıkça bir bölü imi konmaz. (PHP 5.3.0'da eklenmiştir.) |
| __FUNCTION__ | İşlev ismi. (PHP 4.3.0 ile eklenmiştir). PHP 5 itibariyle bu sabit, işlev ismini bildirimindeki haliyle (büyük-küçük harf duyarlı) içerir. PHP 4 sürümünde ise bu değer her zaman küçük harflerden oluşur. |
| __CLASS__ | Sınıf ismi. (PHP 4.3.0 ile eklenmiştir). PHP 5 itibariyle bu sabit, sınıf ismini bildirimindeki haliyle (büyük-küçük harf duyarlı) içerir. PHP 4 sürümünde ise bu değer her zaman küçük harflerden oluşur. |
| __METHOD__ | Yöntem ismi. (PHP 5.0.0 ile eklenmiştir). Bu sabit, yöntem ismini daima bildirimindeki haliyle (büyük-küçük harf duyarlı) içerir. |
| __NAMESPACE__ | Geçerli isim alanının adı (harf büyüklüğüne duyarlı). Bu sabit derleme anında tanımlanır (PHP 5.3.0'da eklenmiştir). |
Ayrıca bakınız: get_class(), get_object_vars(), file_exists() ve function_exists().
İfadeler, PHP'nin en önemli yapı taşlarındandır. PHP'de, hemen hemen yazdığınız her şey bir ifadedir. Bir ifadenin en basit ama en etkili tanımı şudur: "Bir değere sahip olan herşey".
İfadelerin en basit şekli sabitler ve değişkenlerdir. "$a = 5" yazdığınızda, '5' değerini $a değişkenine atamış olursunuz. '5', açık bir şekilde, 5 değerine sahiptir, ya da başka bir deyişle '5', değeri 5 olan bir ifadedir (bu durumda, '5' bir tamsayı sabittir).
Bu atamadan sonra, $a'nın değerinin 5 olmasını beklersiniz, dolayısıyla $b = $a yazdığınızda, bunun $b = 5 yazmışsınız gibi davranmasını beklersiniz. Başka bir deyişle, $a da değeri 5 olan ifadedir. Her şey doğru çalışırsa, olması gereken de tam budur.
İşlevler, ifadelerin biraz daha karmaşık örnekleridir. Örneğin, aşağıdaki işleve bakalım:
<?php
function foo ()
{
return 5;
}
?>
İşlev kavramına aşina iseniz (değilseniz, işlevler bölümünü inceleyebilirsiniz), şu örnekten hareketle $c = foo() yazmak ile $c = 5 yazmak arasında bir fark olmadığını bilirsiniz. İşlevler, değeri dönüş değeri olan ifadelerdir. foo() işlevi 5 değerini döndürdüğünden, "foo()" ifadesinin değeri 5'tir. İşlevlerin amacı normalde duruk bir değer döndürmek değildir, bir hesaplamanın sonucunu döndürürler.
Elbette, PHP'deki değerlerin hep tamsayılar olması gerekmez, zaten çoğunlukla değildirler. PHP dört çeşit sayıl değer destekler: Tamsayı (integer) değerler, kayan noktalı (float) değerler, dizge (string) değerler ve mantıksal boolean değerler (sayıl değerler, dizilerin aksine daha küçük parçalara bölemeyeceğiniz değerlerdir). PHP ayrıca iki bileşik (sayıl olmayan) tür destekler: Diziler ve nesneler. Bu değer türlerinden her biri bir değişkene atanabilir ya da bir işlevden döndürülebilir.
PHP, birçok başka dilin yaptığı gibi ifadeleri çok ileriye götürmüştür. PHP ifade-yönelimli bir dildir, bunun sebebi hemen hemen her şeyin bir ifade olmasıdır. Az önce üzerinde çalıştığımız '$a = 5' örneğini ele alalım. Burada iki değer kullanımı sözkonusudur, bir tamsayı sabit olan '5' ve 5 olarak değiştirilmiş $a'nın değeri. Ancak gerçek şu ki, burada bu ikiliye ek olarak başka bir değer daha vardır, o da atamanın kendi değeridir. Atamanın kendisi atanan değerle değerlendirilir, bu örnekte bu 5'tir. Uygulamada, ne yaptığından bağımsız olarak "$a = 5", değeri 5 olan bir ifadedir. Böylece, "$b = ($a = 5)" yazmak, "$a = 5; $b = 5;" yazmak gibidir (noktalı virgül deyimin sonlandırıldığını gösterir). Atamalar sağdan sola doğru işlendiğinden, "$b = $a = 5" de yazabilirsiniz.
İfade yönelimi ile ilgili diğer güzel bir örnek atama öncesi ve sonrası arttırma ve eksiltme işlemleridir. PHP ve diğer birçok dilin kullanıcıları, değişken++ ve değişken-- gösterimine az çok aşinadır. Bunlar arttırma ve eksiltme işleçleridir. PHP/FI 2'de, $a++ deyiminin bir değeri yoktur (bir ifade değildir), bu yüzden onu atayamaz ya da herhangi bir yerde kullanamazsınız. PHP, arttırma/eksiltme ifadelerinin yeteneklerini, bu ifadeleri C dilindekine benzer şekilde iyileştirerek genişletmiştir. PHP'de, C'de olduğu gibi önceden arttırma ve sonradan arttırma diye iki tür arttırma vardır. Bunların her ikisi de değişkenin değerini bir arttırır ve değişken üzerindeki etkileri aynıdır. Fark, arttırma ifadesinin değerindedir. Önceden arttırma, ++$değişken olarak yazılır ve arttırılmış değer öncelik alır (PHP değişkenin değerini önce arttırır, sonra okur, bu sebeple önceden arttırma ismi verilmiştir). Sonradan arttırma ise, $değişken++ olarak yazılır ve değer arttırılmadan önceki özgün değer önceliklidir (PHP değişkenin değerini okuduktan sonra değerini arttırır, bu sebeple sonradan arttırma ismi verilmiştir).
Çok geniş bir kullanıma sahip olan ifade türlerinden birisi de karşılaştırma ifadeleridir. Bu ifadeler FALSE ya da TRUE değerlerinden birini alırlar. PHP > (büyüktür), >= (büyüktür ya da eşittir), == (eşittir), != (eşit değildir), < (küçüktür) ve <= (küçüktür ya da eşittir) gösterimlerini destekler. Dil aynı zamanda aynılık işleçlerini de destekler: === (eşit ve aynı türdedir) ve !== (ne eşit ne de aynı türdedir). Bu ifadeler çoğunlukla if deyimleri gibi koşula bağlı işlemlerde kullanılmaktadırlar.
Vereceğimiz son ifade örneği işleçli atama ifadeleridir. $a'nın değerini 1 arttırmak istediğinizde, basitçe '$a++' ya da '++$a' yazmanızın yeterli olduğunu zaten biliyorsunuz. Ama ya birden daha büyük bir değer, örneğin 3 eklemek isterseniz? '$a++' ifadesini birkaç kez yazabilirsiniz, ama bunun pek verimli ya da kullanışlı yöntem olmadığı oldukça açık. '$a = $a + 3' çok daha yaygın bir kullanımdır. '$a + 3' ifadesi $a'nın değerini önce 3 arttırır sonra sonucu $a'ya atar, böylece $a'nın değeri 3 arttırılmış olur. PHP'de, birkaç dilde olduğu gibi C benzeri, daha temiz gözükecek ve daha kısa biçimde yazabileceğiniz bir gösterim daha vardır. $a'nın mevcut değerine 3 ekleme işlemi '$a += 3' biçiminde yazılabilir. Bunun anlamı tam olarak "$a'nın değerini al, 3 ekle ve yeni değeri $a'ya ata" olacaktır. Daha kısa ve temiz olmasının yanında, bu kod daha hızlı çalıştırılacaktır. '$a += 3' işleminin değeri, normal bir atama işleminde olduğu gibi, atanan değerdir. Bu değerin 3 OLMADIĞINA dikkat edin, bu değer $a ile 3'ün toplamıdır ($a’ya bu değer atanır). İşleçli atama kipinde herhangi bir iki terimli işleç kullanılabilir, örneğin '$a -= 5' ($a'nın değerinden 5 çıkarılır), '$b *= 7' ($b'nin değeri 7 ile çarpılır), vs.
Diğer dillerde görmediyseniz size farklı gözükebilecek bir ifade daha vardır, o da üç terimli koşul işlecidir:
<?php
$birinci ? $ikinci : $üçüncü
?>
İlk alt ifadenin değeri TRUE (sıfırdan farklı) ise, ikinci alt ifade değerlendirilir ve koşullu ifadenin sonucu bu olur. Aksi takdirde, üçüncü alt ifade değerlendirilir ve koşullu ifadenin sonucu bu olur.
Aşağıdaki örnek, önceden ve sonradan arttırma işleçlerini ve ifadelerini genelde biraz daha iyi anlamanıza yardımcı olacaktır:
<?php
function double($i)
{
return $i*2;
}
$b = $a = 5; /* beş değerini $a ve $b değişkenlerine atar */
$c = $a++; /* sonradan arttırma, $a'nın özgün değerini (5) $c'ye atar */
$e = $d = ++$b; /* önceden arttırma, $b'nin arttırılmış değerini (6) $d
ve $e'ye atar */
/* bu noktada, $d ve $e 6'ya eşittir */
$f = double($d++); /* $d'nin değerini arttırmadan önce $d'nin değerinin iki
katını $f'ye atar, 2*6 = 12 */
$g = double(++$e); /* $e'nin değerini arttırdıktan sonra iki katını alıp
$g'ye atar, 2*7 = 14 */
$h = $g += 10; /* önce, $g 10 arttırılır ve değeri 24 olur. Sonra bu
değer (24) $h'ye atanır ve onun da değeri 24 olur. */
?>
Bazı ifadeler deyim olarak ele alınabilir. Bu durumda, deyim 'ifade' ';' şeklinde, noktalı virgülle sonlandırılmış bir ifade şeklinde olacaktır. '$=$a=5;' olduğunda, $a=5 geçerli bir ifadedir, ancak kendi başına bir deyim değildir. '$b=$a=5;' ise geçerli bir deyimdir.
Son olarak bahsetmemiz gereken bir konu da ifadelerin gerçek değeridir. Birçok olayda, çoğunlukla da koşula bağlı çalışmalarda ve döngülerde, ifadenin kendi değeri ile değil, TRUE ya da FALSE olması ile ilgileniyor olacaksınız. TRUE ve FALSE sabitleri (büyük-küçük harf duyarsız) olası iki mantıksal değerdir. Gerektiğinde, bir ifade özdevinimli olarak mantıksal değere dönüştürülür. Tür çarpıtma bölümünde bunun nasıl gerçekleştiği ayrıntılı olarak anlatılmıştır.
PHP ifadeleri tümüyle ve çok güçlü bir biçimde uygulamaya geçirmiştir ve bunların tamamını belgelemek bu kılavuzun kapsamının dışında kalır. Yukarıdaki örnekler hangi ifadelerle nasıl kullanışlı ifadeler oluşturabileceğiniz hakkında yeterli fikir verecektir. Bu kılavuzun geri kalanında, geçerli herhangi bir PHP ifadesini belirtmek için ifade sözcüğünü kullanacağız.
Bir işleç, başka bir değer üretmek üzere bir veya daha fazla değerle (programcı dilinde ifadeyle) beslenen bir şeydir (yani, değerler işleçle birlikte bir ifade haline gelir). Bu bakımdan, bir değer döndüren işlevler ve benzeri oluşumlar (print gibi) ya da belirtilenden başka bir şey döndürmeyen (echo gibi) oluşumlar birer işleç olarak düşünülebilir.
Üç tür işleç vardır. İlki tek bir değerle çalışan tek terimli işleç olup ! (olumsuzlama işleci) veya ++ (arttırım işleci) buna birer örnektir. İkinci işleç grubu iki terimlilerdir; PHP'nin desteklediği işleçlerin çoğunluğu bu grupta olup aşağıda İşleç Önceliği bölümünde liste halinde verilmişlerdir.
Üçüncü grupta üç terimli işleç yer alır: ?:. Bir ifadeye bağlı olarak iki deyim veya çalıştırma yolunu seçmekten ziyade diğer iki ifadeden birini seçmek için kullanılır. İşlecin üç ifadesini parantez içinde belirtmek iyi bir uygulamadır.
İşleç önceliği iki ifadenin birbirine hangi sıkılıkta bağlı olduğunu belirtir. Örneğin, 1 + 5 * 3 ifadesinin sonucu 18 değil, 16'dır. Çünkü, çarpma ("*") işlecinin önceliği toplama ("+") işlecinden yüksektir. Önceliği arttırmak için gerekirse parantezler kullanılabilir. Örneğin, (1 + 5) * 3 ifadesinin sonucu 18 olacaktır. Eğer işleç önceliklerinde eşitlik sözkonusu olursa soldaki işleç sağdakinden öncelikli olur.
Aşağıdaki listede işleçler en yüksek öncelikliden başlayıp en düşük öncelikliye doğru sıralanmışlardır. Aynı satırda yer alan işleçler eşöncelikli olup hangi sırada ele alınacaklarına değerlendirme sırasında karar verilir.
| İlişkilendirme | İşleçler | Ek bilgi |
|---|---|---|
| yönsüz | clone new
|
clone ve new |
| soldan | [
|
array() |
| yönsüz | ++ --
|
arttırım/eksiltim |
| 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 = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>
Parantezleri kodun okunabilirliğini arttırmak için kullanın.
Bilginize: Eşitlik (=) işleci çoğu işleçten daha düşük önceliğe sahip olduğundan PHP halen şuna benzer ifadelere izin vermektedir: foo() işlevinin dönüş değerini $a değişkenine atayan if (!$a = foo()) ifadesi.
Okulda öğrendiğiniz temel aritmetiği hatırlıyor musunuz? Bu işleçler tam da öyle çalışır.
| Örnek | İsim | Sonuç |
|---|---|---|
-$a
|
Olumsuzlama | $a'nın eksi işaretlisi. |
$a + $b
|
Toplama | $a ile $b'nin toplamı. |
$a - $b
|
Çıkarma | $a'nın $b'den farkı. |
$a * $b
|
Çarpma | $a ile $b'nin çarpımı. |
$a / $b
|
Bölme | $a'nın $b'ye bölümü. |
$a % $b
|
Kalan | $a'nın $b'ye bölümünden kalan. |
Bölme işlecinin tamsayı bölüm vermesi için iki teriminin de tamsayı (veya dönüşüm sonucu tamsayı olan dizge) olması ve birbirlerine tam olarak bölünmesi gerekir, aksi takdirde bölüm gerçek sayı olacaktır.
Kalan işlecinin (%) terimleri gerçek sayılarsa ondalık kısımları atılarak tamsayıya dönüştürülürler.
Bilginize: $a % $b işleminin sonucu, $a negatifse negatif olacaktır.
Matematik işlevleri bölümüne de bakınız.
Temel atama işleci "=" imidir. Programlamaya yeni başlayanlar bu işleci"eşittir" diye okurlar. Aslında yapılan işlem bir şeyleri birbirlerine eşitlemek değildir. Yaptığı iş sağındaki ifadenin değerini solundaki terimin değeri haline getirmektir, yani imleci içeren ifadeyi birşey'in değeri diye okumak daha doğrudur.
Bir atama ifadesinin değeri atanan değerdir. Yani, "$a = 3" ifadesinin değeri 3'tür. Bunun bir takım yan sonuçları da vardır:
<?php
$a = ($b = 4) + 5; // $a'nın değeri 9, $b'nin değeri 4 olur.
?>
Temel atama işlecinden başka atama işlemini temel aritmetik, ikil aritmetik işlemleriyle veya dizi ya da dizge birleştirme işlemleriyle birleştiren, "birleşik atama işleçleri" vardır. Örnek:
<?php
$a = 3;
$a += 5; // $a'nın değeri 8 olur, asıl işlem: $a = $a + 5;
$b = "Herkese ";
$b .= "Merhaba!"; // $b'nin değeri "Herkese Merhaba!" olur.
// asıl işlem: $b = $b . "Merhaba!";
?>
Atama işleminin özgün değişkeni yeni değişkene kopyaladığına (değeriyle atadığına) dikkat ediniz. Dolayısıyla birinde yapılan değişiklik diğerini etkilemeyecektir. Kapalı bir döngü içinde büyükçe bir diziye atama işlemleri yapma ihtiyacı duyarsanız bu ayrı bir anlam kazanır. Gönderimli atama $değişken = &$diğerdeğişken; sözdizimi ile desteklenmektedir. 'Gönderimli atama' denince, iki değişkenin aynı veriyi gösterdiğini ve birbirlerinden birşeyler kopyalamadıklarını anlıyoruz. Gönderimler hakkında daha ayrıntılı bilgi edinmek için Gönderimlerle ilgili herşey bölümüne bakınız. PHP 5'ten itibaren, clone anahtar sözcüğü ile yeni bir nesneye atama yapılmadıkça, nesneler gönderimli olarak atanırlar.
Bitsel işleçler, bir tamsayının içindeki belli bitleri 0 ya da 1 yaparlar.
| Örnek | İsim | Sonuç |
|---|---|---|
$a & $b
|
Ve | Hem $a hem de $b'de 1 olan bitler sonuçta 1 yapılır. |
$a | $b
|
Veya | $a veya $b'de 1 olan bitler sonuçta 1 yapılır. |
$a ^ $b
|
Ayrıcalıklı Veya | Hem $a hem de $b'de 0 veya 1 olan bitler sonuçta 0, diğerleri 1 yapılır. |
~ $a
|
Değil | $a'nın 0 olan bitleri 1, 1 olanları 0 yapılır. |
$a << $b
|
Sola kaydırma | $a'nın bitleri $b adım sola kaydırılır (her adım ikiyle çarpma işlemine denktir). |
$a >> $b
|
Sağa kaydırma | $a'nın bitleri $b adım sağa kaydırılır (her adım ikiye bölme işlemine denktir). |
PHP'de bit kaydırma bir aritmetik işlemdir. Kaydırma sonucu her iki uçtan da taşan bitler silinir. Sola kaydırmada sağdan eksilen bitler sıfırlarla doldurulur, bu arada işaret biti soldan taşarak silinir, yani sola kaydırmada terimin işareti korunmaz. Sağa kaldırmada ise işaret biti yerinden oynatılmaz, yani sağa kaydırmada terimin işareti korunur.
Bir işlemin öncelik almasını istiyorsanız yaylı ayraçları kullanın. Örneğin, $a & $b == true işleminde önce eşitlik sonra bitsel VE uygulanırken ($a & $b) == true işleminde ise önce bitsel VE sonra eşitlik uygulanır.
Veri türü dönüşümlerinde dikkatli olun. Eğer sol ve sağ taraf değiştirgelerinin ikisi de dizge ise bitsel işleçler terimlerdeki karakterlerin ASCII değerleri üzerinde işlem yapacaktır.
PHP'nin error_reporting yönergesi gerçekte neler olup bittiğini göstermek
için bitsel değerler kullanır. Sadece bilgilendirmeleri değil hataların
tümünü görmek isterseniz php.ini dosyasında ilgili yere şunu yazın:
E_ALL & ~E_NOTICE
Bu E_ALL için şöyle çalışır:00000000000000000111011111111111Keza E_NOTICE...00000000000000000000000000001000... ve ~ ile ters çevrilerek:11111111111111111111111111110111Son olarak, her iki değer üzerinde etkin bitleri bulmak için VE (&) işlecini kullanır:00000000000000000111011111110111
Bunu sağlamanın bir başka yolu da sadece bir değerde veya diğerinde etkin
bitleri bulmak için XOR (^) kullanmaktır:
E_ALL ^ E_NOTICE
error_reporting yönergesi bitleri etkin kılmayı göstermek için de
kullanılabilir. Sadece hataları ve kurtarılabilir göstermenin yolu:
E_ERROR | E_RECOVERABLE_ERROR
Bu işlem etkin bitleri almak için00000000000000000000000000000001ve00000000000000000001000000000000E_ERROR'ları üzerinde VEYA (|) işlecini kullanır:00000000000000000001000000000001
Örnek 1 - Tamsayılar üzerinde bitsel işlemler
<?php
/*
* Üstteki bölümü yoksayın,
* çıktıyı iyileştirmek için biçemlemekten başka birşey yapmıyor.
*/
$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";
echo <<<EOH
--------- --------- -- ---------
sonuç değer işl dnm
--------- --------- -- ---------
EOH;
/*
* Örnekler burada.
*/
$değerler = array(0, 1, 2, 4, 8);
$dnm = 1 + 4;
echo "\n Bitsel VE \n";
foreach ($değerler as $değer) {
$sonuç = $değer & $dnm;
printf($format, $sonuç, $değer, '&', $dnm);
}
echo "\n Bitsel Ayrıcalıklı VEYA \n";
foreach ($değerler as $değer) {
$sonuç = $değer | $dnm;
printf($format, $sonuç, $değer, '|', $dnm);
}
echo "\n Bitsel Ayrıcalıklı VEYA (XOR) \n";
foreach ($değerler as $değer) {
$sonuç = $değer ^ $dnm;
printf($format, $sonuç, $değer, '^', $dnm);
}
?>
Yukarıdaki örneğin çıktısı:
--------- --------- -- --------- sonuç değer işl dnm --------- --------- -- --------- Bitsel VE ( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) Bitsel Ayrıcalıklı VEYA ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitsel Ayrıcalıklı VEYA (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
Örnek 2 - Dizgeler üzerinde bitsel işlemler
<?php
echo 12 ^ 9; // '5' çıktılar
echo "12" ^ "9"; // Gerisilme karakterini çıktılar (ASCII 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = ASCII 8
echo "hallo" ^ "hello"; // Çıktılanan ASCII değerler #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
echo 2 ^ "3"; // 1 çıktılar
// 2 ^ ((int)"3") == 1
echo "2" ^ 3; // 1 çıktılar
// ((int)"2") ^ 3 == 1
?>
Örnek 3 - Tamsayılarda bit kaydırma
<?php
/*
* Bunlar örnektir.
*/
echo "\n--- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA ---\n";
$dgr = 4;
$hane = 1;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'işaret bitinin kopyası sola kaydırıldı');
$dgr = 4;
$hane = 2;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane);
$dgr = 4;
$hane = 3;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'bitler sağa kaydırıldı');
$dgr = 4;
$hane = 4;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'yukarıdakiyle aynı; 0\'dan sonrası kaydırılamaz');
echo "\n--- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA ---\n";
$dgr = -4;
$hane = 1;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'işaret bitinin kopyası sola kaydırıldı');
$dgr = -4;
$hane = 2;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'bitler sağa kaydırıldı');
$dgr = -4;
$hane = 3;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'yukarıdakiyle aynı; -1\'dan sonrası kaydırılamaz');
echo "\n--- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA ---\n";
$dgr = 4;
$hane = 1;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'sağ taraf sıfırlarla doldurulur');
$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 4;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane);
$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 3;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'işaret bitleri dışa kaydırılır');
$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 2;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'bitler sola kaydırıldı');
echo "\n--- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA ---\n";
$dgr = -4;
$hane = 1;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'sağ taraf sıfırlarla doldurulur');
$dgr = -4;
$hane = (PHP_INT_SIZE * 8) - 3;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane);
$dgr = -4;
$hane = (PHP_INT_SIZE * 8) - 2;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'işaret biti dahil, bitler soldan dışa kaydırıldı');
/*
* Bundan sonrasını yoksayın; çıktıyı biçemlemekten başka bir şey yapmıyor.
*/
function p($snç, $dgr, $op, $hane, $ilt = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";
printf("İfade: %d = %d %s %d\n", $snç, $dgr, $op, $hane);
echo " Onluk:\n";
printf(" değer=%d\n", $dgr);
printf(" sonuç=%d\n", $snç);
echo " İkilik:\n";
printf(' değer=' . $format, $dgr);
printf(' sonuç=' . $format, $snç);
if ($ilt) {
echo " DİKKAT: $ilt\n";
}
echo "\n";
}
?>
Yukarıdaki örneğin 32 bitlik makinelerdeki çıktısı:
--- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: 2 = 4 >> 1 Onluk: değer=4 sonuç=2 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000010 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: 1 = 4 >> 2 Onluk: değer=4 sonuç=1 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000001 İfade: 0 = 4 >> 3 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: bitler sağa kaydırıldı İfade: 0 = 4 >> 4 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: yukarıdakiyle aynı; 0'dan sonrası kaydırılamaz --- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: -2 = -4 >> 1 Onluk: değer=-4 sonuç=-2 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111110 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: -1 = -4 >> 2 Onluk: değer=-4 sonuç=-1 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111111 DİKKAT: bitler sağa kaydırıldı İfade: -1 = -4 >> 3 Onluk: değer=-4 sonuç=-1 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111111 DİKKAT: yukarıdakiyle aynı; -1'dan sonrası kaydırılamaz --- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: 8 = 4 << 1 Onluk: değer=4 sonuç=8 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000001000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: 4611686018427387904 = 4 << 60 Onluk: değer=4 sonuç=4611686018427387904 İkilik: değer=000000000000000000000000000100 sonuç=010000000000000000000000000000 İfade: -9223372036854775808 = 4 << 61 Onluk: değer=4 sonuç=-9223372036854775808 İkilik: değer=000000000000000000000000000100 sonuç=100000000000000000000000000000 DİKKAT: işaret bitleri dışa kaydırılır İfade: 0 = 4 << 62 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: bitler sola kaydırıldı --- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: -8 = -4 << 1 Onluk: değer=-4 sonuç=-8 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: -9223372036854775808 = -4 << 61 Onluk: değer=-4 sonuç=-9223372036854775808 İkilik: değer=111111111111111111111111111100 sonuç=100000000000000000000000000000 İfade: 0 = -4 << 62 Onluk: değer=-4 sonuç=0 İkilik: değer=111111111111111111111111111100 sonuç=000000000000000000000000000000 DİKKAT: işaret biti dahil, bitler soldan dışa kaydırıldı
Yukarıdaki örneğin 64 bitlik makinelerdeki çıktısı:
--- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: 2 = 4 >> 1 Onluk: değer=4 sonuç=2 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000010 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: 1 = 4 >> 2 Onluk: değer=4 sonuç=1 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000001 İfade: 0 = 4 >> 3 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: bitler sağa kaydırıldı İfade: 0 = 4 >> 4 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: yukarıdakiyle aynı; 0'dan sonrası kaydırılamaz --- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: -2 = -4 >> 1 Onluk: değer=-4 sonuç=-2 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111110 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: -1 = -4 >> 2 Onluk: değer=-4 sonuç=-1 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111111 DİKKAT: bitler sağa kaydırıldı İfade: -1 = -4 >> 3 Onluk: değer=-4 sonuç=-1 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111111 DİKKAT: yukarıdakiyle aynı; -1'dan sonrası kaydırılamaz --- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: 8 = 4 << 1 Onluk: değer=4 sonuç=8 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000001000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: 4611686018427387904 = 4 << 60 Onluk: değer=4 sonuç=4611686018427387904 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0100000000000000000000000000000000000000000000000000000000000000 İfade: -9223372036854775808 = 4 << 61 Onluk: değer=4 sonuç=-9223372036854775808 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=1000000000000000000000000000000000000000000000000000000000000000 DİKKAT: işaret bitleri dışa kaydırılır İfade: 0 = 4 << 62 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: bitler sola kaydırıldı --- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: -8 = -4 << 1 Onluk: değer=-4 sonuç=-8 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: -9223372036854775808 = -4 << 61 Onluk: değer=-4 sonuç=-9223372036854775808 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1000000000000000000000000000000000000000000000000000000000000000 İfade: 0 = -4 << 62 Onluk: değer=-4 sonuç=0 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: işaret biti dahil, bitler soldan dışa kaydırıldı
32 bitlik sistemlerde 32 bitten fazla sağa kaydırma yapmayın. 32 bitten daha geniş bir sayıyla sonuçlanacak şekilde sola kaydırma yapmayın. PHP_INT_MAX'tan büyük sayılar üzerinde bitsel işlemler yapacaksanız gmp eklentisindeki işlevleri kullanın.
Ayrıca bakınız: pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp_clrbit()
Karşılaştırma işleçleri isminden de anlaşılacağı üzere iki değerin karşılaştırılmasını sağlarlar. Çeşitli veri türleri arasındaki karşılaştırma örneklerinin yer aldığı tür karşılaştırma tabloları ilginizi çekebilir.
| Örnek | İsim | Sonuç |
|---|---|---|
$a == $b
|
Eşittir | $a ve $b aynı değere sahipse sonuç TRUE olur. |
$a === $b
|
Aynıdır | $a ve $b aynı değere sahipse ve türleri de aynıysa sonuç TRUE olur. (PHP 4'ten beri vardır.) |
$a != $b
|
Eşit değildir | $a ve $b aynı değere sahip değilse sonuç TRUE olur. |
$a <> $b
|
Eşit değildir | $a ve $b aynı değere sahip değilse sonuç TRUE olur. |
$a !== $b
|
Farklıdır | $a ve $b aynı değere sahip değilse veya türleri aynı değilse sonuç TRUE olur. (PHP 4'ten beri vardır.) |
$a < $b
|
Küçüktür | $a kesin olarak $b'den küçükse sonuç TRUE olur. |
$a > $b
|
Büyüktür | $a kesin olarak $b'den büyükse sonuç TRUE olur. |
$a <= $b
|
Küçük veya eşittir | $a, $b'den küçük veya ona eşitse sonuç TRUE olur. |
$a >= $b
|
Büyük veya eşittir | $a, $b'den büyük veya ona eşitse sonuç TRUE olur. |
Bir tamsayıyı bir dizge ile karşılaştırmak isterseniz dizge önce bir sayıya dönüştürülür. İki sayısal dizge tamsayı karşılaştırması olarak ele alınır. Bu kurallar ayrıca switch deyimine de uygulanır.
<?php
var_dump(0 == "a"); // 0 == 0 -> doğru
var_dump("1" == "01"); // 1 == 1 -> doğru
var_dump("1" == "1e0"); // 1 == 1 -> doğru
switch ("a") {
case 0:
echo "0";
break;
case "a": // burası hiç işlem görmez, çünkü "a" daima 0 ile eşleşir
echo "a";
break;
}
?>
Çeşitli türler arasında karşılaştırma aşağıdaki tabloya ve tablodaki sıralamaya uygun olarak yapılır.
| 1. Terimin Türü | 2. Terimin Türü | Sonuç |
|---|---|---|
| null veya string | string | NULL, "" dizgesine dönüştürülür, sayısal veya alfabetik karşılaştırma yapılır. |
| bool veya null | herhangi bir tür | bool türüne dönüşümden sonra FALSE < TRUE karşılaştırması yapılır |
| object | object | Yerleşik sınıflar kendi karşılaştırmalarını tanımlayabilir. Farklı sınıflar karşılaştırılamazlar. Aynı sınıfın özellikleri dizilerdeki gibi (PHP 4) karşılaştırırılır. PHP 5'in uygulaması farklıdır. |
| string, resource veya number | string, resource veya number | Diziler ve özkaynaklar sayılara dönüştürülür, sayısal karşılaştırma yapılır. |
| array | array | Daha az üyeye sahip dizi diğerinden küçüktür. Eğer 1. terimin anahtarı 2. terimde yoksa diziler karşılaştırılamaz. Karşılaştırma daima değerler karşılaştırılarak yapılır (aşağıdaki örneğe bakınız). |
| array | herhangi bir tür | array daima büyüktür. |
| object | herhangi bir tür | object daima büyüktür |
Örnek 1 - Özetle Standard Dizi Karşılaştırması
<?php
// Diziler bunun gibi standart karşılaştırma işleçleri ile karşılaştırılır
function standard_dizi_karşılaştır($trm1, $trm2)
{
if (count($ter1) < count($ter2)) {
return -1; // $ter1 < $ter2
} elseif (count($op1) > count($op2)) {
return 1; // $ter1 > $ter2
}
foreach ($ter1 as $anh => $değ) {
if (!array_key_exists($anh, $ter2)) {
return null; // karşılaştırılamaz
} elseif ($değ < $ter2[$anh]) {
return -1;
} elseif ($değ > $ter2[$anh]) {
return 1;
}
}
return 0; // $ter1 == $ter2
}
?>
Ayrıca, strcasecmp(), strcmp() işlevlerine, Dizi işleçlerine ve Türler bölümüne de bakınız.
Diğer bir karşılaştırma işleci ?: (üç terimli) işlecidir.
Örnek 2 - Öntanımlı bir değer atama
<?php
// Üç terimli işleç için kullanım örneği
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Yukarıdaki kod ile buradaki if/else deyimi aynı işlemi yapar.
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
(ifade1) ? (ifade2) : (ifade3) ifadesinin sonucu, ifade1 doğruysa ifade2 değilse ifade3'dir.
PHP 5.3'ten itibaren üç terimli işlecin orta parçasını dışarda bırakmak mümkündür. ifade1 ?: ifade3 ifadesinin sonucu ifade1 TRUE ise ifade1 ile değilse ifade3'tür.
Bilginize: Üç terimli işleç aslında bir deyimdir, dolayısıyla sonucu bir değişkene atanamaz. Bir değişkeni gönderimli döndürmek istediğiniz takdirde bu önem kazanır. Gönderimli olarak değer döndüren bir işlevde return $var == 42 ? $a : $b; deyimi bu bakımdan çalışmaz ve güncel PHP sürümlerinde bir uyarı gösterilir.
Bilginize: Üç terimli işleçleri iç içe kullanmanız önerilmez. PHP'nin böyle bir işlemin tek bir deyimde yapılmak istenmesi durumundaki davranışı beklendiği gibi olmayabilir.
Örnek 3 - İç içe üç terimli davranışı
<?php
// ilk bakışta aşağıdaki deyimin sonucu 'true' olacak sanılır.
echo (true?'true':false?'t':'f');
// ancak gerçekte çıktı 't' olur.
// Çünkü üç terimli ifade soldan sağa değerlendirilir.
// Aynı deyimi şöyle yazarsanız, durum anlaşılır hale gelir
echo ((true ? 'true' : false) ? 't' : 'f');
// Burada, ilk ifade mantıksal olarak doğru olduğundan sonuç 'true'
// olacak, böylece ikinci üç terimlinin ilk terimi 'true' olacak ve
// ikinci üç terimliden 't' dönecektir.
?>
PHP tek bir hata denetim işlecini destekler: kuyruklu a imi (@). PHP'de bir deyimin başına getirildiğinde, bu deyimin üreteceği olası hata iletileri yok sayılır.
Eğer track_errors özelliği etkinse bu deyimin ürettiği hata iletileri $php_errormsg değişkenine kaydedilir. Her hata oluşunda yeni hata eskisinin yerini alacağından bu değişkene yeterli sıklıkta bakmanız gerekir.
<?php
/* Kasıtlı dosya hatası */
$dosyam = @file ('var_olmayan_dosya') or
die ("Dosya açılamadı: hata '$php_errormsg' değişkeninde kayıtlı");
// İfadelerle çalışır ama işlevlerle çalışmaz:
$değer = @$cache[$key];
// $key indisi mevcut değilse bir uyarı çıktılanır.
?>
Bilginize: Kuyruklu a işleci sadece ifadelerin başında kullanıldığında çalışır. Kısaca: Bir değer elde edebildiğiniz herşeyin başına @ getirebilirsiniz. Örneğin, değişkenlerin işlev veya include() çağrılarının, sabitlerin ve benzerlerinin başına @ getirebilirsiniz. Ama işlev veya sınıf tanımlarının veya if ve foreach gibi denetim yapılarının başına @ koyamazsınız.
Ayrıca, error_reporting() işlevine ve Hata İşleme ve Günce Kayıt İşlevleri bölümüne bakınız.
Şu an @ hata denetim işleci, betiğin çalışmasını sonlandıracak önemli hataların raporlanmasını bile iptal edebilmektedir. Bu bakımdan, işleci örneğin bir işlevden kaynaklanabilecek hataları bastırmak için kullanıyorsanız, işlev tanımında yaptığınız yazım hataları veya işlevin yokluğu halinde ne olup bittiğini anlamadan betiğiniz sonlanıverebilir.
PHP tek bir çalıştırma işlecini destekmektedir: ters tırnak imleri (``). Bunların bildiğiniz tek tırnaklar olmadığına dikkat edin! Ters tırnak imlerinin arasına yazılmış komutları PHP komut satırında çalıştıracak ve çıktısını döndürecektir. Yani, komut satırına birşey çıktılanmaz; ama sonucu bir değişkene atayabilirsiniz. Çalıştırma işleci shell_exec() işlevinin yaptığı işi yapar.
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
Bilginize:
safe_modeetkinse veya shell_exec() işlevi etkin değilse, çalıştırma işleci etkin değildir.
Ayrıca, Program Çalıştırma İşlevleri, popen(), proc_open() işlevleri ve PHP'nin komut satırından kullanılması bölümüne de bakınız.
PHP, C tarzı önceden ve sonradan arttırım ve eksiltim işleçlerini destekler.
Bilginize: Arttırım ve eksiltim işleçleri mantıksal değerler üzerinde etkisizdir. NULL değerini eksiltmenin bir etkisi yoktur fakat arttırmanın sonucu 1'dir.
| Örnek | İsim | Etkisi |
|---|---|---|
++$a
|
Önceden arttırım | $a bir arttırıldıktan sonra döndürülür. |
$a++
|
Sonradan arttırım | $a döndürüldükten sonra değeri bir arttırılır. |
--$a
|
Önceden eksiltim | $a bir eksiltildikten sonra döndürülür. |
$a--
|
Sonradan eksiltim | $a döndürüldükten sonra değeri bir eksiltilir. |
Basit bir betik örneği:
<?php
echo "<h3>Sonradan arttırım</h3>\n";
$a = 5;
echo "5 olmalı: " . $a++ . "<br />\n";
echo "6 olmalı: " . $a . "<br />\n";
echo "<h3>Önceden arttırım</h3>\n";
$a = 5;
echo "6 olmalı: " . ++$a . "<br />\n";
echo "6 olmalı: " . $a . "<br />\n";
echo "<h3>Sonradan eksiltim</h3>\n";
$a = 5;
echo "5 olmalı: " . $a-- . "<br />\n";
echo "4 olmalı: " . $a . "<br />\n";
echo "<h3>Önceden eksiltim</h3>\n";
$a = 5;
echo "4 olmalı: " . --$a . "<br />\n";
echo "4 olmalı: " . $a . "<br />\n";
?>
PHP, karakter değişkenleri üzerinde çalışırken C'nin değil Perl'in yöntemlerini izler. Örneğin, Perl'de 'Z'+1 ifadesi 'AA' değerini döndürürken, C'de '[' döner ( ord('Z') == 90, ord('[') == 91 ). Karakterlerin arttırılabileceğini fakat azaltılamayacağını ve sadece ASCII harflerin (a-z ve A-Z) desteklendiğine dikkat ediniz.
Örnek 1 - Karakter değişkenleri üzerinde aritmetik işlemler
<?php
$i = 'W';
for ($n=0; $n<6; $n++) {
echo ++$i . "\n";
}
?>
Yukarıdaki örneğin çıktısı:
X Y Z AA AB AC
Mantıksal değerlere arttırım ve eksiltim uygulamanın bir etkisi olmaz.
| Örnek | İsim | Sonuç |
|---|---|---|
$a and $b
|
Ve | $a ve $b her ikisi de doğruysa sonuç doğrudur (TRUE). |
$a or $b
|
Veya | $a veya $b doğruysa sonuç doğrudur. |
$a xor $b
|
Ayrıcalıklı Veya | $a veya $b doğruysa sonuç doğru, her ikiside doğruysa sonuç yanlıştır (FALSE). |
! $a
|
Değil | $a doğru değilse sonuç doğrudur. |
$a && $b
|
Ve | $a ve $b her ikisi de doğruysa sonuç doğrudur. |
$a || $b
|
Veya | $a veya $b doğruysa sonuç doğrudur. |
Ve, Veya işleçlerinin iki farklı türü olmasının sebebi önceliklerinin farklı oluşudur. (Bakınız: İşleç Önceliği.)
Örnek 1 - Örneklerle mantıksal işleçler
<?php
// --------------------
// Aşağıdaki ifadelerde ilk terim sonucu belirlediğinden ikinci
// terime hiç bakılmayacak, yani foo() işlevi hiç çağrılmayacaktır.
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
// --------------------
// "||" işlecinin önceliği "or" işlecinden yüksektir.
// İfadenin sonucu $e'ye atanır (false || true)
// Tıpkı şöyle: ($e = (false || true))
$e = false || true;
// false sabiti $f'ye atanır ve true yoksayılır
// Tıpkı böyle: (($e = false) or true)
$f = false or true;
var_dump($e, $f);
// --------------------
// "&&" işlecinin önceliği "and" işlecinden yüksektir.
// İfadenin sonucu $g'ye atanır (true && false)
// Tıpkı böyle: ($g = (true && false))
$g = true && false;
// true sabiti $h'ya atanır ve false yoksayılır
// Tıpkı böyle: (($h = true) and false)
$h = true and false;
var_dump($g, $h);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
bool(true) bool(false) bool(false) bool(true)
İki tane dizge işleci vardır. İlki sol ve sağ terimlerini ard arda ekleyen birleştirme işleci ('.'), ikincisi ise sağ taraftaki değiştirgeyi sol taraftaki değiştirgeye ekleyen birleştirerek atama işlecidir (.=). Daha fazla bilgi için atama işleçleri bölümüne bakınız.
<?php
$a = "Merhaba ";
$b = $a . "Dünyalı!"; // $b artık "Merhaba Dünyalı!" içeriyor
$a = "Merhaba ";
$a .= "Dünyalı!"; // $a artık "Merhaba Dünyalı!" içeriyor
?>
Ayrıca, string türünün açıklamasına ve Dizge İşlevleri bölümüne bakınız.
| Örnek | İsim | Sonuç |
|---|---|---|
$a + $b
|
Birleşim | $a ve $b'nin birleşimi. |
$a == $b
|
Eşitlik | $a ve $b aynı anahtar/değer çiftlerine sahipse sonuç doğrudur. |
$a === $b
|
Aynılık | $a ve $b aynı anahtar/değer çiftlerine sahipse ve bunların sırası ve türleri aynıysa sonuç doğrudur. |
$a != $b
|
Eşitsizlik | $a ve $b birbirine eşit değilse sonuç doğrudur. |
$a <> $b
|
Eşitsizlik | $a ve $b birbirine eşit değilse sonuç doğrudur. |
$a !== $b
|
Farklılık | $a ve $b aynı dizi değilse sonuç doğrudur. |
+ işleci sağ taraftaki dizinin elemanlarını sol taraftaki dizinin elemanlarının arasına ekler. Bunu yaparken anahtarları aynı olan elemanların üzerine yazılmaz.
<?php
$a = array("a" => "elma", "b" => "armut");
$b = array("a" => "vişne", "b" => "kiraz", "c" => "çilek");
$c = $a + $b;
echo "\$a ve \$b'nin birleşimi: \n";
var_dump($c);
$c = $b + $a;
echo "\$b ve \$a'nın birleşimi: \n";
var_dump($c);
?>
Betik çalıştırıldığında şu çıktıyı verir:
$a ve $b'nin birleşimi:
array(3) {
["a"]=>
string(4) "elma"
["b"]=>
string(5) "armut"
["c"]=>
string(6) "çilek"
}
$b ve $a'nın birleşimi:
array(3) {
["a"]=>
string(6) "vişne"
["b"]=>
string(5) "kiraz"
["c"]=>
string(6) "çilek"
}
Aynı anahtar ve değere sahip dizi elemanları birbirine eşit kabul edilir.
Örnek 1 - Dizilerin karşılaştırılması
<?php
$a = array("elma", "armut");
$b = array(1 => "armut", "0" => "elma");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Ayrıca, array türünün açıklamasına ve Dizi İşlevleri bölümüne de bakınız.
instanceof işleci, bir PHP değişkeninin belli bir sınıfın nesnel örneği olup olmadığını saptar:
Örnek 1 - instanceof ve sınıflar
<?php
class Sınıfım
{
}
class BaşkaSınıf
{
}
$a = new Sınıfım;
var_dump($a instanceof Sınıfım);
var_dump($a instanceof BaşkaSınıf);
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(false)
instanceof ayrıca, bir değişkenin, bir ebeveyn sınıftan miras alınan bir sınıfın nesnel örneği olup olmadığını saptamak için de kullanılabilir:
Örnek 2 - Miras alınan sınıflar ve instanceof kullanımı
<?php
class EbeveynSınıf
{
}
class Sınıfım extends EbeveynSınıf
{
}
$a = new Sınıfım;
var_dump($a instanceof Sınıfım);
var_dump($a instanceof EbeveynSınıf);
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(true)
Bir nesne bir sınıfın örneği değilse bunu sınamak için mantıksal değil işleci kullanılabilir.
Örnek 3 - Bir sınıfın örneği olmayan bir sınıfın instanceof ile sınanması
<?php
class Sınıfım
{
}
$a = new Sınıfım;
var_dump(!($a instanceof stdClass));
?>
Yukarıdaki örneğin çıktısı:
bool(true)
Son olarak, instanceof işleci, bir değişkenin, bir arayüzü gerçekleyen bir sınıfın örneği olup olmadığını sınamak için kullanılabilir:
Örnek 4 - Arayüzler için instanceof kullanımı
<?php
interface Arayüzüm
{
}
class Sınıfım implements Arayüzüm
{
}
$a = new Sınıfım;
var_dump($a instanceof Sınıfım);
var_dump($a instanceof Arayüzüm);
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(true)
instanceof işlecinin normal olarak bir sayıl sınıf ismi ile kullanılmasının yanında başka bir nesne veya bir dizge değişkeni ile de kullanılabilir:
Örnek 5 - Başka değişkenlerle instanceof kullanımı
<?php
interface Arayüzüm
{
}
class Sınıfım implements Arayüzüm
{
}
$a = new Sınıfım;
$b = new Sınıfım;
$c = 'Sınıfım';
$d = 'BaşkaSınıf';
var_dump($a instanceof $b); // $b, Sınıfım sınıfının bir nesnesidir
var_dump($a instanceof $c); // $c 'Sınıfım' dizgesini içerir
var_dump($a instanceof $d); // $d 'BaşkaSınıf' dizgesini içerir
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(true) bool(false)
Burada bilmeniz gereken bir kaç zorluk vardır. PHP 5.1.0 öncesinde, instanceof işleci, sınıf mevcut değilse __autoload() çağrısı yapardı. Buna ek olarak, sınıf yüklenmemişse bir ölümcül hata oluşurdu. Bunun olmaması için bir devingen sınıf gönderimi veya sınıf ismini içeren bir dizge değişkeni kullanılabilir:
Örnek 6 - PHP 5.0'da instanceof ile ölümcül hatalardan ve sınıf ismi aramalarından kaçınmak
<?php
$d = 'BaşkaSınıf';
var_dump($a instanceof $d); // burada ölümcül hata oluşmaz
?>
Yukarıdaki örneğin çıktısı:
bool(false)
instanceof işleci PHP 5'ten itibaren mevcuttur. Evvelce is_a() işlevi kullanılırdı fakat instanceof kullanımını teşvik etmek için is_a() kullanımı önerilmemekteyse de PHP 5.3.0'dan itibaren bundan vazgeçilmiştir.
Ayrıca, get_class() ve is_a() işlevlerine de bakınız.
Bütün PHP betikleri bir dizi deyimden oluşur. Bir deyim; bir atama, bir işlev çağrısı, bir döngü, bir koşullu deyim hatta hiçbir şey yapmayan bir deyim (boş bir deyim) olabilir. Deyimler bir noktalı virgülle sonlandırılır. Ek olarak, deyimler kaşlı ayraçlar içine alınarak deyim grupları haline getirilebilirler. Bir deyim grubu da kendi başına bir deyim olarak kabul edilir. Bu fasılda deyim türlerinden bahsedeğiz.
if oluşumu, PHP dahil olmak üzere birçok programlama dilindeki en önemli yapı taşlarından biri olup kod bölümlerinin koşullu olarak çalıştırılabilmelerini sağlar. PHP, C dilindekine benzer bir if yapısı sunar:
if (ifade)
deyim
İfadelerle ilgili bölümde de anlatıldığı gibi, ifade kendi mantıksal değeri üzerinden değerlendirilir. ifade'nin sonucu TRUE ise, PHP deyim'i çalıştırır, FALSE ise gözardı eder. Hangi değerlerin FALSE olarak değerlendirildiği hakkında daha fazla bilgiyi boolean türüne dönüşüm bölümünde bulabilirsiniz.
Aşağıdaki örnek, $a değeri $b
değerinden büyük olduğu takdirde a büyüktür b metnini
görüntüleyecektir:
<?php
if ($a > $b)
echo "a büyüktür b";
?>
Çoğunlukla birden çok deyimin koşullu olarak çalıştırılmasını
isteyeceksiniz. Elbette, her deyimi ayrı ayrı if
cümlecikleri içine almanıza gerek yoktur. Birden çok deyimi tek bir
deyim grubu içine toplayabilirsiniz. Örneğin, aşağıdaki kod
$a değeri $b değerinden büyük
olduğu takdirde a büyüktür b metnini görüntüleyecektir ve
sonrasında $a değişkeninin değerini
$b değişkenine atayacaktır:
<?php
if ($a > $b) {
echo "a büyüktür b";
$b = $a;
}
?>
Sonsuz sayıda if deyimi bir başka if deyiminin içine gömülebilir. Bu, uygulamanızın çeşitli bölümlerine koşullu deyimler uygulayabilmeniz için tam bir esneklik sağlar.
Çoğu zaman belli bir koşul sağlandığında bir deyimin, o koşul sağlanmadığında başka bir deyimin çalıştırılmasını isteyeceksiniz. Bunun için else kullanılmaktadır. Else, bir if deyimini FALSE döndürdüğü takdirde bir deyim çalıştırmak üzere genişletir. Örneğin, aşağıdaki kod $a değeri $b değerinden büyükse a büyüktür b, büyük değilse a büyük değildir b iletisini görüntüleyecektir:
<?php
if ($a > $b) {
echo "a büyüktür b";
} else {
echo "a büyük değildir b";
}
?>
Else deyimi yalnızca if deyiminin FALSE döndürdüğü durumda çalıştırılacaktır. Aynı durum, FALSE döndüren herhangi bir elseif ifadesinin olması durumunda da geçerlidir (bakınız elseif).
elseif, isminden de anlaşılacağı gibi, if ve else deyimlerinin biraraya gelmesiyle oluşur. else gibi, orijinal if ifadesinin FALSE döndürdüğü durumda farklı bir deyimin çalıştırılması için kullanılır. Ancak, else'ten farklı olarak, ilgili deyimi sadece kendisine ait koşullu ifade TRUE değerini döndürdüğü takdirde çalıştıracaktır. Örneğin, aşağıdaki kod a büyüktür b, a eşittir b ya da a küçüktür b iletisini görüntüleyecektir:
<?php
if ($a > $b) {
echo "a büyüktür b";
} elseif ($a == $b) {
echo "a eşittir b";
} else {
echo "a küçüktür b";
}
?>
Aynı if deyimine ait birden çok elseif bulunabilir. İlk önce hangi elseif deyimi TRUE değerini döndürürse (eğer döndüren varsa) o deyim çalıştırılır. Bu deyimi 'elseif' biçiminde tek sözcük olarak kullanabileceğiniz gibi, 'else if' biçiminde iki sözcük olarak da kullanabilirsiniz, sonuç aynı olacaktır. Sözdiziminin anlamlandırılması açısından küçük bir farklılık olsa da (C diline aşinaysanız, onda da böyledir) sonuç olarak her ikisi de aynı sonucu üretecektir.
elseif ifadesi yalnızca kendisinden önceki if ifadesi ve bu ifadeye bağlı kendisinden önce gelen diğer tüm elseif ifadeleri FALSE ile sonuçlandığında çalıştırılır ve TRUE olarak değerlendirilir.
Bilginize: elseif ve else if, yukarıdaki örnekten anlaşılacağı üzere sadece kaşlı ayraçlar kullanıldığı zaman tamamen aynı şekilde ele alınacaktır. if ve elseif için iki noktalı sözdizimi kullanıldığında elseif'i iki sözcüğe ayırmamanız gerekir, yoksa PHP bir çözümleme hatası vererek başarısız olur.
<?php
/* Yanlış Yöntem: */
if($a > $b):
echo $a." büyüktür ".$b;
else if($a == $b): // Bu derlenmez.
echo "Üstteki satır bir çözümleme hatasına yol açar.";
endif;
/* Doğru Yöntem: */
if($a > $b):
echo $a." büyüktür ".$b;
elseif($a == $b): // Sözcüklerin birleşik oluşuna dikkat!
echo $a." eşittir ".$b;
else:
echo $a." ne büyük ne de eşittir ".$b;
endif;
?>
PHP bazı denetim yapıları için farklı bir sözdizimi sağlar. Bu yapılar if, while, for, foreach ve switch yapılarıdır. Her durumda, bu farklı sözdiziminin basit şekli açılışta kullanılan kaşlı ayracın yerine iki nokta imi (:) ve kapanışta kullanılan kaşlı ayraç yerine de sırasıyla endif;, endwhile;, endfor;, endforeach; ya da endswitch; deyimlerinden birini kullanmaktır.
<?php if ($a == 5): ?>
A eşittir 5
<?php endif; ?>
Yukarıdaki örnekte, içeriği "A eşittir 5" olan HTML bloğu iki noktalı sözdimi kullanılarak yazılmış bir if deyiminin içine gömülmüştür. HTML bloğu yalnızca $a değişkeni 5'e eşit olduğunda gösterilecektir.
İki noktalı sözdimi, else ve elseif için de kullanılabilir. Birazdan vereceğimiz örnek, iki noktalı sözdizimi ile yazılmış elseif ve else içeren bir if yapısıdır:
<?php
if ($a == 5):
echo "a eşittir 5";
echo "...";
elseif ($a == 6):
echo "a eşittir 6";
echo "!!!";
else:
echo "a ne 5 ne de 6'dır";
endif;
?>
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 döngüsü PHP'de yer alan en basit döngü türüdür. C'deki karşılığı ile aynı şekilde çalışır. Bir while deyiminin basit kullanımı:
while (ifade)
deyim
While deyiminin anlamı basittir. while deyimindeki ifade TRUE olduğu müddetçe etki alanındaki deyimleri PHP tekrar tekrar çalıştırır. İfadenin değeri döngünün her yinelenişinde yeniden değerlendirilir, deyimlerin çalıştırılması sırasında bu ifadenin değeri FALSE olsa bile, etki alanındaki deyimlerin tamamı çalıştırılıncaya kadar işlem devam eder. (PHP döngü içindeki deyimleri her yinelemede bir kere çalıştırır.) Bazen, while ifadesi daha başlangıçta FALSE değerini verir, bu durumda while etki alanındaki deyimler tek bir defa bile çalıştırılmazlar.
if deyiminde olduğu gibi, birden çok deyimi aynı while döngüsü içinde kaşlı ayraçlar arasında veya iki noktalı sözdizimini kullanarak gruplayabilirsiniz:
while (ifade):
deyimler
...
endwhile;
Aşağıdaki örnekler birbirleri ile aynıdırlar, her ikisi de sayıları 1'den 10'a kadar yazacaktır:
<?php
/* örnek 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* yazdırılan değer $i
değerinin artıştan önceki
değeridir (sonda-arttırım) */
}
/* örnek 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
do-while döngüsü, while döngüsüne çok benzer; farkı, doğrulama ifadesinin her yinelemenin başında değil sonunda değerlendiriliyor olmasıdır. while döngüsü ile temek farklılık, do-while kullanıldığında ilk yinelemenin daima yapılıyor olmasıdır (ifadenin doğruluğuna yalnızca yinelemenin sonunda bakılır); halbuki while döngüsünde, ifadenin doğruluğuna her yinelemenin öncesinde bakılmakta ve ifadenin sonucu doğru değilse yineleme hiç başlatılmadan döngü sonlandırılmaktadır.
do-while döngüsü için yalnızca tek bir sözdizimi mevcuttur:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
Yukarıdaki döngü tam olarak bir defa çalışacaktır, ilk tekrardan sonra ifadenin doğruluğuna bakıldığında FALSE değerini verecek ($i sıfırdan büyük değildir) ve döngünün çalışması sonlanacaktır.
<?php
do {
if ($i < 5) {
echo "i yeterince büyük değil";
break;
}
$i *= $çarpan;
if ($i < $alt_sınır) {
break;
}
echo "i uygun";
/* i değerini işle */
} while (0);
?>
Burada neler olup bittiğini anlamadıysanız endişelenmeyin. Bu 'özelliği' kullanmadan da oldukça gelişmiş ve güçlü uygulamalar geliştirebilirsiniz. PHP 5.3.0'dan beri bu özelliğin yerine goto kullanılabilmektedir.
for döngüsü, PHP'deki en karmaşık döngü yapısıdır. C'deki karşılığıyla aynı biçimde çalışır. for döngüsünün sözdimi:
for (ifade1; ifade2; ifade3)
deyim
İlk ifade (ifade1) döngünün en başında bir kereliğine koşulsuz olarak çalıştırılır.
Her yinelemenin başında ifade2 yeniden değerlendirilir. Bu ifadeden TRUE sonucu elde edilirse, döngüye devam edilir ve döngünün etki alanındaki deyimler çalıştırılır. Bu ifadeden FALSE sonucu elde edildiğinde etki alanındaki deyimler çalıştırılmaksızın döngü sonlandırılır.
ifade3 ise her yinelemenin sonunda çalıştırılır.
Bu ifadelerin herbirini boş bırakmak da mümkündür. ifade2nin boş olması, döngünün sonsuza kadar çalıştırılacağı anlamına gelir (PHP, C'deki gibi bu durumu TRUE olarak değerlendirir). Döngülerden genellikle bir şarta bağlı olarak break deyimi ile çıkmak isteyeceğiniz düşünüldüğünde, bu durum düşündüğünüz kadar kullanışsız değildir.
Aşağıdaki örnekleri ele alalım. Hepsi de 1'den 10'a kadar sayıları görüntülemektedir:
<?php
/* örnek 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* örnek 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* örnek 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* örnek 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Elbette, kullandığımız ilk örnek en güzel örnek olarak gözükmektedir (ya da belki dördüncü örnek), ancak birçok durumda for döngüsü içerisinde boş ifadeler kullanmayı oldukça kullanışlı bulabilirsiniz.
PHP, iki noktalı sözdizimini for döngüleri için de desteklemektedir.
for (ifade1; ifade2; ifade3):
deyimler
...
endfor;
Çoğu kullanıcının yaptığı gibi diziler üzerindeki yinelemeleri şöyle yapabilirsiniz:
<?php
/*
* Diziye baştan bir kaç veri atıp daha sonra
* döngü içinde verilerde değişiklik yapacağız.
*/
$bizimkiler = Array(
Array('isim' => 'Ali', 'tuz' => 856412),
Array('isim' => 'Veli', 'tuz' => 215863)
);
for($i = 0; $i < sizeof($bizimkiler); ++$i)
{
$bizimkiler[$i]['tuz'] = rand(000000, 999999);
}
?>
Sorun ikinci ifadede gizlidir. Her yinelemede dizinin boyutları yeniden hesaplandığından kod yavaş çalışabilir. Örnekte boyut değişmediğinden dizi boyutunu önce bir değişkene atıp ifadede bu değişken kullanılarak kod en iyilenebilir. Aşağıdaki bunun yapılışı örneklenmiştir:
<?php
$bizimkiler = Array(
Array('isim' => 'Ali', 'tuz' => 856412),
Array('isim' => 'Veli', 'tuz' => 215863)
);
for($i = 0, $size = sizeof($bizimkiler); $i < $size; ++$i)
{
$bizimkiler[$i]['salt'] = rand(000000, 999999);
}
?>
PHP 4 ile birlikte Perl ve bazı diğer dillerde mevcut olan foreach yapısı da kullanıma sunulmuştur. Bu deyim diziler üzerinde yineleme yapmayı kolaylaştırmaktadır. foreach yalnızca diziler için kullanılabilir; farklı veri türünde veya ilklendirilmemiş bir değişken ile kullanmak istediğinizde hata verir. İki sözdizimi mevcuttur; ikincisi birinciden biraz daha kullanışlıdır:
foreach (dizi_ifadesi as $değer)
deyim
foreach (dizi_ifadesi as $isim => $değer)
deyim
İlk sözdizimi dizi_ifadesi ile belirtilen dizinin üzerinde döngü oluşturur. Her yinelemede, sırası gelen elemanın değeri $değer değişkenine atanır ve dizi göstericisi bir arttırılır (böylece bir sonraki yinelemede dizinin bir sonraki elemanına bakılması sağlanmış olur).
İkinci yöntem de aynı şeyi yapar, ek olarak her yinelemede sırası gelen elemanın anahtarı $isim değişkenine atanır.
PHP 5'den itibaren, nesneleri yinelemek mümkün olmuştur.
Bilginize: foreach ilk çalışmaya başladığında, dizi göstericisi özdevinimli olarak ilk elemanı gösterecek biçimde sıfırlanır. Bu sebeple, foreach deyiminden önce reset() işlevini çalıştırmanıza gerek yoktur.
Bilginize: Dizi gönderimli olmadıkça, foreach dizinin kendisi üzerinde değil, bir kopyası üzerinde çalışır. Bundan dolayı özgün dizi göstericisi değiştirilmez ve döndürülen dizi elemanı üzerinde yapılan değişiklikler özgün diziye yansıtılmaz.
PHP 5'den itibaren, $değer değişkeninin önüne & koyarak dizi elemanları üzerinde kolayca değişiklik yapılabilmektedir. Bu kullanımla değeri kopyalamak yerine kendisine bir gönderim yapılması sağlanır.
<?php
$dizi = array(1, 2, 3, 4);
foreach ($dizi as &$değer) {
$value = $değer * 2;
}
// $dizi artık array(2, 4, 6, 8) olmuştur
unset($değer); // son eleman da işlendiğine göre gönderimi kaldıralım
?>
Bu durum yalnızca yinelenen diziye gönderim yapılabiliyorsa mümkündür (örneğin, bir değişkense), yani aşağıdaki kod çalışmaz:
<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>
$değer gönderim için kullanıldığından foreach döngüsünün sonunda son dizi elemanına gönderimli olarak kalır, bu bakımdan döngünün sonunda bu gönderimin unset() işlevi kullanılarak kaldırılması önerilir.
Bilginize: foreach, hata iletilerinin '@' kullanılarak gözardı edilmesi özelliğini desteklemez.
Aşağıdaki iki döngünün aynı işi yaptığını farkedeceksiniz:
<?php
$dizi = array("bir", "iki", "üç");
reset($dizi);
while (list(, $değer) = each($dizi)) {
echo "Değer: $değer<br />\n";
}
foreach ($dizi as $değer) {
echo "Değer: $değer<br />\n";
}
?>
Aşağıdakiler de işlevsel olarak aynıdır:
<?php
$dizi = array("bir", "iki", "üç");
reset($dizi);
while (list($isim, $değer) = each($dizi)) {
echo "Anahtar: $isim; Değer: $değer<br />\n";
}
foreach ($dizi as $isim => $değer) {
echo "Anahtar: $isim; Değer: $değer<br />\n";
}
?>
Değişik kullanımlara örnekler:
<?php
/* foreach örneği 1: yalnızca değer */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "\$a değişkeninin şu anki değeri: $v.\n";
}
/* foreach örneği 2: değer (örnek olması için anahtar
* ile birlikte yazdırılmıştır) */
$a = array(1, 2, 3, 17);
$i = 0; /* yalnızca örnekleme için */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* foreach örneği 3: anahtar ve değer */
$a = array(
"bir" => 1,
"iki" => 2,
"üç" => 3,
"on yedi" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* foreach örneği 4: çok boyutlu diziler */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* foreach örneği 5: devingen diziler */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
break deyimi, for, foreach, while, do-while ve switch yapılarının çalışmasını sonlandırmak için kullanılır.
break deyiminde istenirse bir sayısal ifade belirtilebilir. Bu sayı iç içe yapılardan içten dışa kaç yapının aynı anda durdurulacağını belirler.
<?php
$arr = array('sıfır', 'bir', 'iki', 'üç', 'dur', 'dört', 'beş');
while (list(, $val) = each($arr)) {
if ($val == 'dur') {
break; /* Burada 'break 1;' de yazabilirsiniz. */
}
echo "$val<br />\n";
}
/* Sayısal değer kullanımı. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "5'de<br />\n";
break 1; /* Yalnızca switch'ten çıkar. */
case 10:
echo "10'da; çıkılıyor<br />\n";
break 2; /* switch ve while'dan aynı anda çıkılır. */
default:
break;
}
}
?>
continue deyimi döngü yapılarının içinde kullanılır. Bu deyim kullanıldığında, döngünün kalan kısmı atlanır ve sonraki yineleme başlatılır.
Bilginize: PHP'de switch deyimi continue deyiminin kullanılabileceği döngülerden biri olarak kabul edilmektedir.
continue deyimi ile seçime bağlı sayısal bir değer kullanılarak, atlama işleminin kaç seviye üstteki döngüye kadar uygulanacağı belirtilebilir.
<?php
while (list($key, $value) = each($arr)) {
if (!($key % 2)) { // tek sayıları atla
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Dış<br />\n";
while (1) {
echo " Orta<br />\n";
while (1) {
echo " İç<br />\n";
continue 3;
}
echo "Bu hiçbir zaman çıktı vermez.<br />\n";
}
echo "Bundan da çıktı alamazsınız.<br />\n";
}
?>
continue deyiminden sonra noktalı virgül konmazsa bu durum karışıklığa yol açabilir. Yapmamanız gereken ile ilgili bir örnek:
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
Şu biçimde bir çıktı almayı bekleyebilirsiniz:
0 1 3 4
Ancak çıktı şu şekilde olacaktır:
2
Bunun sebebi print() işlevinden dönen değerin int(1) olması ve bu dönen değerin PHP tarafından yukarıda bahsedilen seçime sağlı sayısal değer olarak algılanmasıdır.
switch deyimi, aynı ifade içersinde yer alan bir dizi IF deyimine benzer. Birçok durumda, aynı değişkeni (ya da ifadeyi) birden çok değerle karşılaştırmak ve her karşılaştırmanın sonucunu ayrı bir kod parçası çalıştırarak değerlendirmek istersiniz. İşte bu, switch deyiminin varlık sebebidir.
Bilginize: Başka bazı dillerden farklı olarak, continue deyimi switch ile uygulanabilir ve break ile benzerlik gösterir. Bir döngü içerisinde switch kullandıysanız ve kodun yürütülmesine dıştaki döngünün sonraki yinelemeden devam etmesini istiyorsanız, continue 2 kullanabilirsiniz.
Bilginize: switch ve case gevşek karşılaştırma yapar.
Aşağıdaki iki örnek aynı şeyi yazmanın iki farklı yolunu göstermektedir. Birincisi bir dizi if ve elseif deyiminin kullanımını, ikincisi ise switch deyiminin kullanımını örneklemektedir:
Örnek 1 - switch yapısı
<?php
if ($i == 0) {
echo "i eşittir 0";
} elseif ($i == 1) {
echo "i eşittir 1";
} elseif ($i == 2) {
echo "i eşittir 2";
}
switch ($i) {
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
}
?>
Örnek 2 - switch ile dizge kullanımı
<?php
switch ($i) {
case "elma":
echo "i bir elmadır";
break;
case "çikolata":
echo "i bir çikolatadır";
break;
case "kek":
echo "i bir kektir";
break;
}
?>
Hatalardan kaçınmak için switch deyiminin nasıl çalıştığını anlamak önemlidir. switch deyimi satır satır ele alınır (aslında deyim deyim). Başlangıçta, hiçbir kod çalıştırılmaz. Yalnızca switch ifadesiyle birlikte verilen değer ile uyuşan case deyimi bulunduğunda PHP ilgili deyimleri çalıştırmaya başlar. PHP switch bloğu sonlanana kadar ya da ilk break deyimi ile karşılaşıncaya kadar çalışmasına devam eder. Bir case bloğunun sonuna break koymazsanız, PHP sonraki case deyiminden kodları çalıştırmaya devam eder. Örnek:
<?php
switch ($i) {
case 0:
echo "i eşittir 0";
case 1:
echo "i eşittir 1";
case 2:
echo "i eşittir 2";
}
?>
Burada, $i 0'a eşit ise, PHP tüm echo deyimlerini çalıştıracaktır! $i 1'e eşit ise, PHP son iki echo deyimini çalıştıracaktır! Beklediğiniz sonucu ('i eşittir 2' metninin görüntülenmesi) yalnızca $i 2'ye eşitse almanız mümkün olacaktır. Bu durumun oluşmaması için, break deyimini kullanmayı unutmamanız önemlidir (yine de, bazı durumlarda break deyimini kullanmak istemeyebilirsiniz).
Bir switch deyiminde, koşul yalnızca bir defa sorgulanır ve sonuç her bir case deyimi ile karşılaştırılır. Bir elseif deyiminde ise, koşul tekrar sorgulanır. Kullanmak istediğiniz koşul basit bir karşılaştırma işleminden daha karmaşıksa ve/veya bir döngü içerisindeyse, switch kullanmak daha hızlı olabilir.
case bloğu kod içermeyebilir ve amacı yalnızca denetimi bir sonraki case bloğuna geçirmek olabilir.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i 3'ten küçüktür ama negatif değildir";
break;
case 3:
echo "i eşittir 3";
}
?>
default durumu özel bir durumdur. Bu durum diğer hiçbir case ile uyuşmayan değerler için kullanılır ve en sonda yer almalıdır. Örneğin:
<?php
switch ($i) {
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
default:
echo "i ne 0, ne 1 ne de 2'ye eşittir";
}
?>
case ifadesi bir basit tür olarak değerlendirilebilecek herhangi bir tür olabilir; yani, tam sayı (integer), gerçel sayı (float) veya dizge (string) olabilir. Diziler (array) ya da nesneler (object), bir basit türe indirgenmedikleri sürece kullanılamazlar.
İki noktalı sözdizimi switch deyimi için de desteklenmektedir. Daha fazla bilgi için, Denetim yapıları için diğer söz dizimi bölümünü inceleyebilirsiniz.
<?php
switch ($i):
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
default:
echo "i ne 0, ne 1 ne de 2'ye eşittir;
endswitch;
?>
case’ten sonraki iki nokta yerine aşağıdaki gibi deyim sonunda noktalı virgül kullanmak da mümkündür:
<?php
switch($içecek)
{
case 'su';
case 'süt';
case 'ayran';
echo 'İyi seçim';
default;
echo 'Lütfen yeniden seçiniz...';
break;
}
?>
declare yapısı bir kod bloğunun çalıştırılması esnasında uygulanacak yönergeleri belirlemek için kullanılır. declare yapısının sözdizimi diğer akış denetim yapılarının söz dizimi ile benzerdir:
declare (yönerge)
deyim
yönerge bölümü, declare bloğunun davranışını belirlemek için kullanılır. Şimdilik yalnızca iki yönerge kullanılabilmektedir: ticks yönergesi (Daha fazla bilgi edinmek için aşağıya, ticks yönergesine bakınız.) ve encoding yönergesi.
Bilginize: encoding yönergesi PHP 5.3.0'da eklenmiştir.
declare bloğunun deyim bölümünün nasıl çalıştırılacağı ve çalışma esnasındaki yan etkilerinin ne olacağı yönerge bölümünde belirtilen yönergeye bağlı olabilir.
declare bloğu kendinden sonra gelen tüm kodu etkilemesi için genel betik kapsamında da kullanılabilir. Bununla birlikte, declare bloğu dahil edilen bir dosyanın içindeyse ebeveyn dosya bundan etkilenmez.
<?php
// aşağıdaki iki örnek aynıdır:
// bunu kullanabilirsiniz:
declare(ticks=1) {
// betiğin tamamı burada
}
// ya da bunu kullanabilirsiniz:
declare(ticks=1);
// betiğin tamamı burada
?>
Tikler
Bir "tik", declare bloğu içersinde çözümleyici
tarafından çalıştırılan her N tiklenebilir deyimde bir
ortaya çıkan bir olaydır. N değeri,
declare bloğunun yönerge
bölümünde ticks=N kullanılarak
belirtilir.
Her deyim tik sayımına dahil edilebilir değildir. Koşullu ifadeler ve değiştirge ifadeleri bu tür deyimlerdendir.
Her tik ile oluşturulacak eylem register_tick_function() işlevi ile belirtilir. Daha ayrıntılı bilgi için aşağıdaki örneğe bakınız. Her tik için birden fazla olayın oluşabileceğini gözardı etmeyiniz.
Örnek 1 - Tik kullanım örneği 1
<?php
declare(ticks=1);
// Her tik deyimde bir çalıştırılacak işlev
function tik_eylemci()
{
echo "tik_eylemci() çağrıldı\n" ;
}
// Tik eylemcisini belirtelim
register_tick_function("tik_eylemci");
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
?>
Örnek 2 - Tik kullanım örneği 2
<?php
function tik_eylemci()
{
echo "tik_eylemci() çağrıldı\n" ;
}
$a = 1;
tik_eylemci();
if ($a > 0) {
$a += 2;
tik_eylemci();
print($a);
tik_eylemci();
}
tik_eylemci();
?>
Ayrıca, register_tick_function() ve unregister_tick_function() işlevlerini de inceleyin.
encodingHer betiğin karakter kodlaması betiğin başında encoding yönergesi ile belirtilebilir.
Örnek 3 - Betik için kodlama belirtmek
<?php
declare(encoding='ISO-8859-1');
// kodlar burada
?>
İsim alanları ile birlikte kullanıldığında, tek geçerli sözdizimi declare(encoding='...'); olup, buradaki ... kodlama değeridir. declare(encoding='...') {} sözdizimi isim alanları ile birlikte kullanıldığında bir çözümleme hatası ile sonuçlanacaktır.
Karakter kodlaması bildirim değeri, PHP, --enable-zend-multibyte yapılandırma seçeneği ile derlenmediği takdirde PHP 5.3'te yoksayılır. PHP 6.0'da encoding yönergesi, dosya oluşturulurken hangi kodlamanın kullanıldığını tarayıcıya bildirmek için kullanılır. Meşru değerler, UTF-8 gibi karakter kodlaması isimleridir.
Bir işlevin içinde kullanıldığında, return() deyimi çalışmakta olan işlevi hemen sonlandırıp değiştirgesini çağrılan işlevin değeri olarak döndürür. return() ayrıca, bir betiğin veya bir eval() deyiminin çalışmasını sonlandırmak için de kullanılabilir.
Betik genelinde çağrıldığında, betik dosyasının çalışmasını sonlandırılır. Eğer dosya include() ya da require() ile betik dosyasına dahil edilmiş bir dosya ise, return() deyimi akış denetiminin ana dosyaya aktarılmasını sağlar. Dahası, return() deyiminin çağrıldığı dosya include() ile dahil edilmişse return() değeri include() çağrısının değeri olarak dönecektir. return() ana betik dosyasının içinden çağrıldığı takdirde, betiğin çalışması sonlandırılacaktır. Eğer return() deyiminin çağrıldığı dosya, ismi php.ini içindeki auto_prepend_file veya auto_append_file yapılandırma seçenekleri ile atanan bir dosya ise bu betik dosyasının da çalışmasını sonlandıracaktır.
Daha fazla bilgi için, Dönüş değerleri bölümüne bakınız.
Bilginize: return() bir işlev değil bir dil oluşumu olduğundan, değiştirgesini içeren parantez yalnızca değiştirge bir ifade içeriyorsa zorunludur. Bir değişken döndürürken genellikle parantez kullanılmaz. Böyle bir durumda, PHP'nin daha az işlem yapması için bu yöntemi izlemeniz gerekir.
Bilginize: Değiştirgesiz kullanılacaksa yaylı ayraçlar konulmamalıdır bu durumda dönen değer NULL olur. Değiştirge içermeyen yaylı ayraçların kullanımı bir çözümleme hatası ile sonuçlanır.
Bilginize: Bir değişkeni gönderimli olarak döndürüyorsanız, asla parantez kullanmamalısınız, bu çalışmayacaktır. Bir deyimin sonucunu gönderimli olarak döndüremezsiniz, yalnızca değişkenler gönderimli olarak döndürülebilir. return ($a); kullanıyorsanız, bir değişken değil, bir ifadenin sonucunu ($a) döndürüyorsunuz demektir (bu da elbette, $a değişkeninin değeridir).
require() deyimi bir başarısızlıkta E_ERROR seviyesinden ölümcül bir hata vermesi dışında include() deyimi ile aynıdır. Başka bir deyişle, include() deyiminin sadece bir uyarı (E_WARNING) vererek çalışmayı sürdürdüğü durumda require() deyimi betiğin hata vererek durmasına sebep olur.
Deyimin nasıl çalıştığını öğrenmek için include() belgesine bakınız.
include() deyimi belirtilen dosyayı betiğe ekler ve içeriğini değerlendirir.
Betiğe dahil edilecek dosyalar önce belirtilen dizinde aranır, eğer bir dizin belirtilmemişse include_path yönergesinde belirtilen yollarda aranır. include() dosyayı bulamazsa bir uyarı çıktılar; require() için bu davranış bir ölümcül hata olarak kendini gösterir.
Bir dizin belirtilmişse (göreli veya mutlak) include_path yönergesine bakılmaz. Örneğin bir dosya ../ ili başlıyorsa PHP çözümleyicisi dosyayı betiğin bulunduğu dizinin üst dizininde arayacaktır.
PHP'nin dahil edilen dosyaları nasıl ele aldığı include_path yönergesinin açıklamasında ayrıntılı olarak anlatılmıştır.
Bir dosya bir betiğe dahil edildiğinde, bu dosyanın içerdiği kod, dosyanın dahil edildiği satır itibariyle ana betikte geçerli olan değişken uzayını miras alır. Yani, dosyanın dahil edildiği satıra kadar mevcut değişkenlerin hepsi dahil edilen dosyanın içinde kullanılabilir olacaktır. Bunun yanında, dahil edilen dosyada tanımlanmış işlevlerin ve sınıfların tamamı ana betiğin genelinde tanımlanmış sayılır.
Örnek 1 - Basit bir include() örneği
vars.php
<?php
$renk = 'yeşil';
$meyve = 'elma';
?>
dnm.php
<?php
echo "Bir $renk $meyve"; // -> Bir
include 'vars.php';
echo "Bir $renk $meyve"; // -> Bir yeşil elma
?>
include deyimi, bir işlevin içinde kullanılırsa dahil edilmek istenen dosyanın içindeki tüm kodlar sanki o işlev içinde tanımlanmış gibi çalıştırılacaktır. Bu durumda dahil edilen dosyadaki kodlar, işlevin, dosyanın dahil edildiği noktadaki değişken uzayını miras alacaktır. Bu kuralın istisnası dosya dahil edilmeden önce çözümleyici tarafından işleme sokulan sihirli sabitlerdir.
Örnek 2 - İşlev içi include kullanımı
<?php
function foo()
{
global $renk;
include 'vars.php';
echo 'Bir $renk $meyve';
}
/* vars.php, foo() işlevinin etki alanındadır
* dolayısıyla $meyve bu alanın dışında
* kullanılamamaktadır. $renk ise global olarak
* tanımlandığından kullanılabilir
*/
foo(); // Bir yeşil elma
echo 'Bir $renk $meyve'; // Bir yeşil
?>
Bir dosya bir betiğe dahil edildiğinde, çözümleme işlemi PHP kipinden çıkıp hedef dosyanın başlangıcında HTML kipine geçer ve dosyanın sonuna kadar HTML kipinde kalır. Bu sebeple, hedef dosyanın içindeki kodlardan PHP kodları olarak çalıştırılacaklar PHP başlangıç ve bitiş etiketleri arasına alınmalıdır.
"URL fopen sarmalayıcıları" PHP'de etkinleştirilmiş ise (öntanımlı yapılandırmada etkindirler), include deyiminde yerel dosya yolu belirtmek yerine (HTTP ya da desteklenen başka bir sarmalayıcı üzerinden - Desteklenen Protokollerin ve Sarmalayıcıların Listesi bölümününe bakınız) bir URL kullanabilirsiniz. Hedef sunucu, hedef dosyayı PHP kodu olarak çalıştırabiliyorsa, ana betikteki değişkenler dahil edilen dosyaya bir URL istek dizgesi olarak HTTP GET ile aktarılabilir. Bu durum dahil edilen dosyaya ana dosyanın değişken uzayını miras olarak bırakmaktan biraz farklı bir şeydir; betik aslında uzak sunucuda çalıştırılıp yerel betiğe sonuçlar dahil edilmektedir.
PHP'nin 4.3.0 öncesi Windows sürümü uzak dosyalara bu işlev üzerinden erişimi allow_url_fopen etkin olsa bile desteklemez.
Örnek 3 - HTTP üzerinden include
<?php
/* Bu örnekte mesela.dom sitesinin .php uzantılı dosyaları
* çalıştırabildiği ama .txt uzantılıları çalıştırmadığı
* varsayılmıştır. Ayrıca, buradaki 'Çalışır'ın manası
* $foo ve $bar değişkenlerinin dahil edilen dosyada kullanılabilir
* olduğudur. */
// Çalışmaz; dosya.txt dosyası mesela.dom sitesinde çalıştırılmaz
include 'http://mesela.dom/dosya.txt?foo=1&bar=2';
// Çalışmaz; yerel dosya sisteminde 'dosya.php?foo=1&bar=2'
// adında bir dosya olarak aranır.
include 'dosya.php?foo=1&bar=2';
// Çalışır.
include 'http://mesela.dom/dosya.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'dosya.txt'; // Çalışır.
include 'dosya.php'; // Çalışır.
?>
Uzaktaki dosya uzaktaki sunucu tarafından işlenebilir (dosyanın uzantısına ve uzaktaki sunucunun PHP çalıştırıp çalıştırmadığına bağlı olarak). Ancak, elde edilecek çıktı yerel sunucuda çalıştırılacağından bu işlemin sonucu mutlaka geçerli bir PHP betiği üretmek olmalıdır. Dosyanın uzaktaki sunucuda işlenip sadece sonucun çıktılanmasını istiyorsanız readfile() işlevi daha iyi bir seçim olacaktır. Aksi takdirde, uzakta çalıştırılan betiğin geçerli ve istenen kodu üretebilmesini güvence altına alabilmek için özel bir çaba harcamak gerekir.
Ayrıca, bu konuyla ilgili olarak Uzaktaki dosyaların kullanımı belgesiyle fopen() ve file() işlevlerine de bakınız.
return kullanımı: Dahil edilen dosyanın içersinde, bu dosyanın işlenmesi durdurmak ve dahil eden betiğe geri dönmek için return() kullanılabilir. Ayrıca, dahil edilen dosyalardan değer döndürmek de mümkündür. Normal bir işlevde olduğu gibi, include çağrısından elde edilen değeri bir değişkene atayabilirsiniz. Ancak bu durum, uzaktaki dosyalar için, sadece uzaktaki dosyanın çıktısı geçerli PHP başlangıç ve bitiş etiketlerine sahipse (herhangi yerel bir dosyada olduğu gibi), kullanılabilir. Gerekli değişkenler bu etiketlerin arasında tanımlandığında dosyanın dahil edildiği noktadan itibaren kullanılabilir olacaklardır.
include özel bir dil oluşumu olduğundan, değiştirgesinin parantez içine alınması gerekmez. Dönüş değerini karşılaştırırken buna dikkat edin.
Örnek 4 - include dönüş değerinin karşılaştırılması
<?php
// çalışmaz, include(('vars.php') == 'TAMAM') olarak değerlendirilir,
// sonuç include('') olur
if (include('vars.php') == 'TAMAM') {
echo 'TAMAM';
}
// çalışır
if ((include 'vars.php') == 'TAMAM') {
echo 'TAMAM';
}
?>
Örnek 5 - include ve return deyimleri
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // 'PHP' basar
$bar = include 'noreturn.php';
echo $bar; // 1 basar
?>
include işlemi başarılı olduğundan $bar, 1 değerine sahiptir. Yukarıdaki örnekler arasındaki farklara dikkat edin. Birincisi return() deyimini dahil edilen dosyada kullanırken ikincisi kullanmıyor. Dosya dahil edilemediği durumda, FALSE döndürülüyor ve bir E_WARNING üretiliyor.
Dahil edilen dosyanın içinde tanımlanmış işlevler varsa, return() deyiminden önce ya da sonra olduğundan bağımsız olarak ana betik içersinde kullanılabilirler. Dosya iki defa dahil edilmişse, PHP 5 ölümcül hata verir çünkü bildirilmiş işlevler tekrar bildirilmeye calışılmış olur. PHP 4 ise return()'den sonra tanımlanmış işlevler için şikayetçi olmayacaktır. Dosyanın halihazırda dahil edilip edilmediğini kendiniz tespit edip koşula bağlı return() çalıştırmak yerine, include_once() kullanmanız önerilir.
Bir PHP dosyasını bir değişkene "dahil" etmenin diğer bir yolu, çıktıyı Çıktı Denetim İşlevlerini include() ile birlikte kullanarak yakalamaktır. Örnek:
Örnek 6 - Bir PHP dosyasını bir dizgeye dahil etmek için tampon kullanımı
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}
?>
Betiğinize dosyaları özdevinimli olarak dahil etmek için, php.ini içersindeki auto_prepend_file ve auto_append_file yapılandırma seçeneklerini inceleyebilirsiniz.
Bilginize: Bu bir işlev değil, dil oluşumu olduğundan değişken işlevler kullanılarak çağrılamaz.
Ayrıca, require(), require_once(), include_once(), readfile(), virtual() ve include_path'a da bakınız.
require_once() deyimi, dosyayı evvelce dahil edilmişse tekrar dahil etmemesi dışında require() deyimiyle aynıdır.
_once eki olup olmamasının ne gibi farklara yol açtığı ve varlığının davranışı nasıl değiştirdiğini öğrenmek için include_once() belgesine bakınız.
include_once() deyimi belirtilen dosyayı betiğin çalışması esnasında okur ve çalıştırır. Bu deyimin çalışma biçimi include() deyimi ile benzerdir, kendisiyle dahil edilmiş bir dosya betiğin başka bir yerinde tekrar dahil edilmek istenirse buna izin vermemesidir. Daha fazla bilgi için include() belgesine bakabilirsiniz.
include_once() deyimi, bir betiğin çalışması esnasında aynı dosyanın bir kereden fazla dahil edilme ihtimaline karşı, bu dosyanın yalnızca bir kere dahil edileceğinden emin olunmak istenirse kullanılmalıdır. Bu sayede işlev bildirimlerinin yinelenmesi, değişkenlere tekrar değer atanması gibi sorunlar ortaya çıkmaz.
Bu işlevin nasıl çalıştığı hakkında ayrıntılı bilgi edinmek için include() belgesine bakınız.
Bilginize: Büyük-küçük harf duyarlı olmayan işletim sistemlerinde (Windows gibi), require_once() ve include_once() deyimlerinin PHP 4'ten itibaren beklediğiniz sonucu üretmeyebileceğine dikkat edin.
Örnek 1 - Harf büyükyüğüne duyarsız işletim sistemlerinde include_once()
<?php
include_once("a.php"); // bu a.php dosyasını include edecektir
include_once("A.php"); // bu yine a.php dosyasını include edecektir! (yalnızca PHP 4)
?>
Bu davranış PHP 5'te değişmiştir - öncelikle yol normalleştirilir, böylece örneğin, C:\PROGRA~1\A.php ile C:\Program Files\a.php aynı kabul edilir ve dosya yalnızca bir defa işlenir.
goto işleci betik içinde başka bir komuta atlamak için kullanılabilir. Hedefin yeri, bir yafta ve ikinokta imi ile belirtilebilir. goto bu yaftaya göre hedefi bulur. Bu, goto deyiminin tamamen sınırsız olduğu anlamına gelmez. Hedef yaftasının aynı dosya ve aynı bağlam içinde kalması gerekir, yani bir işlev veya yöntemin dışına atlayamayacağınız gibi bir başka işlev veya yöntemin içine de atlayamazsınız. Ayrıca bir switch veya döngünün içine de atlayamazsınız, fakat bunların dışına atlayabilirsiniz, yani çok seviyeli bir break yerine bir goto kullanabilirsiniz.
Örnek 1 - goto örneği
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
Yukarıdaki örneğin çıktısı:
Bar
Örnek 2 - Döngüden goto ile çıkma örneği
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
Yukarıdaki örneğin çıktısı:
j hit 17
Örnek 3 - Bu çalışmaz
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
Yukarıdaki örneğin çıktısı:
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2
Bilginize: goto işleci PHP 5.3'ten beri kullanılabilmektedir.
Bir işlev, şöyle bir söz dizimi kullanılarak tanımlanabilir:
Örnek 1 - İşlev kullanımını gösteren sözde kod
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Örnek işlev.\n";
return $retval;
}
?>
Bir işlevin içerisinde geçerli her tür PHP kodu kullanılabilir, buna başka işlevler ve sınıf tanımları da dahildir.
İşlev isimleri, PHP'deki diğer isimlerle aynı kurallara tabidir. Geçerli bir işlev ismi bir harf ya da alt çizgi ile başlar, herhangi bir sayıda geçerli harf, sayı ya da alt çizgi ile devam eder. Düzenli ifade olarak, şu şekilde ifade edebiliriz: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
İşlevlerin çağrılmadan önce tanımlanmaları, aşağıdaki iki örnekte görüldüğü gibi koşullu olarak tanımlandıkları durumlar haricinde gerekmez.
Bir işlev aşağıdaki iki örnekte gösterildiği gibi koşullu olarak tanımlandıysa, bu işlev tanımının işlev çağrılmadan önce yapılması gerekmektedir.
Örnek 2 - Koşula bağlı işlevler
<?php
$makefoo = true;
/* Henüz varolmadığı için foo() buradan çağrılamaz,
ancak bar() çağrılabilir */
bar();
if ($makefoo) {
function foo()
{
echo "Uygulamanın çalışması bana erişene kadar ben yokum.\n";
}
}
/* $makefoo doğru olduğundan
artık foo() çağrılabilir */
if ($makefoo) foo();
function bar()
{
echo "Program başlatıldığı anda ben de varolurum.\n";
}
?>
Örnek 3 - İşlev içinde işlev
<?php
function foo()
{
function bar()
{
echo "foo() çağrılana kadar yokum.\n";
}
}
/* Henüz varolmadığı için
bar() çağrılamaz. */
foo();
/* Artık bar() çağrılabilir,
foo() çağrıldığında bar()
erişilebilir hale gelir */
bar();
?>
PHP'de tüm işlevler ve sınıflar betik genelinde geçerlidir - bir işlevin içinden bile tanımlanmış olsalar işlevin dışından çağrılabilirler.
PHP işlevlerin farklı değiştirgeli yeni tanımlarının yapılmasını desteklemediği gibi, işlevler yeniden tanımlanamaz veya tanımsız kılınamaz.
Bilginize: İşlev isimleri büyük-küçük harf duyarsızdır, ancak işlev isimlerini tanımlandıkları halleriyle kullanmak daha iyidir.
Değiştirge sayısı değişken işlevler desteklendiği gibi işlevlerde öntanımlı değiştirge kullanımı da desteklenmektedir. Daha ayrıntılı bilgi edinmek için func_num_args(), func_get_arg() ve func_get_args() işlevlerine de bakınız.
PHP'de işlevlerin kendilerini çağırması da mümkündür. Ancak 100-200 iç içe çağrıdan kaçınmalısınız, bu tür kullanım yığıtın dolmasına ve betiğin sonlandırılmasına sebep olabilir.
Örnek 4 - Kendini çağıran işlev
<?php
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
?>
Bir işleve veri, virgül ayraçlı ifadelerden oluşan bir değiştirge listesi ile aktarılır.
PHP, değiştirgelerin değerleriyle aktarılmalarını (öntanımlı), gönderimli aktarımı ve öntanımlı değiştirge kullanımını destekler. Değiştirge sayısı değişken işlevler de desteklenmektedir; daha ayrıntılı bilgi edinmek için func_num_args(), func_get_arg() ve func_get_args() işlevlerini de inceleyiniz.
Örnek 1 - İşlevlere dizi aktarımı
<?php
function dizi_kabul_eder($girdi)
{
echo "$girde[0] + $girdi[1] = ", $girdi[0]+$girdi[1];
}
?>
Öntanımlı olarak, işlev değiştirgeleri değerleriyle aktarılırlar (bu durumda bir değiştirgenin değeri işlev içinde değiştirildiğinde işlevin çağrıldığı yerdeki değeri bundan etkilenmez. İşlevin çağrıldığı yerdeki değerinin de değişmesini istiyorsanız gönderimli değiştirge kullanmalısınız.
Bir işleve bir değiştirgenin daima gönderimli olarak aktarılmasını istiyorsanız, işlev tanımladığınız yerde o değiştirgenin başına & karakterini koyarak bunu sağlayabilirsiniz:
Örnek 2 - Gönderimli işlev değiştirgelerinin aktarımı
<?php
function şunu_da_ekle(&$dizge)
{
$dizge .= 've bir kaç karakter eklenmiştir.';
}
$dzg = 'Bu bir dizgedir ';
şunu_da_ekle($dzg);
echo $dzg; // 'Bu bir dizgedir ve bir kaç karakter eklenmiştir.'
// çıktısını verir.
?>
Bir işlevde, sayıl değiştirgeler için C++ tarzı öntanımlı değerler aşağıdaki biçimde tanımlanabilir:
Örnek 3 - İşlev içinde öntanımlı değiştirge kullanımı
<?php
function kahveyap($hangisi = "orta şekerli")
{
return "Bir fincan $hangisi kahve yapalım.\n";
}
echo kahveyap();
echo makecoffee(null);
echo kahveyap("az şekerli");
?>
Yukarıdaki koddan alınacak çıktı:
PHP ayrıca, öntanımlı değer olarak dizilerin ve özel NULL türünün kullanımına da izin verir, örneğin:
Örnek 4 - Sayıl olmayan türlerin öntanımlı değer olarak kullanımı
<?php
function kahveyap($hangi = array("orta şekerli"), $neyde = NULL)
{
$neyde = is_null($neyde) ? "ocakta" : $neyde;
return "Bir fincan ".join(", bir fincan ", $hangi)." kahve $neyde yapıldı.\n";
}
echo kahveyap();
echo kahveyap(array("çok şekerli", "az şekerli"), "mangalda");
?>
Öntanımlı değer bir değişken, bir sınıf üyesi ya da bir işlev çağrısı değil, bir sabit ifadesi olmalıdır.
Öntanımlı değiştirgeleri kullanırken, öntanımlama yapılmış tüm değiştirgelerin öntanımlama yapılmamış tüm değiştirgelerin sağında yer almasına gerektiğine dikkat edin. Aksi takdirde işler yolunda gitmeyebilir. Aşağıdaki kod parçasını inceleyin:
Örnek 5 - Öntanımlı değiştirgelerin hatalı kullanımı
<?php
function yoğurtyap($nekadar = "az", $neli)
{
return "Bir kase $nekadar $neli yoğurt yap.\n";
}
echo yoğurtyap("çilekli"); // beklendiği gibi çalışmayacaktır
?>
Yukarıdaki örnekten alınan çıktı:
Şimdi, yukarıdakini bununla karşılaştıralım:
Örnek 6 - Öntanımlı değiştirgelerin doğru kullanımı
<?php
function yoğurtyap($nekadar= "az", $neli)
{
return "Bir kase $nekadar $neli yoğurt yap.\n";
}
echo yoğurtyap("çilekli"); // beklendiği gibi çalışır
?>
Bu örnekten alınan çıktı:
Bilginize: PHP 5'den itibaren, öntanımlı değerler gönderimli aktarılabilmektedir.
PHP 4 ve sonrasında, değiştirge sayısı değişken kullanıcı tanımlı işlevler desteklenmektedir. func_num_args(), func_get_arg() ve func_get_args() işlevleri sayesinde bu özelliği kolayca kullanabilirsiniz.
Özel bir sözdizimi gerekli değildir, değiştirge listesini işlev tanımında açıkça belirtirseniz normal davranışını gösterecektir.
Değerler, kullanımı seçime bağlı olan return deyimi kullanılarak döndürülür. Her türde değer döndürülebilir, buna diziler ve nesneler dahildir. return() kullanıldığında işlevin çalışması o noktada hemen durdurulur ve denetim işlevin çağrıldığı satıra aktarılır. Daha ayrıntılı bilgi için return() bölümüne bakınız.
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 (0, 1, 2);
}
list ($sıfır, $bir, $iki) = küçük_sayılar();
?>
Bir işlevden gönderimli bir değer döndürmek için, & işlecini hem işlev bildiriminde hem de dönen değeri bir değişkene atarken kullanmalısınız:
Örnek 3 - Bir işlevden gönderimli değer döndürmek
<?php
function &gönderimli_döndür()
{
return $gönderim;
}
$yenigönderim =& gönderimli_döndür();
?>
Gönderimler hakkında daha fazla bilgi edinmek için Gönderimler Hakkında bölümüne bakınız.
PHP değişken işlev kavramını desteklemektedir. Yani, bir değişken isminin sonuna parantez eklenmişse, PHP aynı isimde bir işlev olup olmadığına bakar ve bulduğu takdirde bu işlevi çalıştırmaya çalışır. Başka olası işlemlerin yanında, bu özellik geri çağırımların, işlev tablolarının ve benzerlerinin gerçeklenmesinde kullanılabilir.
Değişken işlevler, echo(), print(), unset(), isset(), empty(), include(), require() ve benzeri dil yapılarında çalışmayacaktır. Bu yapıları değişken işlev olarak kullanmak istediğiniz takdirde, gerekli sarmalayıcı işlevleri kendiniz yazmalısınız.
Örnek 1 - Değişken işlev örneği
<?php
function foo() {
echo "In foo()<br />\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br />\n";
}
// Bu echo için sarmalayıcı işlevdir
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // foo() çağrılır
$func = 'bar';
$func('test'); // bar() çağrılır
$func = 'echoit';
$func('test'); // echoit() çağrılır
?>
Değişken işlev özelliğini kullanarak bir nesnenin bir yöntemini de çağırabilmeniz mümkündür.
Örnek 2 - Değişken yöntem örneği
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // Bu Bar() yöntemini çağıracaktır
}
function Bar()
{
echo "Bu bir Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // Bu $foo->Variable() işlevini çağıracaktır
?>
Ayrıca bakınız: call_user_func(), değişken değişkenleri ve function_exists().
PHP standart olarak birçok işlev ve oluşum ile birlikte gelmektedir. Bunun yanında, özel PHP eklentilerinin derlenmesini gerektiren, aksi takdirde "tanımsız işlev" hatası üreten işlevler de mevcuttur. Örneğin, imagecreatetruecolor() gibi resim işlevlerini kullanabilmek için, PHP'yi GD desteğiyle derlemiş olmanız gerekir. Ya da, mysql_connect() işlevini kullanabilmek için, PHP'nin MySQL desteği ile derlenmiş olması gerekmektedir. Bunların yanında, bütün PHP sürümlerine eklenen dizge ve değişken işlevleri gibi birçok çekirdek işlev de mevcuttur. phpinfo() ya da get_loaded_extensions() işlevlerine yapılacak bir çağrı ile PHP'ye hangi eklentilerin yüklenmiş olduğunu görebilirsiniz. Birçok uzantı öntanımlı olarak etkinleştirilmiş olup PHP Kılavuzunda bu eklentilerle ilgili geniş bilgi verilmiştir. PHP'yi nasıl yapılandırmanız gerektiğiyle ilgili bilgiyi yapılandırma ve kurulum bölümleri ile eklerdeki özel bölümlerde bulabilirsiniz.
Kılavuzun işlev tanımı nasıl okunur bölümünde bir işlev tanımının nasıl okunup anlaşılabileceği ile ilgili bilgiler bulunmaktadır. Bir işlevin bir değer mi döndürdüğü yoksa aktarılan değerlerle sadece işlem mi yaptığını anlamak önemlidir. Örneğin, str_replace() değiştirilmiş dizgeyle dönerken, usort() sadece kendisine aktarılan değer üzerinde çalışır. Ayrıca, her kılavuz sayfasında her işlevin değiştirgeleri, davranış değişiklikleri, başarı ya da başarısızlık durumunda döndürülen değerler ve kullanılabilirlik bilgileri bulunmaktadır. Bu önemli (ve sıklıkla algılanması güç) farklılıkların bilinmesi, doğru PHP kodunun yazılabilmesi için büyük önem taşımaktadır.
Ayrıca bakınız: function_exists(), İşlev Başvuru Kılavuzu, get_extension_funcs() ve dl().
Anonim işlevler isim belirtmeksizin oluşturulabilen işlevlerdir. Çoğunlukla geriçağırım işlevi olarak işlev değiştirgelerinde kullanılırsa da kullanımı bununla sınırlı değildir.
Örnek 1 - Anonim işlev örneği
<?php
echo preg_replace_callback('~-([a-z])~',
function ($match) {
return strtoupper($match[1]);
},
'hello-world');
// Çıktısı: helloWorld
?>
Anonim işlevler birer değişken değeri olarak da bildirilebilir. Bu durumda PHP, işlevi özdevinimli olarak sınıfının nesnel bir örneği haline getirir. Bir anonim işlev, bir değişkene sıradan bir deyim gibi, bir noktalı virgül ile biten bir işlev olarak atanabilir:
Örnek 2 - Değişkene anonim işlev atama örneği
<?php
$greet = function($isim)
{
printf("Merhaba %s\r\n", $isim);
};
$greet('Dünya');
$greet('PHP');
?>
Anonim işlevler değişkenleri üst etki alanındın miras alabilirler. Böyle değişkenler işlevin baş tarafında bildirilebilir. Üst etki alanından miras alınan değişkenler küresel değişkenler gibi ele alınmazlar. Küresel değişkenler, işlevin çalıştığı etki alanında tanımlı değişkenlerdir. Anonim işlevin üst etki alanı ise içinde bildirildiği işlevin etki alanıdır (Anonim işlevin bildirildiği ekti alanı ile çağrıldığı etki alanı aynı olmak zorunda değildir). Aşağıdaki örneğe bakalım:
Örnek 3 - Anonim işlevler ve etki alanı
<?php
// Ürünleri eklemek üzere bir Sepet oluşturalım.
// Eklenen ürünlerin toplam fiyatını döndürmek
// üzere bir geriçağırım işlevi kullanalım.
class Sepet
{
const PRICE_BUTTER = 1.00;
const PRICE_MILK = 3.00;
const PRICE_EGGS = 6.95;
protected $ürünler = Array();
public static function ekle($ürün, $miktar)
{
$this->ürünler[$ürün] = $miktar;
}
public static function miktarıGetir($ürün)
{
return isset($this->ürünler[$ürün]) ? $this->ürünler[$ürün] : FALSE;
}
public function Toplam($kdv)
{
$toplam = 0.00;
$işlev =
function ($miktar, $ürün) use ($kdv, &$toplam)
{
$birimFiyat = constant(__CLASS__ . "::FiYAT_" .
strtoupper($ürün));
$toplam += ($birimFiyat * $miktar) * ($kdv + 1.0);
};
array_walk($this->ürünler, $işlev);
return round($toplam, 2);;
}
}
$sepetim = new Sepet;
// Sepete birşeyler ekleyelim
$sepetim->ekle('Peynir', 1);
$sepetim->ekle('Süt', 3);
$sepetim->ekle('Yumurta', 6);
// %5 KDV ile toplamı döndürelim
print $sepetim->Toplam(0.05) . "\n";
// sonuç: is 54.29
?>
Anonim işlevler dahili olarak Closure sınıfı ile gerçeklenmektedir.
Bilginize: Anonim işlevler PHP 5.3.0'dan beri kullanılabilmektedir.
Bilginize: func_num_args(), func_get_args() ve func_get_args() işlevini bir anonim işlev içinde kullanmak mümkündür.
PHP 5 yeni bir Nesne Modeli'ne sahiptir. PHP'nin nesne yönetimi tamamen yeni baştan yazılarak daha iyi başarım elde edilmesi ve daha fazla özellik sunulması sağlanmıştır. Bu PHP4'te yapılan en büyük değişikliklerden biridir. PHP5 tam bir nesne modeline sahiptir.
PHP 5 özelliklerinden bazılar3: Görünürlük, Sınıf Soyutlama, final Anahtar Sözcüğü, Sihirli Yöntemler, Nesne Arayüzleri, Nesne Kopyalama ve Tür Dayatma.
PHP'deki her nesne değişkeni nesnenin tamamının bir kopyasını değil, nesne başvurusunu içerir. Ayrıntılar için Nesneler ve Gönderimler bölümüne bakınız.
Ayrıca Kullanıcı Alanı İsimlendirme Kılavuzu belgesine de bakınız.
class Anahtar SözcüğüHer sınıf tanımı class anahtar sözcüğü ile başlar sınıf isminin ardından gelen bir çift kaşlı ayracın arasında sınıf özelliklerinin ve yöntemlerinin tanımları bulunur.
Sınıf ismi olarak herhangi bir geçerli yafta kullanılabilir ancak bu PHP için ayrılmış sözcüklerden biri olmamalıdır. Geçerli bir sınıf ısmı bir harf veya alt çizgi ile başlar, sayılar, harfler veya alt çizgiler içerebilir. Bir düzenli ifade olarak şöyle bir şablonla eşleşmelidir: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Bir sınıfın kendi sabitleri, değişkenleri (bunlara "özellik" de denir) ve işlevleri (bunlara "yöntem" de denir) olabilir.
Örnek 1 - Basit bir sınıf tanımı
<?php
class BasitSınıf
{
// özellik bildirimi
public $öntanımlı = 'öntanımlı bir değer';
// yöntem tanımı
public function ÖntanımlıyıGöster() {
echo $this->öntanımlı;
}
}
?>
Bir nesne bağlamı içinden bir yöntem çağırmak için $this diye bir sözde değişken kullanılır. $this çağrılan nesneye bir gönderimdir (normalde yöntemin ait olduğu nesnedir, ancak eğer nesne diğer nesnenin bağlamından duruk olarak çağrılıyorsa, bu başka bir nesne de olabilir).
Örnek 2 - $this sözde değişkeninin kullanımı
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this tanımlı (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this tanımsız.\n";
}
}
}
class B
{
function bar()
{
// Dikkat: E_STRICT etkinse bu satır bir uyarı
// çıktılanmasına sebep olur.
A::foo();
}
}
$a = new A();
$a->foo();
// Dikkat: E_STRICT etkinse bu satır bir uyarı çıktılanmasına sebep olur.
A::foo();
$b = new B();
$b->bar();
// Dikkat: E_STRICT etkinse bu satır bir uyarı çıktılanmasına sebep olur.
B::bar();
?>
Yukarıdaki örneğin çıktısı:
$this tanımlı (A) $this tanımsız. $this tanımlı (B) $this tanımsız.
new Anahtar SözcüğüBir sınıfın örneğini oluşturmak için yeni bir nesne oluşturulup bir değişkene atanmalıdır. Nesnenin hata durumunda daima yeni bir değişkene atanarak oluşturulması için kurucusunun bir istisna oluşturmaması gerekir. Sınıflar, örnekleme öncesi tanımlanmış olmalıdır (ve bu, bazı durumlarda bir gereksinimdir).
Örnek 3 - Bir sınıf örneğinin oluşturulması
<?php
$örnek = new BasitSınıf();
// Bu bir değişkenle de yapılabilir:
$sınıf = 'BasitSınıf';
$örnek = new $sınıf(); // BasitSınıf()
?>
Sınıf bağlamında yeni bir nesneyi new self veya new parent kullanarak oluşturmak mümkündür.
Oluşturulmuş bir sınıf örneğinin yeni bir değişkene atanması sırasında, yeni değişken, atanan nesneyle aynı örneğe erişecektir. Bu davranışın örneklerin bir işleve aktarılmasından bir farkı yoktur. Kopyalamak suretiyle oluşturulmuş bir nesnenin daima bir kopyası yapılabilir.
Örnek 4 - Nesne Atama
<?php
$atama = $örnek;
$gönderim =& $örnek;
$örnek->var = '$atama bu değere sahip olacak';
$örnek = null; // $örnek ve $gönderim null olur
var_dump($örnek);
var_dump($gönderim);
var_dump($atama);
?>
Yukarıdaki örneğin çıktısı:
NULL
NULL
object(BasitSınıf)#1 (1) {
["var"]=>
string(30) "$atama bu değere sahip olacak"
}
extends Anahtar Sözcüğü
Bir sınıfın bildiriminde extends anahtar sözcüğü
kullanılarak başka bir sınıfın yöntemleri ve özellikleri miras alınabilir.
Çok sayıda sınıfı miras alarak genişlemek mümkün değildir, bir sınıf
sadece bir ana sınıfı miras alabilir.
Miras alınan yöntemler ve özelliklerler, ebeveyn sınıfta tanımlı isimleriyle yeniden bildirilerek geçersiz kılınabilir; bu sadece ebeveyn sınıfın final tanımlı yöntemleri için yapılamaz. Geçersiz kılınmış yöntemlere ve duruk özelliklere parent:: öneki ile atıfta bulunarak erişilebilir.
Örnek 5 - Basit bir sınıfın miras alınması
<?php
class EkSınıf extends BasitSınıf
{
// ebeveyn yöntemi yeniden bildirelim
function değerGöster()
{
echo "Sınıf genişletiliyor\n";
parent::değerGöster();
}
}
$ek = new EkSınıf();
$ek->değerGöster();
?>
Yukarıdaki örneğin çıktısı:
Sınıf genişletiliyor bir öntanımlı değer
Sınıf üyesi değişkenlere "özellik" denir. Bunlara bazan "öznitelik" veya "alan" dendiğini de görürsünüz, fakat bu kılavuzun amaçları doğrultusunda biz "özellik" terimini kullanacağız. Bunlar normal değişken bildiriminin önüne public, protected, veya private anahtar sözcükleri getirilerek bildirilir. Bildirim, bir ilklendirme olarak da yapılabilir; bu durumda bir sabit değerle ilklendirme yapılmalıdır. Yani, derleme sırasında değerlendirilebilmeli, çalışma anında değerlendirilebilecek bilgiler içermemelidir.
public, protected, ve private sözcüklerinin anlamları için Görünürlük belgesine bakınız.
Bilginize: PHP 4 ile geriye uyumluluğu sağlamak için, PHP 5 özellik bildiriminde public, protected, veya private yerine (veya ek olarak) hala var sözcüğü kabul edilmektedir. Ancak, var artık gerekli değildir. PHP'nin 5.0'dan 5.1.3'e kadar olan sürümlerinde, var kullanımı önerilmeyen kullanım olarak ele alınır ve bir E_STRICT uyarısı çıktılanırdı; PHP 5.1.3'ten beri önerilmeme durumu ortadan kalkmış olup bir uyarı çıktılanmamaktadır.
Bir özelliği public, protected, veya private yerine var kullanarak bildirirseniz PHP 5 özelliği public olarak bildirilmiş gibi ele alır.
Özelliklere, sabitlere ve yöntemlere sınıf yöntemleri içinden erişilirken yöntem duruk ise self::$özellik, değilse $this- >özellik sözdizimi kullanılabilir (burada "özellik" özelliğin ismidir). Daha ayrıntılı bilgi için static Anahtar Sözcüğü bölümüne bakınız.
Yöntem bir nesne bağlamından çağrılıyorsa $this sözde değişkeni sınıf yöntemleri içinde de kullanılabilir. $this, yöntemi çağıran nesneye (yöntemin ait olduğu nesneye) bir gönderimdir. Fakat yöntem, bir ikincil nesne bağlamından duruk olarak çağrılıyorsa, bu, birincil nesne de olabilir.
Örnek 1 - Özellik bildirimi
<?php
class SimpleClass
{
// geçersiz özellik bildirimleri:
public $var1 = 'hello ' . 'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// geçerli özellik bildirimleri:
public $var6 = myConstant;
public $var7 = array(true, false);
// Buna sadece PHP 5.3.0 ve sonrasında izin verilir.
public $var8 = <<<'EOD'
hello world
EOD;
}
?>
Bilginize: Sınıflar ve nesnelerle çalışan bazı işlevler vardır. Bunlar için Sınıf ve Nesne İşlevleri bölümüne bakınız.
Yorumsuz metinler, yorumlu metinlerin tersine özellik bildirimleri dahil herhangi bir duruk veri bağlamında kullanılabilir.
Örnek 2 - Özellik ilklendirmede yorumsuz metin kullanımı
<?php
class foo {
// PHP 5.3.0'dan beri
public $bar = <<<'EOT'
bar
EOT;
}
?>
Bilginize: Yorumsuz metin desteği PHP 5.3.0'da eklenmiştir.
Sabitlerin her sınıf için ayrı ayrı tanımlanabilmesi mümkündür. Sabitler diğer değişkenlerden tanımlanmaları ve kullanılmaları sırasında başlarına getirilmeyen $ imi sayesinde ayrılırlar.
Değer, örneğin, bir değişken, bir sınıf özelliği, bir matematiksel işlemin sonucu veya bir işlev çağrısı değil, bir sabit ifade olmalıdır.
Ayrıca, sınıf arayüzlerinin de kendi sabitlerinin olması mümkündür. Örnekler için Nesne Arayüzleri belgesine bakınız.
PHP 5.3.0'dan itibaren, bir sınıfa bir değişken kullanarak atıfta bulunmak mümkündür. Değişkenin değeri, self, parent, static gibi bir anahtar sözcük olamaz.
Örnek 1 - Bir sabitin tanımlanması ve kullanımı
<?php
class MyClass
{
const constant = 'sabit değer';
function showConstant() {
echo self::constant . "\n";
}
}
echo MyClass::constant . "\n";
$classname = "MyClass";
echo $classname::constant . "\n"; // PHP 5.3.0'dan itibaren
$class = new MyClass();
$class->showConstant();
echo $class::constant."\n"; // PHP 5.3.0'dan itibaren
?>
Örnek 2 - Duruk veri örneği
<?php
class foo {
// PHP 5.3.0'dan itibaren
const bar = <<<'EOT'
bar
EOT;
}
?>
Duruk veri bağlamında yorumlanan çok satırlı metinler değil (heredoc), yorumlanmayan çok satırlı metinler (nowdoc) kullanılabilir.
Bilginize: Yorumlanmayan çok satırlı metin (nowdoc) desteği 5.3.0'da eklenmiştir.
Nesne-yönelimli uygulama yazan birçok geliştirici, her bir sınıf tanımı için ayrı bir PHP kaynak dosyası oluşturmaktadır. Bu kullanımın en can sıkıcı noktalarından bir tanesi, betiklerin en tepesinde bir sürü dosyanın betiğe dahil edilmesini gerektirmesidir (her bir sınıf için ayrı bir dosya).
PHP 5 ile birlikte bu durum zorunluluk olmaktan çıkmıştır. Henüz
tanımlanmamış bir sınıfı özdevinimli olarak çağırmak istediğinizde, bir
__autoload işlevi tanımlayabilirsiniz. Bu işlevi çağırmakla
PHP'nin çalışması hata ile sonuçlanmadan önce betik yorumlama motoruna
sınıfı yüklemek için son bir şans verilmiş olur.
Bilginize: 5.3.0 öncesinde,
__autoloadiş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.__autoloadiş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
PHP 5 geliştiricilerin sınıflar için kurucu yöntemler bildirmesine imkan verir. Bir kurucu yöntemi olan sınıflar her yeni nesne oluşturuluşunda bu yöntemi çağırırlar, bu bakımdan nesne kullanılmadan önce yapılması gereken ilklendirmeler için kurucular çok uygundur.
Bilginize: Çocuk sınıflardan kurucusu olanlar için örtük olarak ebeveyn sınıfın kurucusu çağrılmaz. Ebeveyn sınıfın kurucusunu çocuk sınıftan çağırmak için, çocuk sınıf içinden parent::__construct() çağrısı yapılması gerekir.
Örnek 1 - Yeni tekilleşmiş kurucuların kullanımı
<?php
class AnaSınıf {
function __construct() {
print "AnaSınıf kurucusundayız\n";
}
}
class AltSınıf extends AnaSınıf {
function __construct() {
parent::__construct();
print "AltSınıf kurucusundayız\n";
}
}
$obj = new AnaSınıf();
$obj = new AltSınıf();
?>
Geriye dönük uyumluluk için, PHP 5 belirtilen sınıfa ait bir __construct() yöntemi bulamazsa, sınıfın ismine bakarak eski tarz bir kurucu arayacaktır. Dolayısıyla, uyumluluk sorunu yaşayacağınız tek durum sınıf dahilinde __construct() isimli bir yöntemin amacı dışında kullanılması olabilir.
PHP 5, C++ gibi nesne yönelimli dillerdekine benzer bir yıkıcı tasarımına sahiptir. Yıkıcı yöntem, belli bir nesneye yönelik tüm gönderimler kaldırıldığı ya da nesne kapanma sırasında açıkça yok edildiği anda çalıştırılacaktır.
Örnek 2 - Yıkıcı Örneği
<?php
class YıkıcıSınıf {
function __construct() {
print "Kurucu çalıştı\n";
$this->name = "YıkıcıSınıf";
}
function __destruct() {
print "" . $this->name . " yok ediliyor\n";
}
}
$obj = new YıkıcıSınıf();
?>
Kurucularda olduğu gibi ebeveyn yıkıcılar çocuk sınıflar için dolaylı olarak çağrılmayacaktır. Ebeveyn sınıfın yıkıcısının çalışması için çocuk sınıfın yıkıcısından parent::__destruct() çağrısının yapılması gerekir.
Bilginize: Yıkıcılar, HTTP başlıklarının gönderilmiş olmasını sağlamak için betik sonlanırken çağrılırlar. Betiğin kapanma aşamasındaki çalışma dizini bazı SAPI’lerde (Apache gibi) farklı olabilir.
Bilginize: Bir yıkıcı içinden bir istisna oluşturmaya çalışmak (betiğin sonlandırılması sırasında) ölümcül hata ile sonuçlanır.
Bir özelliğin ya da bir yöntemin görünürlüğü, bildirim sırasında önüne şu
anahtar sözcüklerden biri getirilerek belirlenebilir:
public, protected ya da private.
public olarak bildirilmiş özelliklere ve yöntemlere her
yerden erişilebilir. protected bildirimli özelliklere ve
yöntemlere sadece miras alınmış ve ebeveyn sınıflardan (ve özelliğin
tanımlandığı nesneden), private bildirimli özelliklere
ve yöntemlere ise sadece özelliğin tanımlandığı sınıfın içinden
erişilebilir.
Sınıf özellikleri public, protected ya da
private olarak tanımlanmalıdır. Bir özellik bunlardan biri
olmadan sadece var kullanarak bildirilmişse
public olarak bildirilmiş gibi ele alınır.
Örnek 1 - Özellik bildirimi
<?php
/**
* Sınıfım tanımı
*/
class Sınıfım
{
public $genel = 'Genel';
protected $korumalı = 'Korumalı';
private $özel = 'Özel';
function selamVer()
{
echo $this->genel;
echo $this->korumalı;
echo $this->özel;
}
}
$nesne = new Sınıfım();
echo $nesne->genel; // Çalışır
echo $nesne->korumalı; // Ölümcül Hata
echo $nesne->özel; // Ölümcül Hata
$nesne->selamVer(); // Genel, Korumalı ve Özel görüntüler
/**
* ÖbürSınıfım tanımı
*/
class ÖbürSınıfım extends Sınıfım
{
// public ve protected yöntemleri yeniden tanımlayabiliriz,
// ancak private olanlar tanımlanamaz
protected $korumalı = 'Öbür korumalı';
function selamVer()
{
echo $this->genel;
echo $this->korumalı;
echo $this->özel;
}
}
$nesne2 = new ÖbürSınıfım();
echo $nesne2->genel; // Çalışır
echo $nesne2->özel; // Tanımsız
echo $nesne2->korumalı; // Ölümcül Hata
$nesne2->selamVer(); // Genel, Öbür korumalı ve Undefined görüntülenir
?>
Bilginize: PHP 4'te bir değişken bildiriminde (
publicyerine) kullanılan var anahtar sözcüğü uyumluluk adına hala desteklenmektedir. PHP 5'in 5.1.3 sürümünden önceki sürümlerinde var kullanımı bir E_STRICT uyarısına sebep olurdu.
Sınıf yöntemleri public, protected ya da
private olarak tanımlanmalıdır. Bunlardan herhangi biri
kullanılmadan yapılmış yöntem tanımlarının public
kullanılarak tanımlandığı varsayılır.
Örnek 2 - Yöntem bildirimi
<?php
/**
* Sınıfım tanımı
*/
class Sınıfım
{
// public kurucu bildirimi
public function __construct() { }
// public yöntem bildirimi
public function Genel() { }
// protected yöntem bildirimi
protected function Korumalı() { }
// private yöntem bildirimi
private function Özel() { }
// Bu da public bir yöntem
function Falanca()
{
$this->Genel();
$this->Korumalı();
$this->Özel();
}
}
$sınıfım = new Sınıfım;
$sınıfım->Genel(); // Çalışır
$sınıfım->Korumalı(); // Ölümcül Hata
$sınıfım->Özel(); // Ölümcül Hata
$sınıfım->Falanca(); // Public, Protected ve Private çalisir
/**
* ÖbürSınıfım tanımı
*/
class ÖbürSınıfım extends Sınıfım
{
// Bu public bir yöntemdir
function Filanca()
{
$this->Genel();
$this->Korumalı();
$this->Özel(); // Ölümcül Hata
}
}
$öbürSınıfım = new Sınıfım;
$öbürSınıfım->Genel(); // Çalışır
$öbürSınıfım->Filanca(); // Genel ve Korumalı çalışır, Özel çalışmaz
class Bar
{
public function dnm() {
$this->dnmÖzel();
$this->dnmGenel();
}
public function dnmGenel() {
echo "Bar::dnmGenel\n";
}
private function dnmÖzel() {
echo "Bar::dnmÖzel\n";
}
}
class Foo extends Bar
{
public function dnmGenel() {
echo "Foo::dnmGenel\n";
}
private function dnmÖzel() {
echo "Foo::dnmÖzel\n";
}
}
$fo = new Foo();
$fo->dnm(); // Bar::dnmÖzel
// Foo::dnmGenel
?>
Inheritance is a well-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.
Örnek 1 Inheritance Example
<?php
class foo
{
public function printItem($string)
{
echo 'Foo: ' . $string . PHP_EOL;
}
public function printPHP()
{
echo 'PHP is great.' . PHP_EOL;
}
}
class bar extends foo
{
public function printItem($string)
{
echo 'Bar: ' . $string . PHP_EOL;
}
}
$foo = new foo();
$bar = new bar();
$foo->printItem('baz'); // Output: 'Foo: baz'
$foo->printPHP(); // Output: 'PHP is great'
$bar->printItem('baz'); // Output: 'Bar: baz'
$bar->printPHP(); // Output: 'PHP is great'
?>
Etki Alanı Çözünürlük İşleci (Paamayim Nekudotayim de denirmiş), basitçe bir çift iki nokta iminden ibaret olup (biz "iki nokta çifti" diyebiliriz), bir sınıfın duruk, sabit ve geçersiz kılınmış özellik ve yöntemlerine erişilebilmesini sağlayan bir simgedir.
Bu öğelere sınıf tanımının dışından erişirken bu işlecin solunda sınıfın ismini kullanın.
PHP 5.3.0 ve sonrasında, bu işlecin solunda sınıf ismi yerine bir değişken kullanmak da mümkündür. Değişken ismi, (self, parent, static gibi) bir anahtar sözcük olmamalıdır.
"Paamayim Nekudotayim" ilk bakışta iki nokta üst üste için garip bir adlandırma gibi gözükebilir. Ancak, Zend Engine 0.5 (php 3'ün kalbidir) yazıldığı esnada Zend ekibinin kullanmak istediği terim bu oldu. Esasında bu iki sözcük de iki nokta çifti anlamına gelmektedir - İbranice'de!
Örnek 1 - Sınıf tanımı dışında ::
<?php
class Sınıfım {
const SABİT_DEĞER = 'Bir sabit değer';
}
echo Sınıfım::SABİT_DEĞER;
?>
Bir sınıfın özellik ve yöntemlerine bu işleç sayesinde sınıfın içinden erişilmek istendiğinde işlecin solunda self veya parent anahtar sözcüğü kullanılır.
Örnek 2 - Sınıf tanımı içinde ::
<?php
class BaşkaSınıf extends Sınıfım
{
public static $duruk = 'Bir duruk değişken';
public static function ikiNoktaÇifti() {
echo parent::SABİT_DEĞER . "\n";
echo self::$duruk . "\n";
}
}
$sınıfadı = 'BaşkaSınıf';
echo $sınıfadı::ikiNoktaÇifti(); // PHP 5.3.0 ve sonrası
BaşkaSınıf::ikiNoktaÇifti();
?>
Çocuk sınıf ebeveyninin yöntem tanımlarından birini geçersiz kıldığı takdirde PHP ebeveyne ait yöntemi çağıramayacaktır. Ebeveynin yönteminin çağrılıp çağrılmayacağı çocuk sınıfın inisiyatifindedir. Bu durum aynı zamanda Kurucular ve Yıkıcılar, Aşırı Yükleme ve Sihirli yöntem tanımları için de geçerlidir.
Örnek 3 - Ebeveynin yöntemini çağırmak
<?php
class Sınıfım
{
protected function işlevim() {
echo "Sınıfım::işlevim()\n";
}
}
class BaşkaSınıf extends Sınıfım
{
// Ebeveynin tanımını geçersiz kılalım
public function işlevim()
{
// Ama hala ebeveynin işlevini çağırabiliriz
parent::işlevim();
echo "BaşkaSınıf::işlevim()\n";
}
}
$class = new BaşkaSınıf();
$class->işlevim();
?>
static Anahtar Sözcüğü
Sınıf özelliklerinin ya da yöntemlerinin static olarak
tanımlanması, o özelliklerin ve yöntemlerin sınıf örneğinin oluşturulmasına
gerek kalmadan erişilebilir olmalarını sağlar. Ancak, static
olarak bildirilmiş bir özelliğe (duruk özellik) örneklenmiş sınıf
nesnesinden erişilemez (ise de static olarak bildirilmiş bir
yöntemle erişebilir).
PHP 4 ile uyumluluğun sağlanabilmesi için, eğer bir özellik veya yöntem için hiçbir görünürlük tanımı yapılmamışsa public olarak tanımlanmış varsayılır.
Duruk yöntemlerin, nesnenin bir örneği oluşturulmadan erişilebilir
olmalarından dolayı, $this sözde değişkeni,
static olarak bildirilmiş bir yöntemin içinde kullanılamaz.
Duruk özelliklere, nesne üzerinden ok işleci (->) kullanılarak erişilemez.
Duruk olmayan özellikler durukmuş gibi çağrılırsa E_STRICT seviyesinde bir uyarı üretilir.
PHP'nin diğer duruk değişkenlerinde olduğu gibi duruk özellikler de sadece bir sayıl veya sabit kullanılarak ilklendirilebilir; ifadelere izin verilmez. Yani, bir duruk özelliği örneğin, bir tamsayı veya bir dizi ile ilklendirebilirsiniz ama örneğin, bir işlevin dönen değeri, bir değişken veya bir nesne ile ilklendiremezsiniz.
PHP 5.3.0 ve sonrasında, bir sınıfa bir değişken kullanarak gönderim yapılabilmektedir. Böyle bir değişkenin değeri self, parent veya static gibi bir anahtar sözcük olamaz.
Örnek 1 - Duruk özellik örneği
<?php
class Falanca
{
public static $duruk = 'falanca';
public function durukDeğer() {
return self::$duruk;
}
}
class Feşmekan extends Falanca
{
public function falancaDuruk() {
return parent::$duruk;
}
}
print Falanca::$duruk . "\n";
$falanca = new Falanca();
print $falanca->durukDeğer() . "\n";
print $falanca->duruk . "\n"; // Tanımsız "Özellik" duruk
print $falanca::$duruk . "\n";
$sınıfadı = 'Falanca';
print $sınıfadı::$duruk . "\n"; // PHP 5.3.0 ve sonrası
print Feşmekan::$duruk . "\n";
$feşmekan = new Feşmekan();
print $feşmekan->falancaDuruk() . "\n";
?>
Örnek 2 - Duruk yöntem örneği
<?php
class Falanca {
public static function birDurukYöntem() {
// ...
}
}
Falanca::birDurukYöntem();
$sınıfadı = 'Falanca';
$sınıfadı::birDurukYöntem(); // PHP 5.3.0 ve sonrası
?>
PHP 5, soyut sınıf ve yöntemlerin kullanımını mümkün kılmıştır. Soyut olarak tanımlanmış bir sınıftan örnek oluşturmaya izin verilmemektedir. Bir sınıf en az bir soyut yöntem içeriyorsa, o sınıf da soyut olarak tanımlanmalıdır. Soyut olarak tanımlanmış yöntemler o yöntemlerin imzasıdırlar, gerçeklemenin bütününü temsil edemezler.
Soyut bir sınıftan kalıtsal özellikler devralınırken, ebeveyn sınıf
bildiriminde soyut olarak bildirilmiş tüm yöntemlerin çocuk sınıf
tarafından da tanımlanması gerekir. Ek olarak, bu yöntemlerin aynı (ya da
daha az sınırlı) görünürlükle tanımlanması gerekir. Örneğin, soyut yöntem
protected olarak tanımlanmışsa, işlev gerçeklenimi
private değil, protected ya da
public olarak tanımlanmalıdır.
Örnek 1 - Soyut sınıf örneği
<?php
abstract class SoyutSınıf
{
// Genişletilen sınıfı bu yöntemi tanımlamaya zorla
abstract protected function değeriAl();
abstract protected function önekDeğeri($önek);
// Ortak yöntem
public function yazdır() {
print $this->değeriAl() . "\n";
}
}
class SomutSınıf1 extends SoyutSınıf
{
protected function değeriAl() {
return "SomutSınıf1";
}
public function önekDeğeri($önek) {
return "{$önek}SomutSınıf1";
}
}
class SomutSınıf2 extends SoyutSınıf
{
public function değeriAl() {
return "SomutSınıf2";
}
public function önekDeğeri($önek) {
return "{$önek}SomutSınıf2";
}
}
$class1 = new SomutSınıf1;
$class1->yazdır();
echo $class1->önekDeğeri('FOO_') ."\n";
$class2 = new SomutSınıf2;
$class2->yazdır();
echo $class2->önekDeğeri('FOO_') ."\n";
?>
Yukarıdaki örneğin çıktısı:
SomutSınıf1 FOO_SomutSınıf1 SomutSınıf2 FOO_SomutSınıf2
Kullanıcı tanımlı sınıfları veya 'abstract' isimli işlevleri olmayan eski kodun bir değişikliğe gerek duyulmadan çalışabilmesi gerekir.
Nesne arayüzleri, bir sınıfın gerçeklemesi gereken yöntemlerin belirtildiği kodu, bu yöntemlerin nasıl yönetileceğini tanımlamaksızın oluşturmanıza imkan sağlar.
Arayüzler, standart sınıflardan farklı olarak hiçbir yöntemin içeriği tanımlanmaksızın interface anahtar sözcüğü kullanılarak tanımlanırlar.
Bir arayüzdeki tüm yöntemler, arayüzün doğası gereği public
olarak bildirilmelidir.
implements işleciBir arayüzü gerçeklemek için, implements işleci kullanılır. Arayüzdeki tüm yöntemler bir sınıf içersinde gerçeklenmelidir; aksi takdirde bir ölümcül hata alırsınız. Bir sınıfın, birden fazla arayüz tanımlaması arayüzler virgülle ayrılarak sağlanabilir.
Bilginize: Belirsizliğe yol açacağından, bir sınıf aynı işlev isimlerine sahip iki arayüz gerçekleyemez.
Bilginize: Arayüzler, sınıflar gibi extends işleciyle genişletilebilir.
Bilginize: Bir arayüzü tanımlayan bir sınıf, bunu arayüzde tanımlı yöntemleri kullanarak yapmalıdır, yoksa işlem ölümcül hata ile sonuçlanır.
Arayüzlerin sabitlerinin olması mümkündür. Arayüz sabitleri tıpkı sınıf sabitleri gibi çalışırlar. Kendilerini miras alan sınıflar veya arayüzler tarafından geçersiz kılınamazlar.
Örnek 1 - Arayüz örneği
<?php
// 'iTemplate' arayüzünü tanımlayalım
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Arayüzü gerçekleyelim
// Bu çalışacaktır
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// Bu çalışmayacaktır
// Ölümcül hata: BadTemplate sınıfı 1 soyut yöntem içermektedir
// dolayısıyla soyut olarak tanımlanması gerekir (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Örnek 2 - Genişletilebilir Arayüzler
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// Bu çalışır
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// Bu çalışmaz, ölümcül hatayla sonuçlanır
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
Örnek 3 - Çok sayıda anayüz oluşturma
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
Örnek 4 - Arayüzler ve sabitleri
<?php
interface a
{
const b = 'Arayüz sabiti';
}
// Şunu basar: Arayüz sabiti
echo a::b;
// Sabitler geçersiz kılınamayacağından bu çalışmaz.
// Sınıf sabitleri için de bu böyledir.
class b implements a
{
const b = 'Sınıf sabiti';
}
?>
Bir arayüz tür dayatarak belli bir nesnenin belli yöntemleri içermesini sağlayabilir. Ayrıca bakınız: instanceof işleci ve Tür Dayatma.
PHP'deki aşırı yükleme, bir sınıfın özelliklerini ve yöntemlerini devingen olarak "oluşturmak" anlamına gelmektedir. Bu devingen öğeler, çeşitli eylem türleri için sınıf içinde oluşturulabilen sihirli yöntemler üzerinden işleme sokulurlar.
Aşırı yükleme yöntemleri, henüz bildirilmemiş veya geçerli etki alanında görünür olmayan özellik ve yöntemlerle etkileşilmek istendiğinde çağrılırlar. Bu bölümün kalanında bu bildirim ve görünürlükle ilgili durumdan bahsederken "erişilemeyen özellikler" ve "erişilemeyen yöntemler" terimlerini kullanacağız.
Tüm aşırı yükleme yöntemlerinin public olarak tanımlanması gerekir.
Bu sihirli yöntemlerin değiştirgelerinin hiçbiri gönderimli olarak aktarılamaz.
Bilginize: PHP'nin "aşırı yükleme" konusundaki yorumu çoğu nesne yönelimli dilden farklıdır. Aşırı yükleme geleneksel olarak, dile, farklı miktar ve türde değiştirgeye sahip aynı isimde çok sayıda yönteme sahip olabilme yeteneği sağlar.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | __callStatic()() eklendi. Genel etki alanında görünürlüğü ve devingen bildirimini zorunlu kılacak uyarı eklendi. |
| 5.1.0 | __isset()() ve __unset()() eklendi. |
__set()() erişilemeyen özelliklere veri yazarken çalıştırılır.
__get()() erişilemeyen özelliklerden veri okurken devreye sokulur.
__isset()() erişilemeyen özellikler için isset() veya empty() çağrıldığında tetiklenir.
__unset()() erişilemeyen özellikler için unset() kullanıldığında çağrılır.
$isim değiştirgesi etkileşime girilecek özelliğin ismidir. __set()() yönteminin $değer değiştirgesi, $isim adlı özelliğe atanacak değeri belirler.
Özellikler üzerindeki aşırı yükleme sadece nesne bağlamında çalışır. Bu sihirli yöntemler duruk bağlamda tetiklenmeyecektir. Bu bakımdan, bu yöntemler static bildirilemez.
Bilginize: PHP'nin atama işlecini ele alış yöhteminden dolayı __set() işlevinin dönüş değeri yoksayılır. Benzer şekilde,
örneğindeki gibi zincirleme atamalarda __get() get asla çağrılmaz.$a = $obj->b = 8;
Örnek 1 - __get(), __set(), __isset() ve __unset() ile aşırı yükleme örneği
<?php
class ÖzellikSınama {
/* Aşırı yüklemeye konu veriler burada. */
private $veri = array();
/* Bildirilmiş özellikler için aşırı yükleme kullanılmaz. */
public $bildirilmiş = 1;
/* Aşırı yükleme sadece sınıf dışından erişilemeyen özellikler içindir.
*/
private $gizli = 2;
public function __set($isim, $değer) {
echo "'$isim' adlı özelliğe '$değer' atanıyor.\n";
$this->veri[$isim] = $değer;
}
public function __get($isim) {
echo "'$isim' adlı özelliğin değeri isteniyor\n";
if (array_key_exists($isim, $this->veri)) {
return $this->veri[$isim];
}
$trace = debug_backtrace();
trigger_error(
$trace[0]['file'] . ' dosyasının ' .
$trace[0]['line'] . '. satırında ' .
'__get() ile tanımsız özellik istendi: ' . $isim,
E_USER_NOTICE);
return null;
}
/** PHP 5.1.0'dan itibaren */
public function __isset($isim) {
echo "'$isim' atanmış mı?\n";
return isset($this->veri[$isim]);
}
/** PHP 5.1.0'dan itibaren */
public function __unset($isim) {
echo "'$name' siliniyor\n";
unset($this->veri[$isim]);
}
/** Sihirli bir yöntem değil; sadece örnek olsun diye. */
public function gizliyiOku() {
return $this->gizli;
}
}
echo "<pre>\n";
$obj = new ÖzellikSınama;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->bildirilmiş . "\n\n";
echo "'gizli' isimli 'private' özellik ile bir deneme yapalım:\n";
echo "'private' özellikler sadece sınıf içinde görünürdürler,\n";
echo "bu yüzden __get() kullanılmaz...\n";
echo $obj->gizliyiOku() . "\n";
echo "'private' özellikler sınıf dışında görünür değildirler,\n";
echo "dolayısıyla __get() kullanılır...\n";
echo $obj->gizli . "\n";
?>
Yukarıdaki örneğin çıktısı:
'a' adlı özelliğe '1' atanıyor. 'a' adlı özelliğin değeri isteniyor 1 'a' atanmış mı? bool(true) '' siliniyor 'a' atanmış mı? bool(false) 1 'gizli' isimli 'private' özellik ile bir deneme yapalım: 'private' özellikler sadece sınıf içinde görünürdürler, bu yüzden __get() kullanılmaz... 2 'private' özellikler sınıf dışında görünür değildirler, dolayısıyla __get() kullanılır... 'gizli' adlı özelliğin değeri isteniyor Notice: <dosya> dosyasının 71. satırında __get() ile tanımsız özellik istendi: gizli
__call()(), erişilemeyen yöntemler bir nesne bağlamından çağrıldığında tetiklenir.
__callStatic()(), erişilemeyen yöntemler duruk bir bağlamdan çağrıldığında tetiklenir.
$isim değiştirgesi çağrılan yöntemin ismidir. $değiştirgeler değiştirgesi ise $isim adlı yönteme aktarılan değiştirgeleri içeren numararalı bir dizidir.
Örnek 2 - __call() ve __callStatic() ile aşırı yüklü örneklenmiş yöntemler
<?php
class YöntemSınama {
public function __call($isim, $değiştirgeler) {
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
echo "Nesnenin '$isim' yöntemi çağrılıyor: "
. implode(', ', $değiştirgeler). "\n";
}
/** PHP 5.3.0 ve sonrası */
public static function __callStatic($isim, $değiştirgeler) {
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
echo "Duruk yöntem '$isim' çağrılıyor: "
. implode(', ', $değiştirgeler). "\n";
}
}
$obj = new YöntemSınama;
$obj->deneBakalım('nesne bağlamında');
YöntemSınama::deneBakalım('duruk bağlamda'); // PHP 5.3.0 ve sonrası
?>
Yukarıdaki örneğin çıktısı:
Nesnenin 'deneBakalım' yöntemi çağrılıyor: nesne bağlamında Duruk yöntem 'deneBakalım' çağrılıyor: duruk bağlamda
PHP 5 ile tanımlanan nesneler, foreach gibi bir deyim kullanılarak bir öğe listesi üzerinden yinelenebilirler. Öntanımlı olarak, tüm görünür özellikler yineleme için kullanılacaktır.
Örnek 1 - Basit Nesne Yineleme
<?php
class MyClass
{
public $var1 = 'değer 1';
public $var2 = 'değer 2';
public $var3 = 'değer 3';
protected $protected = 'protected var';
private $private = 'private var';
function iterateVisible() {
echo "MyClass::iterateVisible:\n";
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}
$class = new MyClass();
foreach($class as $key => $value) {
print "$key => $value\n";
}
echo "\n";
$class->iterateVisible();
?>
Yukarıdaki örneğin çıktısı:
var1 => değer 1 var2 => değer 2 var3 => değer 3 MyClass::iterateVisible: var1 => değer 1 var2 => değer 2 var3 => değer 3 protected => protected var private => private var
Çıktıdan görüleceği gibi, foreach erişilebilir olan tüm görünür değişkenleri yineledi. Bir adım öteye giderek, PHP'nin yerleşik arayüzlerinden biri olan Iterator'ü gerçekleyebilirsiniz. Iterator kullanılarak, hangi nesnenin nasıl yineleneceğine bir nesnenin karar verebilmesi mümkündür.
Örnek 2 - Iterator kullanılarak Nesne Yineleme
<?php
class MyIterator implements Iterator
{
private $var = array();
public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}
public function rewind() {
echo "başa al\n";
reset($this->var);
}
public function current() {
$var = current($this->var);
echo "mevcut: $var\n";
return $var;
}
public function key() {
$var = key($this->var);
echo "anahtar: $var\n";
return $var;
}
public function next() {
$var = next($this->var);
echo "sonraki: $var\n";
return $var;
}
public function valid() {
$var = $this->current() !== false;
echo "geçerli: {$var}\n";
return $var;
}
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $a => $b) {
print "$a: $b\n";
}
?>
Yukarıdaki örneğin çıktısı:
başa al mevcut: 1 geçerli: 1 mevcut: 1 anahtar: 0 0: 1 sonraki: 2 mevcut: 2 geçerli: 1 mevcut: 2 anahtar: 1 1: 2 sonraki: 3 mevcut: 3 geçerli: 1 mevcut: 3 anahtar: 2 2: 3 sonraki: mevcut: geçerli:
Ayrıca, kendi sınıfınızı, Iterator işlevlerinin tümünü her defasında yeniden tanımlamadan, PHP 5 ile birlikte gelen IteratorAggregate arayüzünü gerçekleyerek tanımlayabilirsiniz.
Örnek 3 - IteratorAggregate ile Nesne Yineleme
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;
// IteratorAggregate için gerekli arayüz tanımı
public function getIterator() {
return new MyIterator($this->items);
}
public function add($value) {
$this->items[$this->count++] = $value;
}
}
$coll = new MyCollection();
$coll->add('değer 1');
$coll->add('değer 2');
$coll->add('değer 3');
foreach ($coll as $key => $val) {
echo "key/value: [$key -> $val]\n\n";
}
?>
Yukarıdaki örneğin çıktısı:
başa al mevcut: değer 1 geçerli: 1 mevcut: değer 1 anahtar: 0 anahtar/değer: [0 -> değer 1] sonraki: değer 2 mevcut: değer 2 geçerli: 1 mevcut: değer 2 anahtar: 1 anahtar/değer: [1 -> değer 2] sonraki: değer 3 mevcut: değer 3 geçerli: 1 mevcut: değer 3 anahtar: 2 anahtar/değer: [2 -> değer 3] sonraki: mevcut: geçerli:
Bilginize: Yineleyiciler ile ilgili daha fazla örnek için, Iterators bölümüne bakınız.
Hazır yöntemler, en iyi uygulamaları ve doğru tasarımları açıklamanın bir yoludur. Hazır yöntemler genel programlama sorunlarına esnek bir çözüm getirir.
Üreteç yöntemi, nesnelerin çalışma anında örneklenmesini sağlar. Böyle adlandırılmasının sebebi, nesnenin "üretiminden" sorumlu olmasıdır. Üreteç yöntemi değiştirge olarak sınıf ismini alır ve onunla nesneyi oluşturur.
Örnek 1 Değiştirgeli Üreteç Yöntemi
<?php
class Örnek
{
// Değiştirgeli üreteç yöntemi
public static function üret($tür)
{
if (include_once 'Drivers/' . $tür . '.php') {
$sınıfadı = 'Driver_' . $tür;
return new $sınıfadı;
} else {
throw new Exception ('Sürücü bulunamadı');
}
}
}
?>
Bu yöntemi bir sınıf içinde tanımlarsanız sürücülerin çalışma anında yüklenmesini sağlayabilirsiniz. Örnek sınıfı bir veritabanı soyutlama sınıfı olsaydı, MySQL ve SQLite sürücülerinin yüklenmesi işlemi aşağıdaki gibi yapılabilirdi:
<?php
// MySQL sürücüsünü yükle
$mysql = Örnek::üret('MySQL');
// SQLite sürücüsünü yükle
$sqlite = Örnek::üret('SQLite');
?>
Tek örnek yöntemi, bir sınıfın tek bir örneğine ihtiyaç duyuldugu durumlarda tanımlanır. Bu duruma en genel örnek, veritabanı bağlantısıdır. Tek örnek yöntemi gerçeklenerek, tek bir nesne örneğinin başka birçok nesne tarafından erişilebilir olması sağlanabilir.
Örnek 2 - Tek Örnek İşlevi
<?php
class Örnek
{
// Sınıf örneğini bu değişkende saklayacağız
private static $nesneÖrneği;
// Private tanımlı bir kurucu,
// nesnenin doğrudan oluşturulmasını engeller
private function __construct()
{
echo 'Ben hazırım, ';
}
// Tek örnek yöntemi
public static function tekÖrnek()
{
if (!isset(self::$nesneÖrneği)) {
$c = __CLASS__;
self::$nesneÖrneği = new $c;
}
return self::$nesneÖrneği;
}
// Başka bir yöntem
public function bak()
{
echo 'bak!';
}
// Kullanıcıların örneği kopyalamasını engelle
public function __clone()
{
trigger_error('Nesnenin kopyalanmasına izin verilmez.', E_USER_ERROR);
}
}
?>
Yukarıdaki örnek Örnek sınıfının sadece tek bir örneğinin alınmasına izin verir.
<?php
// Bu işlem başarısız olur çünkü kurucu private tanımlı
$deneme = new Örnek;
// Bununla sınıfın daima tek örneği alınabilir
$deneme = Örnek::tekÖrnek();
$deneme->bak();
// Bu bir E_USER_ERROR iletisi oluşturur.
$deneme_kopyası = clone($deneme);
?>
__construct, __destruct, (bak: Kurucular ve Yıkıcılar), __call, __callStatic, __get, __set, __isset, __unset, (bak: Aşırı yükleme), __sleep, __wakeup, __toString, __invoke, __set_state ve __clone işlev isimleri PHP sınıflarında sihirli işlemler yaparlar. İşlevlerinize sihirli bir işlevsellik kazandırmak istemedikçe bu isimleri sınıfınızın içinde işlev ismi olarak kullanamazsınız.
PHP, __ ile baslayan tüm işlev isimlerini sihirli işlevlere ayırmıştır. Belgelenmiş bir kaç sihirli işlevsellik dışında __ ile başlayan işlev isimleri kullanmamanızı öneririz.
__sleep ve __wakeupserialize() işlevi, sınıfınızın __sleep adında sihirli bir işleve sahip olup olmadığına bakar. Böyle bir işlev varsa herhangi bir serileştirme işleminden önce bu işlev çalıştırılır. Bu işlev ile nesne üzerinde temizlik yapabilir ve serileştirilmesi gereken nesnenin tüm değişken isimlerinin bir dizi halinde döndürülmesini sağlayabilirsiniz. Eğer işlev hiçbir şey döndürmemişse NULL serileştirilir ve bir E_NOTICE çıktılanır.
__sleep işlevinin asıl kullanım amacı askıdaki veriyi göndermek gibi temizliğe benzer işlemler yapmaktır. Ayrıca, tümüyle kaydedilmesi gerekmeyen büyük veri parçaları sözkonusu olduğunda da bu işlevden yararlanabilirsiniz.
unserialize() işlevi tersine bir işlem yaparak __wakeup adında bir sihirli işlevin varlığını araştırır. Böyle bir işlev varsa, bu işlev nesnenin sahip olduğu tüm özkaynakları yeniden oluşturabilir.
__wakeup işlevinin asıl kullanım amacı, serileştirme sırasında kaybedilebilen veritabanı bağlantılarını yeniden oluşturmak ve diğer ilklendirme işlemlerini yeniden yapmaktır.
Örnek 1 - Uyutma ve uyandırma
<?php
class Bağlantı {
protected $hat;
private $sunucu, $kullanıcı, $parola, $db;
public function __construct($sunucu, $kullanıcı, $parola, $db)
{
$this->sunucu = $sunucu;
$this->kullanıcı = $kullanıcı;
$this->parola = $parola;
$this->db = $db;
$this->connect();
}
private function bağlan()
{
$this->hat = mysql_connect($this->sunucu, $this->kullanıcı, $this->parola);
mysql_select_db($this->db, $this->hat);
}
public function __sleep()
{
mysql_close($this->hat);
}
public function __wakeup()
{
$this->bağlan();
}
}
?>
__toString__toString yöntemi, sınıf bir dizgeye dönüştürüldüğünde sınıfın nasıl tepki vereceğine karar vermeyi sağlar.
Örnek 2 - Basit bir örnek
<?php
// Basit bir sınıf tanımlayalım
class TestClass
{
public $foo;
public function __construct($foo) {
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Merhaba');
echo $class;
?>
Yukarıdaki örneğin çıktısı:
Merhaba
PHP 5.2.0'dan önce __toString yönteminin, doğrudan echo() ya da print() işlevleri ile birlikte çağrılmadıkça bir önemi yoktu. PHP 5.2.0'dan beri sadece dizge bağlamlarında (%s değiştiricili printf() gibi) çağrılabilmekte, diğer bağlamlarda (%d değiştiricili printf() gibi) çağrılamamaktadır. PHP 5.2.0'dan beri nesneleri __toString yöntemi olmaksızın dizgeye dönüştürme işlemi E_RECOVERABLE_ERROR hatasına yol açmaktadır.
__invoke yöntemi, bir betik bir nesneyi bir işlev olarak çağırmaya çalışırsa çağrılır.
Bilginize: Bu özellik PHP 5.3.0'dan beri mevcuttur.
Örnek 3 - __invoke kullanımı
<?php
class CallableClass {
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
Yukarıdaki örneğin çıktısı:
int(5) bool(true)
__set_stateBu duruk yöntem, PHP 5.1.0 sürümünden beri var_export() tarafından ihraç edilen sınıflar için çağrılmaktadır.
Bu yöntemin tek değiştirgesi array('özellik' => değer, ...) biçeminde ihraç edilen özellikleri içeren bir dizidir.
Örnek 4 - __set_state kullanımı (PHP 5.1.0 ve sonrası)
<?php
class A
{
public $var1;
public $var2;
public static function __set_state($bir_dizi) // PHP 5.1.0'dan beri
{
$obj = new A;
$obj->var1 = $bir_dizi['var1'];
$obj->var2 = $bir_dizi['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
?>
Yukarıdaki örneğin çıktısı:
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
final Anahtar Sözcüğü
PHP 5 ile birlikte gelen diğer bir yenilik final anahtar
sözcüğüdür. Bu anahtar sözcükle tanımlanmış bir yöntemi çocuk sınıflar
geçersiz kılamazlar. Eğer bir sınıf kendini final sözcüğüyle
tanımlamışsa o sınıf genişletilemez.
Örnek 1 - final yöntem örneği
<?php
class AnaSınıf {
public function deneme() {
echo "AnaSınıf::deneme() çağrıldı\n";
}
final public function başkaDeneme() {
echo "AnaSınıf::başkaDeneme() çağrıldı\n";
}
}
class ÇocukSınıf extends AnaSınıf {
public function başkaDeneme() {
echo "ÇocukSınıf::başkaDeneme() çağrıldı\n";
}
}
// Ölümcül hata ile sonuçlanır: AnaSınıf:başkaDeneme() final yöntemi
// ÇocukSınıf::başkaDeneme() yöntemiyle geçersiz kılınamaz
?>
Örnek 2 - final sınıf örneği
<?php
final class AnaSınıf {
public function deneme() {
echo "AnaSınıf::deneme() çağrıldı\n";
}
// Burada işlevi final olarak belirtmenin bir önemi yoktur
final public function başkaDeneme() {
echo "AnaSınıf::başkaDeneme() çağrıldı\n";
}
}
class ÇocukSınıf extends AnaSınıf {
}
// Ölümcül hata ile sonuçlanır: ÇocukSınıf final bir sınıf
// olan AnaSınıf'ın çocuğu olarak oluşturulamaz
?>
Bilginize: Özellikler
finalolarak bildirilemez, sadece sınıflar ve yöntemlerfinalolarak bildirilebilir.
Bir nesnenin tüm özelliklerinin aynen kopyalanarak çoğaltılması her zaman istenilen durum değildir. Kurucuların kopyalanması iyi bir örnektir, bir GTK penceresini temsil eden bir nesneniz varsa ve bu nesne GTK penceresine ait özkaynağı tutuyorsa, bu nesnenin kopyasını oluşturduğunuzda, yeni nesnenin önceki pencere ile aynı özelliklere sahip yeni bir pencereye sahip olmasını ve önceki nesne ile aynı şekilde pencereye ait özkaynağı tutuyor olmasını isteyebilirsiniz. Bir diğer örnek, nesneniz kullandığı başka bir nesneye ait bir gönderim tutuyorsa, ebeveyn nesne kopyalandığında diğer nesnenin de yeni bir örneğinin oluşturulmasını isteyebilirsiniz, yani ebeveynin kopyasının kendine ait ayrı bir kopyası olur.
Bir nesnenin kopyası (mümkünse nesnenin __clone() yöntemini
çağıran) clone anahtar sözcüğü kullanılarak oluşturulur. Bir
nesnenin __clone() yöntemi doğrudan doğruya çağrılamaz.
$nesnenin_kopyası = clone $object;
Bir nesne kopyalandığında, PHP 5 nesnenin tüm özelliklerinin yüzeysel bir kopyasını çıkartacaktır. Diğer değişkenlere birer gönderim olan tüm özellikler gönderim olarak kalacaktır.
Kopyalama tamamlanır tamamlanmaz, bir __clone() yöntemi
tanımlanmışsa, değişmesi gereken lüzumlu tüm özelliklere izin vermek için
yeni oluşturulan nesnenin __clone() yöntemi çağrılacaktır.
Örnek 1 - Bir nesnenin kopyalanması
<?php
class AltNesne
{
static $örnek_sayısı = 0;
public $örnek;
public function __construct() {
$this->örnek = ++self::$örnek_sayısı;
}
public function __clone() {
$this->örnek = ++self::$örnek_sayısı;
}
}
class KopyalanabilirNesnem
{
public $nesne1;
public $nesne2;
function __clone()
{
// this->nesne1'in bir kopyasını oluşturmak için
// zorlayalım, yoksa aynı nesneyi gösterecek.
$this->nesne1 = clone $this->nesne1;
}
}
$nes = new KopyalanabilirNesnem();
$nes->nesne1 = new AltNesne();
$nes->nesne2 = new AltNesne();
$nes2 = clone $nes;
print("Özgün Nesne:\n");
print_r($nes);
print("Kopya Nesne:\n");
print_r($nes2);
?>
Yukarıdaki örneğin çıktısı:
Özgün Nesne:
KopyalanabilirNesnem Object
(
[nesne1] => AltNesne Object
(
[örnek] => 1
)
[nesne2] => AltNesne Object
(
[örnek] => 2
)
)
Kopya Nesne:
KopyalanabilirNesnem Object
(
[nesne1] => AltNesne Object
(
[örnek] => 3
)
[nesne2] => AltNesne Object
(
[örnek] => 2
)
)
Nesne karşılaştırma, PHP 5'te PHP 4'e nazaran daha karmaşıktır. PHP 5, bir Nesne Yönelimli Dil'den beklenenleri daha iyi karşılar (ancak, PHP 5 böyle bir dildir, demiyoruz).
Eşitlik işleci (==) kullanıldığında, nesne değişkenleri basit bir mantıkla karşılaştırılır: İki nesne örneği aynı özniteliklere ve aynı değerlere sahipse ve ikisi de aynı sınıf tarafından oluşturulmuşsa bu iki nesne örneği birbirine eşittir.
Öte yandan, aynılık işleci (===) kullanıldığında, iki nesne değişkeni yalnız ve yalnız aynı sınıfın aynı örneği iseler birbirlerinin aynısıdırlar.
Bu kuralları bir örnek ile pekiştirelim.
Örnek 1 - PHP 5'te nesne karşılaştırma örneği
<?php
function bool2str($bool)
{
if ($bool === false) {
return 'YANLIŞ';
} else {
return 'DOĞRU';
}
}
function compareObjects(&$o1, &$o2)
{
echo 'o1 == o2 : ' . bool2str($o1 == $o2) . "\n";
echo 'o1 != o2 : ' . bool2str($o1 != $o2) . "\n";
echo 'o1 === o2 : ' . bool2str($o1 === $o2) . "\n";
echo 'o1 !== o2 : ' . bool2str($o1 !== $o2) . "\n";
}
class Flag
{
public $flag;
function Flag($flag = true) {
$this->flag = $flag;
}
}
class OtherFlag
{
public $flag;
function OtherFlag($flag = true) {
$this->flag = $flag;
}
}
$o = new Flag();
$p = new Flag();
$q = $o;
$r = new OtherFlag();
echo "Aynı sınıfın iki örneği\n";
compareObjects($o, $p);
echo "\nAynı örneğe iki gönderim\n";
compareObjects($o, $q);
echo "\nİki farklı sınıfın örnekleri\n";
compareObjects($o, $r);
?>
Yukarıdaki örneğin çıktısı:
Aynı sınıfın iki örneği o1 == o2 : DOĞRU o1 != o2 : YANLIŞ o1 === o2 : FALSE o1 !== o2 : DOĞRU Aynı örneğe iki gönderim o1 == o2 : DOĞRU o1 != o2 : YANLIŞ o1 === o2 : DOĞRU o1 !== o2 : YANLIŞ İki farklı sınıfın örnekleri o1 == o2 : YANLIŞ o1 != o2 : DOĞRU o1 === o2 : YANLIŞ o1 !== o2 : DOĞRU
Bilginize: Eklentiler, kendi nesne karşılaştırmaları için kendi kurallarını tanımlayabilirler.
PHP 5, Tür Dayatma özelliğine sahiptir. İşlevler artık değiştirgelerinde belli bir nesne veya (PHP 5.1 ve sonrasında) bir dizi belirtilmesi için zorlayıcı olabilmektedir.
Örnek 1 - Tür dayatma örnekleri
<?php
// Şöyle bir sınıfımız olsun
class Sınıfım
{
/**
* Bir nesne sınama işlevi
*
* İlk değiştirge ÖbürSınıf türünde bir nesne olmalı
*/
public function nesne_dnm(ÖbürSınıf $diğersınıf) {
echo $diğersınıf->değişken;
}
/**
* Bir dizi sınama işlevi
*
* İlk değiştirge bir dizi olmalı
*/
public function dizi_dnm(array $dizi_girdisi) {
print_r($dizi_girdisi);
}
}
// Bu da öbür sınıfımız olsun
class ÖbürSınıf {
public $değişken = 'Merhaba Dünya';
}
?>
Dayatılan türe uymamanın sonucu yakalanabilir bir ölümcül hatadır.
<?php
// Her iki sınıftan birer örnek oluşturalım
$sınıfım = new Sınıfım;
$diğersınıf = new ÖbürSınıf;
// Ölümcül Hata: 1. değiştirge ÖbürSınıf türünde bir nesne olmalıdır
$sınıfım->nesne_dnm('hello');
// Ölümcül Hata: 1. değiştirge ÖbürSınıf türünde bir nesne örneği olmalıdır
$foo = new stdSınıf;
$sınıfım->nesne_dnm($foo);
// Ölümcül Hata: 1. değiştirge null olmamalıdır
$sınıfım->nesne_dnm(null);
// Bu çalışır: Merhaba Dünya yazdırır
$sınıfım->nesne_dnm($otherclass);
// Ölümcül Hata: 1. değiştirge bir dizi olmalıdır
$sınıfım->dizi_dnm('bir metin');
// Bu çalışır: Diziyi yazdırır
$sınıfım->dizi_dnm(array('a', 'b', 'c'));
?>
Tür dayatma işlevlerle de çalışır:
<?php
// Şöyle bir sınıfımız olsun
class Sınıfım {
public $değişken = 'Merhaba Dünya';
}
/**
* Bir işlev sınama işlevi
*
* İlk değiştirge Sınıfım türünde bir nesne olmalı
*/
function İşlevim (Sınıfım $birsınıf) {
echo $birsınıf->değişken;
}
// Bu çalışır
$sınıfım = new Sınıfım;
İşlevim($sınıfım);
?>
Tür dayatırken NULL değere izin verilir:
<?php
/* NULL değerin kabul edilmesi */
function deneme(stdSınıf $obj = NULL) {
}
deneme(NULL);
deneme(new stdSınıf);
?>
Tür dayatma (PHP 5.1 itibariyle) sadece object veya array türünde olabilir. int ve string ile yapılan geleneksel tür dayatma desteklenmemektedir.
PHP 5.3.0'dan itibaren, miras alınan duruk bağlamın çağrıldığı nesne bağlamında değerlendirilmesini sağlayan ve duruk içselleştirim (İng.: late static bindings) adı verilen bir özellik eklenmiştir.
"Duruk içselleştirme", static:: yöntemin çalışma anında, tanımlandığı nesnenin bağlamında değil, çağrıldığı nesnenin bağlamında değerlendirilmesi olgusunu betimler.
self:: ile ilgili sınırlamalarself:: veya __CLASS__ gibi bulunduğu sınıfa duruk gönderim yapan öğeler, örnekten de görüleceği üzere, yöntemi miras alan sınıf bağlamında değil, yöntemin ait olduğu sınıf bağlamında değerlendirilirler:
Örnek 1 - self:: kullanımı
<?php
class A {
public static function kimsin() {
echo __CLASS__;
}
public static function dene() {
self::kimsin();
}
}
class B extends A {
public static function kimsin() {
echo __CLASS__;
}
}
B::dene();
?>
Yukarıdaki örneğin çıktısı:
A
Duruk içselleştirimde çözümlemenin, gönderimin çalışma anında ilk çağrıldığı sınıfla sınırlandırılması, gönderim için özel bir anahtar sözcük kullanılarak sağlanır. Temel olarak, böyle bir anahtar sözcük, yukarıdaki örnekteki dene() yönteminin aşağıdaki gibi B döndürmesini sağlar. Bunun için yeni bir anahtar sözcük atamaktansa, zaten bir anahtar sözcük olan static sözcüğü kullanılmıştır.
Örnek 2 - static:: kullanımı
<?php
class A {
public static function kimsin() {
echo __CLASS__;
}
public static function dene() {
static::kimsin(); // Burada duruk içselleştirim yapılıyor
}
}
class B extends A {
public static function kimsin() {
echo __CLASS__;
}
}
B::dene();
?>
Yukarıdaki örneğin çıktısı:
B
Bilginize: Duruk yöntemler için static::, $this gibi çalışmaz! $this-> kalıtım kurallarına bağlıdır, static:: değildir.
Örnek 3 - Duruk olmayan bağlamda static:: kullanımı
<?php
class Çocuk extends Ebeveyn {
public function __construct() {
static::kimsin();
}
public function dene() {
$o = new Ebeveyn();
}
public static function kimsin() {
echo __CLASS__."\n";
}
}
class Ebeveyn {
public function __construct() {
static::kimsin();
}
public static function kimsin() {
echo __CLASS__."\n";
}
}
$o = new Çocuk;
$o->dene();
?>
Yukarıdaki örneğin çıktısı:
Çocuk Ebeveyn
Bilginize: Duruk içselleştirimin çözümlemesi duruk çağrının tamamen çözümlendiği noktada durdurulur, daha öteye gidilmez. Diğer taraftan, parent:: veya self:: gibi anahtar sözcükler kullanılarak yapılan duruk çağrılar çağrı bilgisini ötelerler.
Örnek 4 Ötelenen ve ötelenmeyen çağrılar
<?php
class A {
public static function nesin() {
static::kimsin();
}
public static function kimsin() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function dene() {
A::nesin();
parent::nesin();
self::nesin();
}
public static function kimsin() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function kimsin() {
echo __CLASS__."\n";
}
}
C::dene();
?>Yukarıdaki örneğin çıktısı:
A C C
PHP'de bir yöntem çağrısını tetiklemenin çok çeşitli yolları vardır; geri çağırımlar ve sihirli yöntemler gibi. Bunlar duruk içselleştirime tabi tutulduklarında, çalışma anında beklenmeyen sonuçlara sebep olurlar.
Örnek 5 - Sihirli yöntemlerin içinde duruk içselleştirim
<?php
class A {
protected static function kimsin() {
echo __CLASS__."\n";
}
public function __get($var) {
return static::kimsin();
}
}
class B extends A {
protected static function kimsin() {
echo __CLASS__."\n";
}
}
$b = new B;
$b->nesin;
?>
Yukarıdaki örneğin çıktısı:
B
PHP 5 için nesne yönelimli programlama ile ilgili olarak "öntanımlı olarak nesneler gönderimli aktarılır" diye bir kanı oluşmuştur, fakat bu tamamen doğru değildir. Bu bölümde bir örnek üzerinden bu genel kanı düzeltilmeye çalışılmıştır.
Bir PHP gönderimi, aynı değeri iki farklı değişkene yazmayı mümkün kılan bir takma addır. PHP 5'ten itibaren bir nesne değişkeni artık değer olarak nesnenin kendisini içermemektedir. Bunun yerine, nesne erişimcilerin asıl nesneyi bulmasını sağlayacak bir nesne tanıtıcısı içerir. Bir nesne değiştirgesi ile aktarılırken, döndürülürken veya başka bir değişkene atanırken bunlar takma ad değil, farklı değişkenlerdir: Aynı nesneyi gösteren tanıtıcının birer kopyasını içerirler.
Örnek 1 - Gönderimler ve Nesneler
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a; // $a ve $b aynı nesne tanıtıcısının kopyalarını içerir
// ($a) = ($b) = <tanıtıcı>
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c; // $c ve $d gönderimdir
// ($c,$d) = <tanıtıcı>
$d->foo = 2;
echo $c->foo."\n";
$e = new A;
function foo($obj) {
// ($obj) = ($e) = <tanıtıcı>
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?>
Yukarıdaki örneğin çıktısı:
2 2 2
serialize() returns a string containing a byte-stream representation of any value that can be stored in PHP. unserialize() can use this string to recreate the original variable values. Using serialize to save an object will save all variables in an object. The methods in an object will not be saved, only the name of the class.
In order to be able to unserialize() an object, the class of that object needs to be defined. That is, if you have an object of class A and serialize this, you'll get a string that refers to class A and contains all values of variabled contained it. If you want to be able to unserialize this in another file, an object of class A, the definition of class A must be prest ent in in that file first. This can be done for example by storing the class definition of class A in an include file and including this file or making use of the spl_autoload_register() function.
<?php
// classa.inc:
class A {
public $one = 1;
public function show_one() {
echo $this->one;
}
}
// page1.php:
include("classa.inc");
$a = new A;
$s = serialize($a);
// store $s somewhere where page2.php can find it.
file_put_contents('store', $s);
// page2.php:
// this is needed for the unserialize to work properly.
include("classa.inc");
$s = file_get_contents('store');
$a = unserialize($s);
// now use the function show_one() of the $a object.
$a->show_one();
?>
If an application is using sessions and uses session_register() to register objects, these objects are serialized automatically at the end of each PHP page, and are unserialized automatically on each of the following pages. This means that these objects can show up on any of the application's pages once they become part of the session. However, session_register() is deprecated as of PHP 5.3.0, and removed as of PHP 6.0.0. Reliance on this function is not recommended.
It is strongly recommended that if an application serializes objects, for use later in the application, that the application include the class definition for that object throughout the application. Not doing so might result in an object being unserialized without a class definition, which will result in PHP giving the object a class of __PHP_Incomplete_Class_Name, which has no methods and would render the object useless.
So if in the example above $a became part of a session by running session_register("a"), you should include the file classa.inc on all of your pages, not only page1.php and page2.php.
İsim alanı nedir? En dar tanımıyla, öğeleri sarmalamanın bir yoludur. Çoğu bakımdan bu soyut bir kavram gibi görünebilir. Örneğin, bir işletim sisteminin dizinleri bir birleriyle ilgili dosyaları gruplamaya yarar ve içerdiği dosyalar için bir isim alanı görevi yapar. Daha belirgin bir örnek olarak, /home/ali ve /home/veli dizinlerinde mesela.txt adında birer dosya bulunduğunu varsayalım. /home/ali dizinindeki dosyaya dizin dışından erişmek istersek dosyanın önüne dizin ayracı ile dizin adını yerleştiririz. Programcılık dünyasındaki isim alanlarına da aynı kurallar uygulanır.
PHP dünyasında isim alanları, kütüphane ve uygulama yazarlarının aşağıdaki gibi sınıflar ve işlevler gibi yeniden kullanılabilir elemanları oluşturken karşılaştıkları iki soruna çözüm getirmek amacıyla tasarlanmıştır:
PHP isim alanları birbirleriyle ilişkili sınıflar, sabitler ve işlevleri gruplamak için bir yol sunar. PHP'deki isim alanı söz dizimi için bir örnek:
Örnek 1 - İsim alanı söz dizimi örneği
<?php
namespace isim\alanım; // "İsim Alanlarının Tanımlanması" bölümüne bakınız
class Sınıfım {}
function işlevim() {}
const SABİTİM = 1;
$a = new Sınıfım;
$c = new \isim\alanım\Sınıfım; // "Küresel Etki Alanı" bölümüne bakınız
$a = strlen('selam'); // "İsim alanlarının kullanımı: Son çare olarak
// küresel işlev ve sabitler" bölümüne bakınız
$d = \isim\alanım\SABİTİM; // isim alanı işleci ve __NAMESPACE__
$d = __NAMESPACE__ . '\SABİTİM'; // sabiti" bölümüne bakınız
echo constant($d); // "İsim alanları ve devingen dil özellikleri"
// bölümüne bakınız
?>
İsim alanları PHP 5.3.0 sürümünden beri mevcuttur.
İsim alanları içinde her çeşit PHP kodu bulunabilirse de sadece üç tür kod isim alanlarından etkilenir: Sınıflar, işlevler ve sabitler.
İsim alanları, namespace anahtar sözcüğü ile bildirilirler. Bir isim alanını içeren bir dosyada isim alanı bütün diğer kodlardan önce (ama bir declare satırından önce değil) dosyanın başlarında bildirilmelidir.
Örnek 1 - Tek bir isim alanı bildirimi
<?php
namespace Projem;
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
?>
Bir isim alanı bildiriminden önce bulunmasına izin verilen tek oluşum, kaynak dosyanın kodlamasının tanımlandığı declare deyimidir. Bunun dışında, baştaki fazladan boşluklar da dahil hiçbir PHP-dışı kod, bir isim alanı bildiriminden önce yer alamaz. Örnek:
Örnek 2 - Tek bir isim alanı bildirimi
<html>
<?php
namespace Sınıfım; // ölümcül hata - namespace, betikteki ilk deyim olmalıdır
?>
Diğer tüm PHP oluşumlarının tersine, isim alanının dosya sistemi içinde parçalara bölünebilmesi için aynı isim alanı birden fazla dosyada tanımlanabilir.
Dizinler ve dosyalardaki gibi PHP isim alanı isimleri arasında da bir hiyeraraşi belirtmek mümkündür. Bu bakımdan, bir isim alanı başka isim alanlarının altında tanımlanabilir:
Örnek 1 - Tek bir isim alanının hiyerarşik bildirimi
<?php
namespace Projem\Alt\Seviye;
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
?>
Yukarıdaki örnekte, Projem\Alt\Seviye\BAĞLANTI_TAMAM sabiti, Projem\Alt\Seviye\Bağlantı sınıfı ve Projem\Alt\Seviye\bağlan işlevi oluşturulmaktadır.
Birden fazla isim alanı aynı dosya içinde bildirilebilir. İki çeşit söz dizimine izin verilir.
Örnek 1 - Birden fazla isim alanın ayrımsız ardarda bildirilmesi
<?php
namespace Projem;
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
namespace DiğerProjem;
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
?>
Bu söz dizimi aynı dosya içinde birden fazla isim alanı bildirimi için önerilmez. Bunun yerine ayraçlı söz dizimi önerilir.
Örnek 2 - Birden fazla isim alanın ayraçlı olarak bildirilmesi
<?php
namespace Projem {
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
}
namespace DiğerProjem {
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
}
?>
Aynı dosya içinde birden fazla isim alanını birleştirmek iyi bir kodlama uygulaması olarak teşvik edilmektedir. Çoğunlukla çok sayıda PHP betiğini aynı dosyada birleştirmek amacıyla kullanılır.
İsim alansız küresel kodu isim alanlı kodla bir arada kullanmanın tek yolu ayraçlı söz dizimini kullanmaktır (diğerine izin verilmemektedir). Küresel kod isimsiz bir isim alanı bildirimi ile aynı dosyada şöyle bildirilebilir:
Örnek 3 - Birden fazla isim alanın isim alansız kodla birlikte bildirilmesi
<?php
namespace Projem {
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
}
namespace { // küresel kod
session_start();
$a = Projem\bağlan();
echo Projem\Bağlantı::başlat();
}
?>
İsim alanı ayraçlarının dışında, kodlama belirten declare
deyimi dışında hiçbir PHP kodu bulunamaz.
Örnek 4 - Birden fazla isim alanın isim alansız kodla birlikte bildirilmesi
<?php
declare(encoding='UTF-8');
namespace Projem {
const BAĞLANTI_TAMAM = 1;
class Bağlantı { /* ... */ }
function bağlan() { /* ... */ }
}
namespace { // küresel kod
session_start();
$a = Projem\bağlan();
echo Projem\Bağlantı::başlat();
?>
İsim alanlarının kullanımından önce PHP'nin kodunuzdaki hangi isim alanlı kodu isteğinizi nasıl anlayabildiğinden bahsetmek gerekir. Bunu daha kolay anlayabilmek için PHP isim alanları ile dosya sistemleri arasındaki benzerlikten yola çıkılabilir. Bir dosya sistemindeki bir dosyaya üç yolla erişilebilir:
geçerlidizin/ olmak
üzere geçerlidizin/fan.txt olarak çözümlenir. Dolayısıyla
geçerli dizin /home/veli ise dosya ismi
/home/veli/fan.txt olarak çözümlenecektir.
geçerlidizin/
olmak üzere geçerlidizin/altdizin/fan.txt olarak
çözümlenir.
Aynı kurallar PHP'deki isim alanlı elemanlara da uygulanabilir. Örneğin bir sınıf ismine üç şekilde başvurulabilir:
Üç söz dizimi aşağıda örneklenmiştir:
dosya1.php
<?php
namespace Fan\Fin\altisimalanı;
const FAN = 1;
function fan() {}
class fan
{
static function durukyöntem() {}
}
?>
dosya2.php
<?php
namespace Fan\Fin;
include 'dosya1.php';
const FAN = 2;
function fan() {}
class fan
{
static function durukyöntem() {}
}
/* Nitelenmemiş isim */
fan(); // Fan\Fin\fan işlevine çözümlenir
fan::durukyöntem(); // Fan\Fin\fan sınıfının durukyöntem yöntemine çözümlenir
echo FAN; // Fan\Fin\FAN sabitine çözümlenir
/* Nitelenmiş isim */
altisimalanı\fan(); // Fan\Fin\altisimalanı\fan işlevine çözümlenir
altisimalanı\fan::durukyöntem(); // Fan\Fin\altisimalanı\fan sınıfının
// durukyöntem yöntemine çözümlenir
echo altisimalanı\FAN; // Fan\Fin\altisimalanı\FAN sabitine çözümlenir
/* Tamamen nitelenmiş isim */
\Fan\Fin\fan(); // Fan\Fin\fan işlevine,
\Fan\Fin\fan::durukyöntem(); // Fan\Fin\fan sınıfının durukyöntem yöntemine,
echo \Fan\Fin\FAN; // Fan\Fin\FAN sabitine çözümlenir
?>
Herhangi bir küresel sınıf, işlev veya sabite \strlen(), \Exception veya \INI_ALL gibi tamamen nitelenmiş isimleriyle erişilebileceğine dikkat ediniz.
Örnek 1 - Küresel sınıf, işlev ve sabitlere bir isim alanı içinden erişim
<?php
namespace Fan;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('merhaba'); // strlen küresel işlevini çağırır
$b = \INI_ALL; // INI_ALL küresel sabitini çağırır
$c = new \Exception('error'); // Exception küresel sınıfını örnekler
?>
PHP'nin isim alanları gerçeklenimi bir programlama dili olarak PHP'nin kendi devingen doğasından etkilenir. Örnek olarak aşağıdaki kodu isim alanlı koda dönüştürmek istersek:
Örnek 1 - Devingen olarak erişilen elemanlar
örnek1.php:
<?php
class sınıfadı
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function işlevadı()
{
echo __FUNCTION__,"\n";
}
const sabitadı = "küresel";
$a = 'sınıfadı';
$obj = new $a; // sınıfadı::__construct basar
$b = 'işlevadı';
$b(); // işlevadı basar
echo constant('sabitadı'), "\n"; // küresel basar
?>
Tamamen nitelenmiş isim kullanmak gerekir (isim alanı önekli sınıf adı). Bir devingen sınıf, işlev veya sabit ismi içinde bir nitelenmiş isim ile tamamen nitelenmiş isim arasında bir fark olmadığından baştaki ters bölünün gereksiz oluşuna dikkat edin.
Örnek 2 - Devingen olarak erişilen isim alanlı elemanlar
<?php
namespace isimalanıadı;
class sınıfadı
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function işlevadı()
{
echo __FUNCTION__,"\n";
}
const sabitadı = "isimalanlı";
include 'örnek1.php';
$a = 'sınıfadı';
$obj = new $a; // sınıfadı::__construct basar
$b = 'işlevadı';
$b(); // prints funcname
echo constant('sabitadı'), "\n"; // küresel basar
/* çift tırnakları kullanacaksanız, "\\isimalanıadı\\sınıfadı"
biçiminde olmalıdır */
$a = '\isimalanıadı\sınıfadı';
$obj = new $a; // isimalanıadı\sınıfadı::__construct basar
$a = 'isimalanıadı\sınıfadı';
$obj = new $a; // bu da isimalanıadı\sınıfadı::__construct basar
$b = 'isimalanıadı\işlevadı';
$b(); // isimalanıadı\işlevadı basar
$b = '\isimalanıadı\işlevadı';
$b(); //bu da isimalanıadı\işlevadı basan
echo constant('\isimalanıadı\sabitadı'), "\n"; // isimalanlı basar
echo constant('isimalanıadı\sabitadı'), "\n"; // bu da isimalanlı basar
?>
SSS arasındaki Dizgelerdeki isim alanı adlarının öncelenmesi konusuna da bakmayı unutmayın.
namespace sözcüğü ve __NAMESPACE__ sabiti
PHP, geçerli isim alanı içindeki elemanlara mutlak olarak iki yolla erişimi destekler: sihirli __NAMESPACE__ sabiti ve namespace anahtar sözcüğü.
__NAMESPACE__ sabitinin değeri içinde bulunulan isim alanının adını içeren bir dizgedir. Küresel alandaki isim alansız kod için sabitin değeri boş dizgedir.
Örnek 1 - İsim alanlı kod, __NAMESPACE__ örneği
<?php
namespace Projem;
echo '"', __NAMESPACE__, '"'; // "Projem" basar
?>
Örnek 2 - Küresel kod, __NAMESPACE__ örneği
<?php
echo '"', __NAMESPACE__, '"'; // "" basar
?>
__NAMESPACE__ sabiti devingen olarak oluşturulan isimler için kullanışlıdır.
Örnek 3 - Devingen isim oluşturmak için __NAMESPACE__ kullanımı
<?php
namespace Projem;
function get($sınıfadı)
{
$a = __NAMESPACE__ . '\\' . $sınıfadı;
return new $a;
}
?>
namespace sözcüğü, geçerli isim alanından veya bir alt isim alanından doğrudan doğruya bir eleman isteği yaparken kullanılabilir. Sınıflardaki self işlecinin isim alanlarındaki karşılığıdır.
Örnek 4 - Bir isim alanı içinde namespace işleci
<?php
namespace Projem;
use fan\fin as fon; // "İsim alanlarının kullanımı: ithal/rumuz"
fin\fon(); // Projem\fin\fon() işlevini çağırır
namespace\fin\fon(); // Projem\fin\fon() işlevini çağırır
namespace\işlev(); // Projem\işlev() işlevini çağırır
namespace\alt\işlev(); // Projem\alt\işlev() işlevini çağırır
namespace\isim::yöntem(); // Projem\isim sınıfının duruk "yöntem"
// yöntemini çağırır
$a = new namespace\alt\isim(); // Projem\alt\isim sınıfını örnekler
$b = namespace\SABİT; // Projem\SABİT sabitinin değerini $b'ye atar
?>
Örnek 5 - Küresel kod içinde namespace işleci
<?php
namespace\işlev(); // işlev() işlevini çağırır
namespace\alt\işlev(); // alt\işlev() işlevini çağırır
namespace\isim::yöntem(); // isim sınıfının duruk "yöntem" yöntemini çağırır
$a = new namespace\alt\isim(); // alt\isim sınıfını örnekler
$b = namespace\SABİT; // SABİT sabitinin değerini $b'ye atar
?>
Dış kaynaklı tamamen nitelenmiş bir isme bir takma adla veya ithal ederek başvurma yeteneği isim alanlarının önemli bir özelliğidir. Bu özellik, Unix dosya sistemlerinin bir dizin veya dosyaya bir sembolik bağ oluşturma yeteneğine benzer.
PHP isim alanları iki çeşit takma ad kullanımını veya ithalini destekler: bir sınıf adına takma ad ve bir isim alanı adına takma ad. Bir işlevin veya sabitin ithalinin desteklenmediğine dikkat ediniz.
PHP'da takma ad kullanımı use işleci üzerinden sağlanır.
Aşağıda 3 çeşit ithal örneğine yer verilmiştir:
Örnek 1 - use işleci ile ithal/rumuz kullanımı
<?php
namespace fan;
use Bir\Tam\Sınıfadı as BirBaşkası;
// use Bir\Tam\iAadı as iAadı ile aynıdır
use Bir\Tam\iAadı;
// küresel bir sınıfın ithali
use \DiziNesnesi;
$nesne = new namespace\BirBaşkası; // fan\BirBaşkası sınıfını örnekler
$nesne = new BirBaşkası; // Bir\Tam\Sınıfadı sınıfını örnekler
iAadı\altia\işlev(); // Bir\Tam\iAadı\altia\işlev işlevini çağırır
$a = new DiziNesnesi(array(1)); // DiziNesnesi sınıfını örnekler
// "use \DiziNesnesi" olmasaydı fan\DiziNesnesi sınıfını örneklerdik
?>
İsim alanlı adlar için baştaki terbölü gereksiz olup izin verilmediği gibi bunlar geçerli isim alanına göre işlenmezler. İthal edilen isimler ise tamamen nitelenmiş olmalıdır. (Tamamen nitelenmiş isimler Fan\Fin şeklinde isim alanı ayracı içermelerine karşın küresel isimler FanFin şeklinde isim alanı ayracı içermezler.)
PHP bunlara ek olarak çok sayıda use deyiminin aynı satırda
kullanılmasına imkan veren bir kısayola da sahiptir.
Örnek 2 - use işleci ile rumuz/ithal, çoklu use
kullanımı
<?php
use Bir\Tam\Sınıfadı as BirBaşkası, Bir\Tam\iAadı;
$nesne = new BirBaşkası; // Bir\Tam\Sınıfadı sınıfını örnekler
iAadı\altia\işlev(); // Bir\Tam\iAadı\altia\işlev işlevini çağırır
?>
İthal işlemi derleme sırasında yerine getirilir ve dolayısıyla devingen sınıf, işlev ve sabit isimlerini etkilemez.
Örnek 3 - İthal işlemi ve devingen isimler
<?php
use Bir\Tam\Sınıfadı as BirBaşkası, Bir\Tam\iAadı;
$nesne = new BirBaşkası; // Bir\Tam\Sınıfadı sınıfını örnekler
$a = 'BirBaşkası';
$nesne = new $a; // BirBaşkası sınıfını örnekler
?>
Bunlara ek olarak, ithal işlemi sadece nitelenmemiş ve nitelenmiş isimleri etkiler. Tamamen nitelenmiş isimler mutlak olup ithal işleminden etkilenmez.
Örnek 4 - İthal işlemi ve tamamen nitelenmiş isimler
<?php
use Bir\Tam\Sınıfadı as BirBaşkası, Bir\Tam\iAadı;
$nesne = new BirBaşkası; // Bir\Tam\Sınıfadı sınıfını örnekler
$nesne = new \BirBaşkası; // BirBaşkası sınıfını örnekler
$nesne = new BirBaşkası\birşey; // Bir\Tam\Sınıfadı\birşey sınıfını örnekler
$nesne = new \BirBaşkası\birşey; // BirBaşkası\birşey sınıfını örnekler
?>
Herhangi bir isim alanı tanımı olmaksızın, tüm sınıf ve işlev tanımları PHP'de isim alanlarının desteklenmediği zamanlardaki gibi küresel alana yerleştirilir. Bir ismin önüne doğrudan doğruya \ konulması, bu ismin bir isim alanı bağlamında bile küresel alandan bir isim olarak işlem görmesini sağlar.
Örnek 1 - Küresel alan belirtiminin kullanımı
<?php
namespace A\B\C;
/* A\B\C\fopen işlevidir */
function fopen() {
/* ... */
$f = \fopen(...); // küresel fopen çağrılır
return $f;
}
?>
Bir isim alanı içinde PHP, bir sınıf ismi, işlev veya sabitin bağlamında nitelenmemiş isimlere rastlarsa bunları farklı önceliklerle ele alır. Sınıf isimleri daima geçerli isim alanı ismine çözümlenir. Dolayısıyla yerleşik veya isim alansız kullanıcı sınıflarına erişmek için, bunların aşağıdaki gibi tamamen nitelenmiş isimlerinin kullanılması gerekir:
Örnek 1 - Küresel sınıflara bir isim alanı içinde erişim
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a, A\B\C\Exception sınıfının bir nesnesidir
$b = new \Exception('hi'); // $b, Exception sınıfının bir nesnesidir
$c = new ArrayObject; // ölümcül hata, A\B\C\ArrayObject yoktur
?>
İşlevler ve sabitler açısından PHP, bir isim alanlı işlev veya sabit mevcut değilse son çare olarak küresel işlevlere ve sabitlere başvurur.
Örnek 2 - Bir isim alanı içinde son çare olarak küresel işlev ve sabitlerin kullanımı
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // "45" basar
echo INI_ALL, "\n"; // "7" basar - son çare olarak küresel INI_ALL
echo strlen('hi'), "\n"; // "1" basar
if (is_array('hi')) { // "dizi değil" basar
echo "dizi\n";
} else {
echo "dizi değil\n";
}
?>
İsim çözünürlük kurallarının amaçları gereği bazı önemli tanımlar:
Fan gibi bir isim alanı ayracı içermeyen bir betimleyici.
Fan\Fin gibi bir isim alanı ayracı içeren bir betimleyici.
\Fan\Fin gibi bir isim alanı ayracı ile başlayan isim alanı ayraçlı bir betimleyici. namespace\Fan da tamamen nitelenmiş bir isimdir.
İsimler şu kurallara göre çözümlenir:
Örnek 1 - Örneklerle İsim Çözünürlüğü
<?php
namespace A;
use B\D, C\E as F;
// işlev çağrıları
fan(); // Varsa "A" isim alanında tanımlı "fan", yoksa küresel "fan"
\fan(); // Küresel alanda tanımlı "fan" çağrılır
my\fan(); // "A\my" isim alanında tanımlı "fan" çağrılır
F(); // Varsa "A" isim alanında tanımlı "F", yoksa küresel "F"
//sınıf adı çağrıları
new B(); // Varsa "A" isim alanında tanımlı "B" örneklenir
// Yoksa "A\B" sınıfı özdevinimli olarak yüklenmeye çalışılır
new D(); // ithal kuralları ile, "B" isim alanında tanımlı "D" örneklenir
// yoksa "B\D" sınıfı özdevinimli olarak yüklenmeye çalışılır
new F(); // ithal kuralları ile, "C" isim alanında tanımlı "E" örneklenir
// yoksa "C\E" sınıfı özdevinimli olarak yüklenmeye çalışılır
new \B(); // Varsa küresel alanda tanımlı "B" örneklenir
// yoksa "B" sınıfı özdevinimli olarak yüklenmeye çalışılır
new \D(); // Varsa küresel alanda tanımlı "D" örneklenir
// yoksa "D" sınıfı özdevinimli olarak yüklenmeye çalışılır
new \F(); // Varsa küresel alanda tanımlı "F" örneklenir
// yoksa "F" sınıfı özdevinimli olarak yüklenmeye çalışılır
// başka bir isim alanından duruk yöntem/isim alanı işlevleri
B\fan(); // "A\B" isim alanında tanımlı "fan" çağrılır
B::fan(); // "A" isim alanında tanımlı "B" sınıfının "fan" yöntemi çağrılır
// "A\B" sınıfı yoksa, "A\B" özdevinimli yüklenmeye çalışılır
D::fan(); // ithal kuralları ile, "B" isim alanında tanımlı "D" sınıfının
// "fan" yöntemi çağrılır; "B\D" sınıfı yoksa, "B\D"
// özdevinimli yüklenmeye çalışılır
\B\fan(); // "B" isim alanında tanımlı "fan" çağrılır
\B::fan(); // Küresel alandaki "B" sınıfının "fan" yöntemi çağrılır
// "B" sınıfı yoksa, "B" özdevinimli yüklenmeye çalışılır
// geçerli isim alanının duruk yöntemleri ve isim alanı işlevleri
A\B::fan(); // "A\A" isim alanında tanımlı "B" sınıfının "fan" yöntemi
// çağrılır; "A\A\B" sınıfı yoksa, "A\A\B" özdevinimli
// yüklenmeye çalışılır
\A\B::fan(); // "A\B" isim alanında tanımlı "B" sınıfının "fan" yöntemi
// çağrılır; "A\B" sınıfı yoksa, "A\B" özdevinimli yüklenmeye
// çalışılır
?>
Bu SSS iki bölüme ayrılır: genel sorular ve isim alanlarını tamamen anlamaya yardımcı olacak gerçeklenime özgü ayrıntılar.
Önce genel sorularla başlıyoruz.
İsim alanları gerçeklenimini tamamen anlamaya yardımcı olacak gerçeklenime özgü bir kaç ayrıntı vardır.
Hayır. Ne isim alanları mevcut koddan etkilenir ne de isim alanlarını içermeyen kodlar isim alanlarından etkilenir. İsterseniz kodu böyle yazabilirsiniz:
Örnek 1 - Küresel sınıflara bir isim alanı dışından erişim
<?php
$a = new \stdClass;
Bu kod şuna eşdeğerdir:
Örnek 2 - Küresel sınıflara bir isim alanı dışından erişim
<?php
$a = new stdClass;
Örnek 3 - İsim alanı içinden yerleşik sınıflara erişim
<?php
namespace fan;
$a = new \stdClass;
function test(\ArrayObject $typehintexample = null) {}
$a = \DirectoryIterator::CURRENT_AS_FILEINFO;
// Bir yerleşik veya küresel sınıfın genişletilmesi
class MyException extends \Exception {}
?>
Örnek 4 - İsim alanındaki dahili sınıf, işlev ve sabitlere erişim
<?php
namespace fan;
class Sınıfım {}
// bir ipucu yazdırmak için geçerli isim alanındaki bir sınıfın kullanımı
function dnm(Sınıfım $biripucuörneği = null) {}
// ipucu yazdırmak için geçerli isim alanındaki bir sınıfın başka
// bir yolla kullanımı
function dnm(\fan\Sınıfım $biripucuörneği = null) {}
// geçerli isim alanındaki bir sınıfın genişletilmesi
class AltSınıfım extends Sınıfım {}
// bir küresel işleve erişim
$a = \küreselişlev();
// bir küresel sabite erişim
$b = \INI_ALL;
?>
\ ile başlayan isimler daima yazıldıkları gibi çözümlenirler, bu bakımdan \bir\isim aslında bir\isim'dir; \Exception da aslında Exception'dır.
Örnek 5 - Tamamen nitelenmiş isimler
<?php
namespace fan;
$a = new \bir\isim(); // "bir\isim" sınıfını örnekler
echo \strlen('hi'); // "strlen" işlevini çağırır
$a = \INI_ALL; // $a değişkenine "INI_ALL" sabitinin değeri atanır
?>
Bir tersbölü içeren, ancak tersbölü ile başlamayan bir\isim gibi isimler iki farklı yolla çözümlenebilir.
bir ismini başka bir isimle ithal eden bir deyim varsa bu takma isim bir\isim içindeki bir'e uygulanır.
Aksi takdirde, bir\isim isminin önüne geçerli isim alanı adı getirilir.
Örnek 6 - Nitelenmiş isimler
<?php
namespace fon;
use fan\fin as fon;
$a = new bir\isim(); // "fon\bir\isim" sınıfını örnekler
fon\bar::isim(); // "fan\fin\bar" sınıfının "isim" duruk yöntemi çağrılır
bir\bar(); // "fon\bir\bar" işlevi çağrılır
$a = bir\BAR; // $a değişkenine "fon\bir\BAR" sabitinin değeri atanır
?>
isim gibi tersbölü içermeyen sınıf isimleri 2 farklı yolla çözümlenebilir.
isim ismini başka bir isimle ithal eden bir deyim varsa bu takma isim isim'e uygulanır.
Aksi takdirde, isim ismininin önüne geçerli isim alanı getirilir.
Örnek 7 - Nitelenmemiş sınıf isimleri
<?php
namespace fon;
use fan\fin as fon;
$a = new isim(); // "fon\isim" sınıfı örneklenir
fon::isim(); // "fan\fin" sınıfının "isim" duruk yöntemi çağrılır
?>
isim gibi tersbölü içermeyen işlev ve sabit isimleri 2 farklı yolla çözümlenebilir.
Önce isim isminin önüne geçerli isim alanı ismi getirilir.
Son olarak, eğer isim alanında isim diye bir işlev veya sabit yoksa ve isim diye bir küresel işlev veya sabit varsa küresel alandaki kullanılır.
Örnek 8 - Nitelenmemiş işlev veya sabit isimleri
<?php
namespace fon;
use fan\fin as fon;
const FON = 1;
function bir() {}
function fon() {}
function sort(&$a)
{
sort($a);
$a = array_flip($a);
return $a;
}
bir(); // "fon\bir" çarılır
$a = strlen('hi'); // "fon\strlen" mevcut olmadığından küresel
// "strlen" işlevi çağrılır
$arr = array(1,3,2);
$b = sort($arr); // "fon\sort" işlevi çağrılır
$c = fon(); // "fon\fon" işlevi çağrılır - ithal işlemi uygulanmaz
$a = FON; // $a değişkenine "fon\FON" sabitinin değeri
// atanır - ithal işlemi uygulanmaz
$b = INI_ALL; // $b değişkenine "INI_ALL" küresel sabitinin değeri atanır
?>
Aşağıdaki iki betik birlikte kurallara uygundur:
dosya1.php
<?php
namespace bir\isim;
class Sınıfım {}
?>
dosya2.php
<?php
namespace diğer;
class BirŞey {}
?>
dosya.php
<?php
namespace bir\isim;
include 'dosya1.php';
include 'dosya2.php';
use diğer\BirŞey as Sınıfım;
$a = new Sınıfım; // "diğer" isim alanındaki "BirŞey" sınıfını örnekler
?>
Sınıfım sınıfı bir\isim isim alanında mevcut olduğu halde Sınıfım ayrı bir dosyada tanımlandığından herhangi bir isim çakışması olmaz. Ancak, sonraki örnekte, Sınıfım sınıfı use deyimi ile aynı dosyada tanımlandığından isim çakışmasından dolayı ölümcül hata oluşur.
<?php
namespace bir\isim;
use diğer\BirŞey as Sınıfım;
class Sınıfım {} // ölümcül hata: Sınıfım ithal edilen sınıfla çakışır
$a = new Sınıfım;
?>
PHP isim alanlarının böyle iç içe tanımlanmasına izin vermez:
<?php
namespace bir\isim {
namespace içiçe {
class fan {}
}
}
?>
Bununla birlikte, isim alanlarını birbirinin içinde şöyle tanımlamak mümkündür:
<?php
namespace bir\isim\içiçe {
class fan {}
}
?>
use deyimlerinden sadece isim alanları ve sınıf isimleri etkilenir. Uzunca bir işlev veya sabit ismini kısaltmak için kendilerini içeren isim alanını ithal etmeniz yeterlidir.
<?php
namespace benimki;
use epeyce\fazla\uzun\isim;
$a = isim\SABİT;
isim\işlev();
?>
Tersbölü imi dizgelerin içinde bir önceleme karakteri olarak kullanıldığından çift tırnaklar arasına alınmış bir dizge içindeki bir tersbölü karakterinin tersbölü ile öncelenmesi gerekir. Aksi takdirde, istenmeyen durumlar ortaya çıkabilir:
Örnek 9 - İsim alanlı isimleri çift tırnaklar arasında kullanmak tehlikelidir
<?php
$a = new "tehlikeli\nesne"; // \n, çift tırnaklı dizge içinde
// satırsonu karakteridir!
$obj = new $a;
$a = new 'bu\tamamen\tehlikesiz\nesne'; // burada sorun yok.
$obj = new $a;
?>
Tersbölüleri tek tırnakları arasına alınmış bir dizge içinde kullanmak daha güvenli olsa da her iki dizge türünde de tersbölüleri öncelemek en güvenlisidir.
FAN gibi nitelenmemiş olarak tanımsız sabitlere rastlandığında PHP, bunun FAN değerli bir sabit varsayıldığını belirten bir uyarı üretecektir. İster nitelenmiş olsun ister tamamen nitelenmiş olsun tanımsız bir sabit daima ölümcül hataya sebep olur.
Örnek 10 - Tanımsız sabitler
<?php
namespace bar;
$a = FAN; // uyarı üretir - "FAN" sabit olarak tanımsız olduğundan
// bir sabit ismi değil, bir sabit değer olarak ele alınır.
$a = \FAN; // ölümcül hata, isim alanlı tanımsız sabit: FAN
$a = Fin\FAN; // ölümcül hata, isim alanlı tanımsız sabit: bar\Fin\FAN
$a = \Fin\FAN; // ölümcül hata, isim alanlı tanımsız sabit: Fin\FAN
?>
Bir özel, yerleşik sabiti bir isim alanlı sabit olarak tanımlamaya kalkışmak ölümcül hatayla sonuçlanır.
Örnek 11 - Tanımsız sabitler
<?php
namespace bar;
const NULL = 0; // ölümcül hata;
const true = 'ahmak'; // bu da ölümcül hata;
// etc.
?>
PHP 5 diğer programlama dillerindekine benzer bir istisna modeline sahiptir. Bir istisna oluşturulabilir (throw) ve yakalanabilir (catch). Olası istisnaların yakalanabilmesi için, kod bir try bloğu içine alınabilir. Her try bloğuna karşılık en az bir tane catch bloğu olması gerekir. Farklı sınıflara ait istisnaları yakalamak için birden fazla catch bloğu kullanılabilir. Normal çalışma sıradaki son catch bloğundan sonra devam eder. Buradaki normal çalışma, try bloğu içinde hiçbir istisna oluşmadığı veya bir catch bloğu ile eşleşen bir oluşmuş istisnalar sınıfının mevcut olmadığı duruma karşılıktır. İstisnalar bir catch bloğu içerisinde oluşmuş olabileceği gibi yeniden de oluşabilir.
Bir istisna oluştuğunda, istisnanın oluştuğu yerden sonraki kodlar çalıştırılmaz ve PHP oluşan istisna ile uyuşan ilk catch bloğunu bulmaya çalışır. Bir istisnanın yakalanmaması durumunda, set_exception_handler() işlevi ile evvelce bir istisna eylemcisi tanımlanmamışsa, PHP bir ölümcül hata durumu oluşturur ve bir "Uncaught Exception ..." ("Yakalanmamış istisna ...") iletisi çıktılar.
Bilginize: Yerleşik PHP işlevleri aslında hata raporlama yapmakta, istisnaları sadece nesne yönelimli güncel eklentiler kullanmaktadır. Bununla birlikte hatalar ErrorException ile kolayca istisnalara dönüştürülebilir.
Standard PHP Kütüphanesi (SPL) bol bol yerleşik istisna içerir.
Örnek 1 - Bir İstisna Oluşturmak
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Sıfıra bölme.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Yakalanan olağandışılık: ', $e->getMessage(), "\n";
}
// Çalışma sürer
echo 'Merhaba Dünya';
?>
Yukarıdaki örneğin çıktısı:
0.2 Yakalanan olağandışılık: Sıfıra bölme. Merhaba Dünya
Örnek 2 - İç içe istisnalar
<?php
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
/* yeniden yakala */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();
?>
Yukarıdaki örneğin çıktısı:
string(4) "foo!"
Yerleşik Exception sınıfını genişleten kullanıcı tanımlı bir istisna sınıfı tanımlanabilir. Aşağıdaki üyeler ve özellikler, yerleşik Exception sınıfından türetilen alt sınıf içerisinde nelerin erişilebilir olduğunu göstermektedir.
Örnek 1 - Yerleşik Exception sınıfı
<?php
class Exception
{
protected $message = 'Bilinmeyen istisna'; // istisna iletisi
private $string; // __toString önbelleği
protected $code = 0; // kullanıcı tanımlı istisna kodu
protected $file; // istisnanın kaynak dosyası
protected $line; // istisnanın kaynak dosyasındaki satırı
private $trace; // geriye doğru hata izleme
private $previous; // istisnalar iç içe ise önceki istisna
public function __construct($message = null, $code = 0,
Exception $previous = null);
final private function __clone(); // İstisna kopyalamayı engeller
final public function getMessage(); // istisna iletisi
final public function getCode(); // istisnanın kodu
final public function getFile(); // kaynak dosya
final public function getLine(); // kaynak dosya satırı
final public function getTrace(); // backtrace() dizisi
final public function getTraceAsString(); // biçemli hata izleme dizgesi
final public function getPrevious(); // önceki istisna
/* Geçersiz kılınabilir */
public function __toString(); // görüntüleme için biçemlenmiş dizge
}
?>
Bir sınıf yerleşik Exception sınıfını genişletiyor ve nesne kurucuyu yeniden tanımlıyorsa, mevcut tüm verinin düzgün biçimde atandığından emin olmak için parent::__construct() işlevinin de çağrılması hararetle önerilir. Nesne bir karakter dizisi olarak sunulduğunda özelleştirilmiş bir çıktı sağlayabilmek için __toString() yöntemi geçersiz kılınabilir.
Bilginize: İstisnaların kopyaları yapılamaz. Bir istisnanın kopyasını yapmaya çalışmak ölümcül hatayla (E_FATAL seviyesinden bir hata) ile sonuçlanır.
Örnek 2 - Exception sınıfının genişletilmesi
<?php
/**
* Özelleştirilmiş bir istisna sınıfı tanımlayalım
*/
class MyException extends Exception
{
// İstisnayı yeniden tanımlayalım, böylece ileti seçimlik olmaktan çıkar
public function __construct($message, $code = 0,
Exception $previous = null) {
// biraz kod
// her şeyin düzgün atandığından emin olalım
parent::__construct($message, $code, $previous);
}
// nesnenin özelleştirilmiş karakter dizisi gösterimi
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Bu türdeki istisnalar için özelleştirilmiş işlev\n";
}
}
/**
* İstisnayı denemek için bir sınıf oluşturalım
*/
class TestException
{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// özelleştirilmiş istisna oluştur
throw new MyException('1 geçersiz bir değiştirgedir', 5);
break;
case self::THROW_DEFAULT:
// öntanımlı olarak bir oluşturulur.
throw new Exception('2 geçerli bir değiştirge değildir', 6);
break;
default:
// İstisna yok; nesne oluşturulacak.
$this->var = $avalue;
break;
}
}
}
// Örnek 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Yakalanacaktır
echo "Benim istisnam yakalandı\n", $e;
$e->customFunction();
} catch (Exception $e) { // Bu atlanır
echo "Öntanımlı istisna yakalandı\n", $e;
}
// Çalışmaya devam et
var_dump($o); // Null
echo "\n\n";
// Örnek 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // Bu tür ile uyuşmuyor
echo "Benim istisnam yakalandı\n", $e;
$e->customFunction();
} catch (Exception $e) { // Bu yakalanacaktır
echo "Öntanımlı istisna yakalandı\n", $e;
}
// Çalışmaya devam et
var_dump($o); // Null
echo "\n\n";
// Örnek 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Yakalanacaktır
echo "Öntanımlı İstisna yakalandı\n", $e;
}
// Çalışmaya devam et
var_dump($o); // Null
echo "\n\n";
// Örnek 4
try {
$o = new TestException();
} catch (Exception $e) { // Bu atlandır; istisna yok
echo "Öntanımlı İstisna yakalandı\n", $e;
}
// Çalışmaya devam et
var_dump($o); // TestException
echo "\n\n";
?>
PHP'de gönderimler aynı değişken içeriğine farklı isimlerle erişmek demektir. C'deki göstericilere benzemezler; örneğin, üzerlerinde gösterici aritmetiği kullanamazsınız, çünkü gerçekte bellek adresleri değillerdir.Ayrıntılar için Gönderimler Ne Değildir? bölümüne bakınız. daha çok simge tablosu PHP'de şuna dikkat edin: Değişken içeriği ve değişken ismi farklı şeylerdir. Bu bakımdan, aynı içeriğin farklı isimleri olabilir. En yakın benzerlik, Unix dosya isimleri ve dosyaları ile kurulabilir; değişken isimleri dizinlerse, değişken içeriği de dizinin içindeki dosyadır. Gönderimler ise Unix dosya sistemindeki sabit bağlar olarak düşünülebilir.
Gönderimleri kullanıldığı üç temel işlem vardır: gönderimli atama, gönderimli aktarma, ve gönderimli döndürme. Bu bölümde bu işlemlerle ilgili bağlantılar verilerek bir başlangıç yapılmıştır.
Bu ilk temel işlemde, iki değişkenin aynı içeriğe atıf yapmasına izin verilir. Örnek:
<?php
$a =& $b;
?>
Bunun anlamı, $a ve $b değişkenlerinin aynı içeriği gösterdiğidir.
Bilginize: Burada $a ve $b tamamen eşittir; ne $a, $b'yi göstermekte ne de $b, $a'yı göstermektedir; $a ve $b aynı yeri göstermektedir.
Bilginize: Eğer bir dizi gönderimle kopyalanmışsa gösterilen şey değerler değildir. Bu ayrıca işlevlere değerleriyle aktarılan diziler için de geçerlidir.
Bilginize: Eğer tanımlanmamış bir değişken gönderimle atanır, aktarılır veya döndürülürse oluşturulmuş olur.
Örnek 1 - Gönderimlerin tanımlanmamış değişkenlerle kullanımı
<?php
function foo(&$var) { }
foo($a); // $a "oluşturulur" ve değer olarak null atanır
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
Aynı sözdizimi, gönderim döndüren işlevler ve new işleci (PHP 4.0.4 ve sonrası, PHP 5.0.0'a kadar) ile kullanılabilir:
<?php
$foo =& dğşkn_bul($bar);
?>
PHP 5'ten beri, new özdevinimli olarak gönderim döndürmekte, bu bakımdan böyle bir bağlamda =& kullanımı önerilmemekte ve kullanıldığında E_STRICT seviyesinde ileti üretmektedir.
Bir işlevin içinde global olarak bildirilmiş bir değişkeni gönderimli olarak atarsanız gönderim sadece işlevin içinde görünür olur. $GLOBALS dizisini kullanarak bundan kaçınabilirsiniz.
Örnek 2 - İşlev içinde küresel değişkenlere gönderim
<?php
$var1 = "Örnek değişken";
$var2 = "";
function küresel_gönderimler($küreselleri_kullan)
{
global $var1, $var2;
if (!$küreselleri_kullan) {
$var2 =& $var1; // sadece işlev içinde görünürdür
} else {
$GLOBALS["var2"] =& $var1; // küresel alanda da görünürdür
}
}
küresel_gönderimler(false);
echo "var2'ye '$var2' atanır\n"; // var2'ye '' atanır
küresel_gönderimler(true);
echo "var2'ye '$var2' atanır\n"; // var2'ye 'Örnek değişken' atanır
?>
global $var; deyimi $var =& $GLOBALS['var']; deyimine bir kısayol olarak düşünülür. Bu bakımdan $var'a başka bir gönderim atamak sadece yerel değişkenin gönderimini değiştirir.
Bilginize: Eğer bir değişkene foreach döngüsü içinde gönderimle bir değer atarsanız gönderimde de değişiklik yapılmış olur.
Örnek 3 - foreach döngüsü içinde gönderim
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// işlemler
}
echo $ref; // 3 - yinelenen dizinin son elemanı
?>
Gönderimlerle yapılan ikinci şey değişkenleri gönderimle aktarmaktır. Bir işlev içinde bir yerel değişken oluşturup çağrı etki alanında bir değişkenle aynı içeriğe gönderim yaparak bu gerçeklenebilir. Örnek:
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
echo $a; // 6 çıktılar
?>
$a'nın 6 olmasının sebebi foo işlevinde $var değişkeninin $a'nın içeriğine gönderimli olmasıdır. Daha ayrıntılı açıklamayı gönderimle aktarım bölümünde bulabilirsiniz.
Gönderimlerle yapılan üçüncü şey gönderimli değer döndürmedir.
Evvelce de değinildiği gibi bir gönderim bir gösterici değildir. Yani, aşağıdaki oluşum bekleneni yapmayacaktır:
<?php
function foo(&$var)
{
$var =& $GLOBALS["baz"];
}
foo($bar);
?>
Burada foo işlevindeki $var değişkeni çağrı yapılan yerde $bar değişkenine bağlanmakla kalmayıp bir de işlevin içinde $GLOBALS["baz"] değişkenine bağlanmaktadır. $bar'ın işlev etki alanı içinde gönderim mekanizması ile başka bir değişkene bağlanması mümkün değildir, çünkü $bar değişkeni foo işlevinin etki alanında mevcut değildir (işlev etki alanında $var tarafından temsil edilmekteyse de $var sadece değişkenin içeriğine sahiptir ve çağrı simgeleri tablosunda ismi değere bağlayan şey değildir). İşlev tarafından seçilen değişkenlere gönderim yapabilmek için değeri gönderimle döndürmelisiniz.
Bir değişkeni bir işleve gönderimle aktarabilirsiniz, böylece işlevin değiştirgelerini değiştirebilirsiniz. Sözdizimi şöyledir:
<?php
function işlev(&$değişken)
{
$değişken++;
}
$a=5;
foo($a);
// Burada $a artık 6'dır
?>
Bilginize: İşlevin çağrıldığı yerde gönderim yapıldığına dair bir belirtinin olmadığına dikkat ediniz; gönderim sadece işlevin üzerindedir. İşlev tanımı değiştirgeyi gönderimle gerektiği gibi aktarmak için tek başına yeterlidir. PHP'nin son sürümlerinde & imini işlev(&$a); biçeminde kullandığınız takdirde "Çağrı sırasında gönderimle aktarım" anlamına gelen bir uyarı alırsınız.
Aşağıdakiler bir işleve gönderimle aktarılabilir:
new deyimi.
Bir işlevden döndürerek bir gönderim. Örnek:
<?php
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>
Ayrıca, gönderimle değer döndürme konusuna da bakınız.
Sonuç tanımsız olacağından, başka hiçbir ifade gönderimle aktarılamaz. Örneğin, aşağıdaki gönderimle aktarım örneği geçersizdir:
<?php
function bar() // Dikkat, & yok
{
$a = 5;
return $a;
}
foo(bar()); // PHP 5.0.5'ten beri ölümcül hata üretmekte
foo($a = 5); // Bir ifade, değişken değil
foo(5); // Ölümcül hata üretir
?>
Bunlar PHP 4.0.4 ve sonrası için gereklidir.
Gönderimle döndürme, gönderimin bağlayacağı değişkeni hedefleyen bir işlev kullanmak istediğiniz takdirde yararlıdır. Gönderimle döndürmeyi başarımı arttırmak amacıyla kullanmayın. Motor, bunu kendine göre en iyileyecek yeteneğe sahiptir. Sadece geçerli bir teknik sebebiniz olduğunda gönderimle döndürme yapın! Gönderimle döndürmek için şu söz dizimi kullanılır:
<?php
class sınıf {
public $değer = 42;
public function &değeriBağla() {
return $this->değer;
}
}
$obj = new sınıf;
$değerim = &$obj->değeriBağla(); // $değerim, $obj->değer için bir gönderimdir
echo $değerim; // 42 basar
$obj->değer = 2;
echo $değerim; // 2 basar
?>
Bu örnekte, değeriBağla işlevi ile döndürülen nesne özelliği değişkene atanmaktadır, eğer gönderim söz dizimi kullanılmamış olsaydı özelliğin kendisi değil bir kopyası atanmış olacaktı.
Bilginize: Değiştirge aktarmanın tersine, burada her iki taraftada (çağıran ve çağrılan) & kullanımı zorunludur. Çağıran tarafta $değerim değişkenine yapılanın bir atama değil gönderim bağlantısı olduğunu, çağrılan tarafta ise yapılanın sıradan bir değer kopyalama değil bir gönderimle döndürme olduğunu belirtmektedir.
Bilginize: return ($this->değer); söz dizimi ile bir işlevden bir gönderim döndürmek isterseniz bir değişkeni değil de bir ifadenin sonucunu döndürmeye çalışmış olacağınızdan bu istediğinizi yapmayacaktır. Bir işlevden gönderimle sadece değişkenleri döndürebilirsiniz, başka bir şey döndüremezsiniz. PHP 4.4.0 ve PHP 5.1.0'dan beri gönderimle döndürme söz dizimini kullanan bir işlevden bir devingen ifadenin veya bir new işlecinin sonucunu döndürmeye çalışmak E_NOTICE seviyesinden bir hata oluşturmaktadır.
Bir gönderimi unset() ile tanımsız yapmakla aslında değişken ismiyle değeri arasındaki bağlantıyı bozmuş olursunuz, değişkeni içeriksiz bırakmış olmazsınız (aynı değeri gösteren iki değişkenden sadece birini ortadan kaldırmış olursunuz). Örnek:
<?php
$a = 1;
$b =& $a;
unset($a);
?>
Burada $b değil $a tanımsız olur.
Bu işlem, Unix unlink komutunun yaptığı işlemden pek de farklı değildir.
PHP'deki çoğu söz dizimi oluşumu, gönderim mekanizması üzerinden gerçeklenir, bu bakımdan yukarıda gönderimle ilgili bahsedilenlerin tümü bu oluşumlara da uygulanır. Gönderimle aktarma veya döndürme gibi bazı oluşumlardan yukarıda söz edilmiştir. Gönderimleri kullanan diğer oluşumlar şunlardır:
Bir değişkeni global $değişken deyimi ile bildirdiğiniz zaman aslında küresel bir değişkene bir gönderim oluşturmuş olursunuz. Aşağıdaki örnekte de aynı işlem yapılmaktadır:
<?php
$değişken =& $GLOBALS["değişken"];
?>
Yani, küresel olarak bildirildikten sonra unset($değişken) ile küresel değişkeni tanımsız yapamazsınız, sadece yerel değişken tanımsız olur.
$thisBir nesne yönteminde, $this daima çağrılan nesneye bir gönderimdir.
PHP çalıştırdığı her betiğe çok sayıda evvelce tanımlanmış değişken sağlar. Değişkenler dış kaynaklı değişkenlerden yerleşik ortam değişkenlerine, son hata iletisinden son elde edilen başlıklara kadar geniş bir sahada kendilerini gösterirler.
Ayrıca " register_globals beni nasıl etkiler?" başlıklı SSS kısmına da bakınız.
Süper küreseller — Süper küreseller bütün etki alanlarında daima mevcut olan yerleşik değişkenlerdir
PHP'de öntanımlı değişkenlerin çoğu "süper küresel"dir. Bu, betik boyunca bütün etki alanlarında kullanılabilir oldukları anlamına gelir. İşlevler veya yöntemler içinde bu değişkenlere erişmek için global $değişken; yapmak gerekmez.
Süper küresel değişkenler şunlardır:
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | PHP'ye süper küreseller getirildi. |
Bilginize: Değişken kullanılabilirliği
Öntanımlı olarak, bütün süper küreseller mevcuttur, fakat bunların kullanılabilirliğini etkileyen yönergeler vardır. Daha fazla bilgi için variables_order yönergesine bakınız.
Bilginize:
register_globalsile ilgilenmek
Eğer kullanımdan kaldırılmış olan register_globals yönergesi on olarak belirtilirse değişkenler betiğin küresel etki alanında da kullanılabilir olacaklardır. Örneğin, $_POST['foo'] aynı zamanda $foo olarak da mevcut olacaktır.
İlgili bilgi için, "register_globalsbeni nasıl etkiler?" başlıklı SSS kısmına bakınız.
Bilginize: Değişken değişkenler
Süper küreseller, işlevler veya sınıf yöntemleri içinde değişken değişkenler olarak kullanılamazlar.
$GLOBALS — Küresel alanda bulunan bütün değişkenleri içerir
Geçerli betiğin küresel alanında tanımlı bütün değişkenleri içeren bütünleşik bir dizidir. Değişken isimleri dizinin anahtarlarıdır.
Örnek 1 - $GLOBALS örneği
<?php
function test() {
$foo = "yerel değişken";
echo '$foo küresel alanda: ' . $GLOBALS["foo"] . "\n";
echo '$foo yerel alanda: ' . $foo . "\n";
}
$foo = "Örnek içerik";
test();
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
$foo küresel alanda: Örnek içerik $foo yerel alanda: yerel değişken
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
Bilginize: Değişken kullanılabilirliği
Diğer süper küresellerden farklı olarak, $GLOBALS PHP'de her zaman var olmuştur.
$_SERVER -- $HTTP_SERVER_VARS [kullanımdan kalktı] — Sunucu ve işletme ortamı bilgisi
$_SERVER başlıklar, yollar ve betiklerin yerleri gibi bilgileri içeren bir dizidir. Bu dizideki girdiler HTTP sunucusu tarafından oluşturulur. Her HTTP sunucusu bunları sunacak diye bir garanti yoktur; sunucular bazıları ile işlem yapmayabilir veya burada listelenmeyen başkalarını sağlayabilirler. Bu değişkenlerden çoğu » CGI 1.1 Belirtimi içinde ele alınırlar; yani bunlar genellikle her HTTP sunucusunda desteklenirler.
$HTTP_SERVER_VARS aynı başlangıç bilgisini içerir, fakat bir süper küresel değildir ($HTTP_SERVER_VARS ve $_SERVER farklı değişkenlerdir ve PHP de bu şekilde ele alır).
Aşağıdaki elemanlardan bazılarını $_SERVER içinde belki bulursunuz belki de bulamazsınız. PHP komut satırında çalıştırıldığında bu değişkenlerden bazılarının herhangi bir anlamı varsa komut satırında da kullanılabileceğine dikkat ediniz.
Bilginize: Eğer istek yöntemi HEAD ise PHP betiği başlıklar gönderildikten sonra (çıktının çıktı tamponu olmadan üretilmesinden sonra anlamında) sonlandırılır.
Bilginize: IIS ile ISAPI kullanırken, eğer istek HTTPS protokolü ile yapılmamışsa, bu değerin off olacağına dikkat ediniz.
Bilginize: HTTP sunucunuz bu değişkeni oluşturmak için ayarlanmak zorundadır. Örneğin Apache'de httpd.conf içinde HostnameLookups On olmalıdır. Ayrıca gethostbyaddr() işlevine de bakınız.
Geçerli betiğin mutlak yoludur.
Bilginize: Eğer betik file.php veya ../file.php gibi göreli bir yolla komut satırından çalıştırılırsa, $_SERVER['SCRIPT_FILENAME'] kullanıcı tarafından belirtilen göreli yolu içerir.
Bilginize: PHP 4.3.2'den itibaren PATH_TRANSLATED değeri Apache 2'de Apache 1'in tersine SAPI altında örtük olarak belirtilmez. Apache 1'de bu değer Apache tarafından yerleştirilmediğinde bu değer SCRIPT_FILENAME sunucu değişkeni ile aynı olurdu. Bu değişiklik, PATH_TRANSLATED değişkeninin sadece PATH_INFO değişkeninin tanımlı olması durumunda var olmasını gerektiren CGI belirtimi ile uyum sağlamak için yapılmıştır. Apache 2 kullanıcıları PATH_INFO tanımlatmak için httpd.conf içinde AcceptPathInfo = On yapılandırmasını kullanabilirler.
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | $_SERVER ortaya çıkmış ve $HTTP_SERVER_VARS kullanımdan kaldırılmıştır. |
Örnek 1 - $_SERVER örneği
<?php
echo $_SERVER['SERVER_NAME'];
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
www.example.com
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
$_GET -- $HTTP_GET_VARS [kullanımdan kalktı] — HTTP GET değişkenleri
URL değiştirgeleri üzerinden geçerli betiğe aktarılan değişkenlerden oluşan bir ilişkisel dizi.
$HTTP_GET_VARS aynı başlangıç bilgisini içerir, fakat bir süper küresel değildir. ($HTTP_GET_VARS ve $_GET farklı değişkenlerdir ve PHP de bu şekilde ele alır.)
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | $_GET ortaya çıkmış ve $HTTP_GET_VARS kullanımdan kaldırılmıştır. |
Örnek 1 - $_GET örneği
<?php
echo 'Merhaba ' . htmlspecialchars($_GET["isim"]) . '!';
?>
Kullanıcının http://mesela.dom/?isim=Elif adresini çağırdığı varsayılarak
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Merhaba Elif!
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
$_POST -- $HTTP_POST_VARS [kullanımdan kalktı] — HTTP POST değişkenleri
HTTP POST yöntemi kullanılarak geçerli betiğe aktarılan bütünleşik değişkenler dizisi.
$HTTP_POST_VARS aynı başlangıç bilgisini içerir, fakat bir süper küresel değildir. ($HTTP_POST_VARS ve $_POST farklı değişkenlerdir ve PHP de bu şekilde ele alır.)
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | $_POST ortaya çıkmış ve $HTTP_POST_VARS kullanımdan kaldırılmıştır. |
Örnek 1 - $_POST örneği
<?php
echo 'Merhaba ' . htmlspecialchars($_POST["isim"]) . '!';
?>
Kullanıcının POST ile isim=Gizem gönderdiği varsayılarak
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Merhaba Gizem!
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
$_FILES -- $HTTP_POST_FILES [kullanımdan kalktı] — HTTP Dosya Yükleme değişkenleri
HTTP POST yönetimi kullanılarak geçerli betiğe yüklenen bütünleşik öğe dizisi.
$HTTP_POST_FILES aynı başlangıç bilgisini içerir, fakat bir süper küresel değildir. ($HTTP_POST_FILES ve $_FILES farklı değişkenlerdir ve PHP de bu şekilde ele alır.)
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | $_FILES ortaya çıkmış ve $HTTP_POST_FILES kullanımdan kaldırılmıştır. |
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
$_REQUEST — HTTP İstek değişkenleri
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | request_order yönergesi ilk olarak bu sürümde kullanılmıştır. Bu yönerge $_REQUEST içeriğini etkiler. |
| 4.3.0 | $_FILES bilgisi $_REQUEST'ten çıkarılmıştır. |
| 4.1.0 | $_REQUEST ortaya çıkmıştır. |
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
Bilginize: Komut satırından çalışmada, bu dizi argv ve argc girdilerinde içerilmez; bunlar $_SERVER dizisinde bulunur.
Bilginize: $_REQUEST içindeki değişkenler betiğe GET, POST, ve COOKIE girdi mekanizmaları ile sağlanır ve bu nedenle uzak kullanıcı tarafından değiştirilebilir ve bunlara güvenilemez. Bu dizide listelenen değişkenlerin varlıkları ve sıraları PHP variables_order yapılandırma yönergesine göre tanımlanır.
$_SESSION -- $HTTP_SESSION_VARS [kullanımdan kalktı] — Oturum değişkenleri
Geçerli betikte kullanılabilecek oturum değişkenlerini içeren bir ilişkisel dizidir. Nasıl kullanıldığıyla ilgili daha fazla bilgi için Oturum İşlevleri belgesine bakınız.
$HTTP_SESSION_VARS aynı başlangıç bilgisini içerir, fakat bir süper küresel değildir ($HTTP_SESSION_VARS ve $_SESSION farklı değişkenlerdir ve PHP de bu şekilde ele alır).
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | $_SESSION ortaya çıkmış ve $HTTP_SESSION_VARS kullanımdan kaldırılmıştır. |
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
$_ENV -- $HTTP_ENV_VARS [kullanımdan kalktı] — Ortam değişkenleri
Ortam yönetimi kullanılarak geçerli betiğe aktarılan bütünleşik ortam değişkenleri dizisi.
Bu değişkenler PHP yazım denetleyicisinin çalıştığı ortamdan PHP'nin küresel isim alanına ithal edilir. Çoğu PHP'nin altında çalıştığı kabuk (shell) tarafından sağlanır. Farklı sistemler farklı türde kabuklar çalıştırırlar, bu bakımdan tam bir tanımlı ortam değişkenleri listesi verilemez. Lütfen tanımlı ortam değişkenleri listesi için kullandığınız kabuğun belgelerine bakınız.
Diğer ortam değişkenleri, CGI değişkenlerini içerir ve PHP'nin bir sunucu hizmeti olarak mı yoksa CGI işlemcisi olarak mı çalıştığına bakmaksızın yerleştirilirler.
$HTTP_ENV_VARS aynı başlangıç bilgisini içerir, fakat bir süper küresel değildir. ($HTTP_ENV_VARS ve $_ENV farklı değişkenlerdir ve PHP de bu şekilde ele alır.)
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | $_ENV ortaya çıkmış ve $HTTP_ENV_VARS kullanımdan kaldırılmıştır. |
Örnek 1 - $_ENV örneği
<?php
echo 'Benim adım ' .$_ENV["USER"] . '!';
?>
Bu betiği "yasar" isimli kullanıcının çalıştırdığı varsayılarak
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Benim adım yasar!
Bilginize: Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
$php_errormsg — Önceki hata iletisi
$php_errormsg PHP tarafından üretilen son hata iletisinin metnini içeren bir değişkendir. Bu değişken sadece hatanın oluştuğu alan içinde ve sadece track_errors ayar seçeneği açıldıysa (öntanımlı değeri kapalıdır) geçerlidir.
Bilginize: Bu değişken sadece php.ini içindeki track_errors yönergesi etkin olduğunda kullanılabilir.
Eğer bir kullanıcı tanımlı hata eylemcisi (set_error_handler()) atanmışsa $php_errormsg değişkenine sadece hata eylemcisi FALSE döndürürse bir değer atanır.
Örnek 1 - $php_errormsg örneği
<?php
@strpos();
echo $php_errormsg;
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Wrong parameter count for strpos()
$HTTP_RAW_POST_DATA — Ham POST verisi
$HTTP_RAW_POST_DATA ham POST verisi içerir. Bakınız, always_populate_raw_post_data
$http_response_header — HTTP yanıt başlıkları
$http_response_header dizisi get_headers() işlevi gibidir. HTTP sarmalayıcı kullanılırken, $http_response_header HTTP yanıt başlıklarından oluşturulur.
Örnek 1 - $http_response_header örneği
<?php
file_get_contents("http://mesela.dom");
var_dump($http_response_header);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
array(9) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
[2]=>
string(29) "Server: Apache/2.2.3 (CentOS)"
[3]=>
string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
[4]=>
string(27) "ETag: "280100-1b6-80bfd280""
[5]=>
string(20) "Accept-Ranges: bytes"
[6]=>
string(19) "Content-Length: 438"
[7]=>
string(17) "Connection: close"
[8]=>
string(38) "Content-Type: text/html; charset=UTF-8"
}
$argc — Betiğe geçirilen ifade sayısı
Komut satırından çalıştığında geçerli betiğe aktarılan ifade sayısını içerir.
Bilginize: Betiğin dosya adı her zaman ilk ifade olarak betiğe geçirilir, bu nedenle $argc'nin asgari değeri 1'dir.
Bilginize: Bu değişken sadece register_argc_argv etkin olduğunda kullanılabilir.
Örnek 1 - $argc örneği
<?php
var_dump($argc);
?>
Örneği şu şekilde çalıştırınca: php betik.php arg1 arg2 arg3
Yukarıdaki örnek şuna benzer bir çıktı üretir:
int(4)
$argv — Betiğe geçirilen ifade dizisi
komut satırından çalıştığında betiğe aktarılan ifade dizi'sini içerir.
Bilginize: İlk ifade her zaman geçerli betiğin adıdır, bu nedenle $argv[0] betiğin adıdır.
Bilginize: Bu değişken sadece register_argc_argv etkin olduğunda kullanılabilir.
Örnek 1 - $argv örneği
<?php
var_dump($argv);
?>
Örneği şu şekilde çalıştırınca: php betik.php arg1 arg2 arg3
Yukarıdaki örnek şuna benzer bir çıktı üretir:
array(4) {
[0]=>
string(10) "betik.php"
[1]=>
string(4) "arg1"
[2]=>
string(4) "arg2"
[3]=>
string(4) "arg3"
}
Ayrıca bakınız: SPL İstisnaları
Exception tüm istisnalar için temel sınıftır.
İstisna iletisi.
İstisnanın yerleşik ismi.
İstisna kodu.
İstisnanın oluştuğu dosyanın ismi.
İstisnanın oluştuğu satırın numarası.
İstisnanın yığıt izi.
(PHP 5 >= 5.1.0)
Exception::__construct — İstisna oluşturur
İstisna oluşturur.
Oluşturulan istisna iletisi.
İstisna kodu.
İstisna zincirindeki önceki istisna.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | previous değiştirgesi eklendi. |
(PHP 5 >= 5.1.0)
Exception::getMessage — İstisna iletisi ile döner
İstisna iletisi ile döner.
Bu işlevin değiştirgesi yoktur.
İstisna iletisi bir dizge olarak döner.
Örnek 1 - Exception::getMessage() örneği
<?php
try {
throw new Exception("Bir hata iletisi");
} catch(Exception $e) {
echo $e->getMessage();
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Bir hata iletisi
(PHP 5 >= 5.3.0)
Exception::getPrevious — Önceki istisnayı döndürür
Önceki istisnayı döndürür ( Exception::__construct kurucusunun üçüncü değiştirgesi).
Bu işlevin değiştirgesi yoktur.
Mümkünse önceki Exception nesnesi, yoksa NULL döner.
Örnek 1 - Exception::getPrevious örneği
Döngüsel olarak ve çıktılıyarak istisna izleme.
<?php
class MyCustomException extends Exception {}
function doStuff() {
try {
throw new InvalidArgumentException("Yanlış yapıyorsunuz!", 112);
} catch(Exception $e) {
throw new MyCustomException("Bir şeyler oldu", 911, $e);
}
}
try {
doStuff();
} catch(Exception $e) {
do {
printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(),
$e->getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
/home/bjori/ex.php:8 Bir şeyler oldu (911) [MyCustomException] /home/bjori/ex.php:6 Yanlış yapıyorsunuz! (112) [InvalidArgumentException]
(PHP 5 >= 5.1.0)
Exception::getCode — İstisnanın numarası ile döner
İstisna numarasıyla döner.
Bu işlevin değiştirgesi yoktur.
İstisna numarası bir integer olarak döner.
Örnek 1 - Exception::getCode() örneği
<?php
try {
throw new Exception("Bir hata iletisi", 30);
} catch(Exception $e) {
echo "İstisna numarası: " . $e->getCode();
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
İstisna numarası: 30
(PHP 5 >= 5.1.0)
Exception::getFile — İstisnanın oluştuğu dosyanın adı ile döner
İstisnanın oluştuğu dosyanın adı ile döner.
Bu işlevin değiştirgesi yoktur.
İstisnanın oluştuğu dosyanın adı ile döner.
Örnek 1 - Exception::getFile() örneği
<?php
try {
throw new Exception;
} catch(Exception $e) {
echo $e->getFile();
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
/home/bjori/tmp/ex.php
(PHP 5 >= 5.1.0)
Exception::getLine — İstisnanın oluştuğu satırın numarası ile döner
İstisnanın oluştuğu satırın numarası ile döner.
Bu işlevin değiştirgesi yoktur.
İstisnanın oluştuğu satırın numarası ile döner.
Örnek 1 - Exception::getLine() örneği
<?php
try {
throw new Exception("Bir hata iletisi");
} catch(Exception $e) {
echo "İstisnanın oluştuğu satırın numarası: " . $e->getLine();
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
İstisnanın oluştuğu satırın numarası: 3
(PHP 5 >= 5.1.0)
Exception::getTrace — Yığıt iziyle döner
İstisna yığıtının iziyle döner.
Bu işlevin değiştirgesi yoktur.
İstisna yığıtının izini bir dizi olarak döndürür.
Örnek 1 - Exception::getTrace() örneği
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
array(1) {
[0]=>
array(4) {
["file"]=>
string(22) "/home/bjori/tmp/ex.php"
["line"]=>
int(7)
["function"]=>
string(4) "test"
["args"]=>
array(0) {
}
}
}
(PHP 5 >= 5.1.0)
Exception::getTraceAsString — Yığıt izini bir dizge olarak döndürür
İstisna yığıtının izini bir dizge olarak döndürür.
Bu işlevin değiştirgesi yoktur.
İstisna yığıtının izini bir dizge olarak döndürür.
Örnek 1 - Exception::getTraceAsString() örneği
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
echo $e->getTraceAsString();
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}
(PHP 5 >= 5.1.0)
Exception::__toString — İstisnanın dizgesel gösterimiyle döner
İstisnanın string türündeki gösterimiyle döner.
Bu işlevin değiştirgesi yoktur.
İstisnanın string türündeki gösterimiyle döner.
Örnek 1 - Exception::__toString() örneği
<?php
try {
throw new Exception("Bir hata iletisi");
} catch(Exception $e) {
echo $e;
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
exception 'Exception' with message 'Bir hata iletisi' in /home/nilgun/tmp/ex.php:3
Stack trace:
#0 {main}
(PHP 5 >= 5.1.0)
Exception::__clone — İstisna kopyası
Ölümcül hatayla sonuçlanan istisnayı kopyalamaya çalışır.
Bu işlevin değiştirgesi yoktur.
Hiçbir değer dönmez.
İstisnalar kopyalanabilir değildir.
Bir hata istisnası.
İstisnanın önem derecesi
Örnek 1 - Hata iletilerinin set_error_handler() ile ErrorException içinde döndürülmesi
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
/* İstisnayı oluşturalım */
strpos();
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Fatal error: Uncaught exception 'ErrorException' with message 'Wrong parameter count for strpos()' in /home/bjori/tmp/ex.php:8
Stack trace:
#0 [internal function]: exception_error_handler(2, 'Wrong parameter...', '/home/bjori/php...', 8, Array)
#1 /home/bjori/php/cleandocs/test.php(8): strpos()
#2 {main}
thrown in /home/bjori/tmp/ex.php on line 8
(PHP 5 >= 5.1.0)
ErrorException::__construct — İstisna oluşturur
İstisna oluşturur.
Oluşturulan istisna iletisi.
İstisnanın numarası.
İstisnanın önem derecesi.
İstisnanın oluştuğu dosyanın adı.
İstisnanın oluştuğu satırın numarası.
(PHP 5 >= 5.1.0)
ErrorException::getSeverity — İstisnanın önem derecesi ile döner
İstisnanın önem derecesini döndürür.
Bu işlevin değiştirgesi yoktur.
İstisnanın önem derecesini döndürür.
Örnek 1 - ErrorException::getSeverity() örneği
<?php
try {
throw new ErrorException("İstisna iletisi", 0, 75);
} catch(ErrorException $e) {
echo "Bu istisnanın önem derecesi: " . $e->getSeverity();
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Bu istisnanın önem derecesi: 75
Ayrıca bakınız: SPL Arayüzleri
Bir sınıf foreach kullanarak çaprazlanabiliyorsa bunu saptayan arayüz.
Tek başına gerçeklenemeyen bir soyut temel arayüz olup ya IteratorAggregate ya da Iterator olarak gerçeklenmelidir.
Bilginize: Bu arayüzü gerçekleyen yerleşik sınıflar bir foreach oluşumunda kullanılabilir ve IteratorAggregate ya da Iterator olarak gerçeklenmeleri gerekmez.
Bilginize: Bu dahili bir motor arayüz olup PHP betiklerinde gerçeklenemez. Yerine IteratorAggregate veya Iterator kullanılmalıdır.
Bu arayüzün yöntemleri yoktur. Tek amacı çaprazlanabilir tüm sınıflar için temel arayüz olmaktır.
Kendilerini dahili olarak yineleyebilen nesneler ve harici yineleyiciler için arayüz.
Örnek 1 Temel Kullanımı
Bu örnekte, bir yineleyici üzerinde foreach yaparken hangi yöntemlerin çağrıldığı gösterilmiştir.
<?php
class Yineleyicim implements Iterator {
private $position = 0;
private $array = array(
"ilkeleman",
"ikincieleman",
"soneleman",
);
public function __construct() {
$this->position = 0;
}
function rewind() {
var_dump(__METHOD__);
$this->position = 0;
}
function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}
function key() {
var_dump(__METHOD__);
return $this->position;
}
function next() {
var_dump(__METHOD__);
++$this->position;
}
function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
}
$it = new Yineleyicim;
foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
string(19) "Yineleyicim::rewind" string(18) "Yineleyicim::valid" string(20) "Yineleyicim::current" string(16) "Yineleyicim::key" int(0) string(9) "ilkeleman" string(17) "Yineleyicim::next" string(18) "Yineleyicim::valid" string(20) "Yineleyicim::current" string(16) "Yineleyicim::key" int(1) string(12) "ikincieleman" string(17) "Yineleyicim::next" string(18) "Yineleyicim::valid" string(20) "Yineleyicim::current" string(16) "Yineleyicim::key" int(2) string(9) "soneleman" string(17) "Yineleyicim::next" string(18) "Yineleyicim::valid"
(PHP 5 >= 5.1.0)
Iterator::current — O anki elemanı döndürür
Bu işlevin değiştirgesi yoktur.
Her türde değer dönebilir.
(PHP 5 >= 5.1.0)
Iterator::key — O anki elemanın anahtarını döndürür
O anki elemanın anahtarını döndürür.
Bu işlevin değiştirgesi yoktur.
Başarı durumunda sayıl değer, aksi takdirde integer 0 döner.
Başarısızlık durumunda bir E_WARNING çıktılanır.
(PHP 5 >= 5.1.0)
Iterator::next — Konumu sonraki elemana ilerletir
O anki konumu sonraki elemana ilerletir.
Bilginize: Bu işlev her foreach döngüsünün ardından çağrılır.
Bu işlevin değiştirgesi yoktur.
Dönen değer olursa yok sayılır.
(PHP 5 >= 5.1.0)
Iterator::rewind — Yineleyiciyi ilk elemana konumlandırır
Yineleyiciyi başa ilk elemana döndürür.
Bilginize: Bir foreach döngüsü başlatılırkan çağrılan ilk yöntemdir. foreach döngüsünden sonra çalıştırılmaz.
Bu işlevin değiştirgesi yoktur.
Dönen değer olursa yok sayılır.
(PHP 5 >= 5.1.0)
Iterator::valid — O anki konum geçerli mi diye bakar
Bu yöntem o anki konumun geçerli olup olmadığını sınamak için Iterator::rewind ve Iterator::next yöntemlerinden sonra çağrılır.
Bu işlevin değiştirgesi yoktur.
Dönüş değeri boolean türüne dönüştürüldükten sonra döndürülür. Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Harici bir yineleyici oluşturmak için arayüz.
Örnek 1 - Temel kullanımı
<?php
class Verilerim implements IteratorAggregate {
public $özellik1 = "Birinci genel özellik";
public $özellik2 = "İkinci genel özellik";
public $özellik3 = "Üçüncü genel özellik";
public function __construct() {
$this->özellik4 = "son özellik";
}
/* PHP, tr_TR yerelinde bu yöntemi de arıyor, yoksa
* "Fatal error: Couldn't find implementation for method
* Verilerim::getiterator in Unknown on line 0"
* hatasını veriyor.
*/
public function getiterator() {
return new ArrayIterator($this);
}
public function getIterator() {
return new ArrayIterator($this);
}
}
$obj = new Verilerim;
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
string(9) "özellik1" string(22) "Birinci genel özellik" string(9) "özellik2" string(22) "İkinci genel özellik" string(9) "özellik3" string(25) "Üçüncü genel özellik" string(9) "özellik4" string(12) "son özellik"
(PHP 5 >= 5.1.0)
IteratorAggregate::getIterator — Harici bir yineleyici ile döner
Harici bir yineleyici ile döner.
Bu işlevin değiştirgesi yoktur.
Traversable veya Iterator arayüzünü gerçekleyen nesnenin bir örneğiyle döner.
Başarısızlık durumunda bir istisna (Exception) oluşur.
ArrayAccess arayüzüNesnelere birer dizi olarak erişmeyi sağlayan arayüz.
Örnek 1 Temel kullanım
<?php
class obj implements arrayaccess {
private $container = array();
public function __construct() {
$this->container = array(
"bir" => 1,
"iki" => 2,
"üç" => 3,
);
}
public function offsetSet($offset, $value) {
$this->container[$offset] = $value;
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
$obj = new obj;
var_dump(isset($obj["iki"]));
var_dump($obj["iki"]);
unset($obj["iki"]);
var_dump(isset($obj["iki"]));
$obj["iki"] = "Bir değer";
var_dump($obj["iki"]);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
bool(true) int(2) bool(false) string(7) "Bir değer"
(PHP 5 >= 5.1.0)
ArrayAccess::offsetExists — Bir konumun mevcut olup olmadığına bakar
Bir konumun mevcut olup olmadığına bakar.
ArrayAccess arayüzünü gerçekleyen nesneler üzerinde isset() veya empty() kullanıldığında bu yöntem çalıştırılır.
Bilginize: empty() işlevi kullanıldığında ArrayAccess::offsetGet() çağrılır ve sadece dönen değer TRUE olduğu takdirde konumun boş olup olmadığına bakılır.
Varlığı sınanacak konum.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Bilginize: Dönüş değeri boolean türünde değilse tür dönüşümü yapıldıktan sonra döndürülür.
Örnek 1 - ArrayAccess::offsetExists() örneği
<?php
class Sınıf implements arrayaccess {
public function offsetSet($konum, $değer) {
var_dump(__METHOD__);
}
public function offsetExists($var) {
var_dump(__METHOD__);
if ($var == "filanca") {
return true;
}
return false;
}
public function offsetUnset($var) {
var_dump(__METHOD__);
}
public function offsetGet($var) {
var_dump(__METHOD__);
return "değer";
}
}
$nesne = new Sınıf;
echo "Sınıf::offsetExists() çalışır\n";
var_dump(isset($nesne["filanca"]));
echo "\nSınıf::offsetExists() ve Sınıf::offsetGet() çalışır\n";
var_dump(empty($nesne["filanca"]));
echo "\nSınıf::offsetExists() çalışır, alınacak bir şey olmadığından Sınıf::offsetGet() çalışmaz\n";
var_dump(empty($nesne["falanca"]));
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Sınıf::offsetExists() çalışır string(21) "Sınıf::offsetExists" bool(true) Sınıf::offsetExists() ve Sınıf::offsetGet() çalışır string(21) "Sınıf::offsetExists" string(18) "Sınıf::offsetGet" bool(false) Sınıf::offsetExists() çalışır, alınacak bir şey olmadığından Sınıf::offsetGet() çalışmaz string(21) "Sınıf::offsetExists" bool(true)
(PHP 5 >= 5.1.0)
ArrayAccess::offsetGet — Konumdaki değeri döndürür
Belirtilen konumdaki değeri döndürür.
Bu yöntem, empty() işlevi ile konumun boş olup olmadığına bakılırken çalıştırılır.
Değerin döndürüleceği konum.
Her türde değer dönebilir.
(PHP 5 >= 5.1.0)
ArrayAccess::offsetSet — Konuma değer atanır
Belirtilen konuma belirtilen değer atanır.
Değerin atanacağı konum.
Atanacak değer.
Hiçbir değer dönmez.
Bilginize: Aşağıdaki örnekte olduğu gibi, başka bir değer mümkün değilse konum değiştirgesine NULL atanır.
<?php
$arrayaccess[] = "value";
?>
(PHP 5 >= 5.1.0)
ArrayAccess::offsetUnset — Konum boşaltılır
Boşaltılacak konum.
Hiçbir değer dönmez.
Serializable arayüzüDizgeleştirmeyi özelleştirme arayüzü.
Bu arayüzü gerçekleyen sınıflar __sleep() ve __wakeup() işlevlerini desteklemezler. Bir örneğin
dizgeleştirilmesi gerektiğinde serialize yöntemi çağrılır.
Bunun __destruct() çağırmak veya yöntem içinde tanımlanmamış
bir işlemi yapmak gibi bir yan etkisi yoktur. Dizgeleştirilmiş nesne
yeniden oluşturulmak istendiğinde sınıf bilinmekte olur ve kurucu olarak
__construct() yerine ilgili unserialize()
yöntemi çağrılır. Eğer standart kurucuyu çalıştırmak isterseniz bunu
yöntemin içinde yapmanız gerekir.
Örnek 1 Temel kullanım
<?php
class obj implements Serializable {
private $data;
public function __construct() {
$this->data = "Özel verim";
}
public function serialize() {
return serialize($this->data);
}
public function unserialize($data) {
$this->data = unserialize($data);
}
public function getData() {
return $this->data;
}
}
$obj = new obj;
$ser = serialize($obj);
$newobj = unserialize($ser);
var_dump($newobj->getData());
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
string(11) "Özel verim"
(PHP 5 >= 5.1.0)
Serializable::serialize — Nesnenin dizgesel gösterimiyle döner
Nesnenin dizgesel gösterimi ile döner.
Bilginize: Bu yöntem nesnenin bir yıkıcısı olarak işlem görür. Bu yöntemden sonra __destruct() yöntemi çağrılmaz.
Bu işlevin değiştirgesi yoktur.
Bir hata oluşmamışsa nesnenin dizgesel gösterimi ile, aksi takdirde NULL ile döner.
(PHP 5 >= 5.1.0)
Serializable::unserialize — Dizgeleştirilmiş nesneyi yeniden oluşturur
Dizgeleştirilmiş nesne yeniden oluşturulmak istendiğinde çağrılır.
Bilginize: Bu yöntem nesnenin kurucusu olarak işlem görür. Bu yöntemin ardından __construct() yöntemi çağrılmaz.
Nesnenin dizgesel gösterimi.
Dizgeleşmiş nesnenin yeniden oluşturulan özgün halini döndürür.
PHP, tüm dosya sistemi ve akım sarmalayıcılarla kullanılabilen çeşitli bağlam seçenekleri ve değiştirgelerine sahiptir. Bağlam stream_context_create() ile oluşturulur. Seçenekler stream_context_set_option() ile değiştirgeleri ise stream_context_set_params() ile atanır.
Soket bağlamı seçenekleri — Soket bağlamı seçeneklerinin listesi
Soket bağlamı seçenekleri, tcp, http ve ftp gibi soketler üzerinde çalışan tüm sarmalayıcılar için kullanılabilir.
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 | bindto eklendi. |
Örnek 1 - Temel bindto kullanım örneği
<?php
// internete '192.168.0.100' IP'yi kullanarak bağlanalım
$seçenekler = array(
'socket' => array(
'bindto' => '192.168.0.100:0',
),
);
// internete '192.168.0.100' IP ve port '7000' üzerinden bağlanalım
$seçenekler = array(
'socket' => array(
'bindto' => '192.168.0.100:7000',
),
);
// internete port '7000' üzerinden bağlanalım
$seçenekler = array(
'socket' => array(
'bindto' => '0:7000',
),
);
// bağlamı oluşturalım...
$bağlam = stream_context_create($seçenekler);
// ...ve veri çekmek için kullanalım
echo file_get_contents('http://misal.dom', false, $bağlam);
?>
HTTP bağlamı seçenekleri — HTTP bağlamı seçeneklerinin listesi
http:// ve https:// aktarımları için bağlam seçenekleri.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | protocol_version yönergesine 1.1 atandığında parçalı aktarım kodlaması artık desteklenmektedir. |
| 5.2.10 | ignore_errors eklendi. |
| 5.2.10 | Artık header sayısal indisli bir dizi olabilmektedir. |
| 5.2.1 | timeout eklendi. |
| 5.1.0 | HTTP vekilleri üzerinden HTTPS vekaleti eklendi. |
| 5.1.0 | max_redirects eklendi. |
| 5.1.0 | protocol_version eklendi. |
Örnek 1 - Bir sayfayı çekip veriyi POST ile göndermek
<?php
$postverisi = http_build_query(
array(
'var1' => 'biraz içerik',
'var2' => 'eh işte'
)
);
$seçenekler = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postverisi
)
);
$bağlam = stream_context_create($seçenekler);
$sonuç = file_get_contents('http://mesela.dom/submit.php', false, $bağlam);
?>
Bilginize: Temel soket akımı bağlamı seçenekleri
Ek bağlamsal seçenekler temel aktarım tarafından desteklenebilir. http:// akımları için tcp:// aktarımının bağlamsal seçeneklerine atıf yapılır. https:// akımları için ise ssl:// aktarımının bağlamsal seçeneklerine atıf yapılır.
FTP bağlamı seçenekleri — FTP bağlamı seçeneklerinin listesi
ftp:// ve ftps:// aktarımları için bağlamsal seçenekler.
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 | proxy eklendi. |
| 5.0.0 | overwrite ve resume_pos eklendi. |
Bilginize: Temel soket akımı bağlamı seçenekleri
Ek bağlamsal seçenekler temel aktarım tarafından desteklenebilir. ftp://akımları için tcp:// aktarımının bağlamsal seçeneklerine atıf yapılır. ftps:// akımları için ise ssl:// aktarımının bağlamsal seçeneklerine atıf yapılır.
SSL bağlamı seçenekleri — SSL bağlamı seçeneklerinin listesi
ssl:// ve tls:// aktarımları için bağlamsal seçenekler.
| Sürüm: | Açıklama |
|---|---|
| 5.0.0 | capture_peer_cert , capture_peer_chain ve ciphers eklendi. |
Bilginize: https:// ve ftps:// sarmalayıcıları için ssl:// temel aktarım olduğundan, ssl://'e uygulanan bağlamsal seçenekler ayrıca https:// ve ftps://'e de uygulanır.
CURL bağlamı seçenekleri — CURL bağlamı seçeneklerinin listesi
CURL bağlam seçenekleri, CURL eklentisi --with-curlwrappers yapılandırma seçeneği kullanılarak derlenmişse kullanılabilir.
Örnek 1 - Bir sayfayı çekip veriyi POST ile göndermek
<?php
$postverisi = http_build_query(
array(
'var1' => 'biraz içerik',
'var2' => 'eh işte'
)
);
$seçenekler = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postverisi
)
);
$bağlam = stream_context_create($seçenekler);
$sonuç = file_get_contents('http://mesela.dom/submit.php', false, $bağlam);
?>
Phar bağlam seçenekleri — Phar bağlamı seçeneklerinin listesi
phar:// sarmalayıcısı için bağlam seçenekleri.
Bağlam değiştirgeleri — Bağlam değiştirgesi listeleme
Bu değiştirgeler bir bağlama stream_context_set_params() işlevi kullanılarak atanabilir.
PHP güçlü bir dil ve yorumlayıcıdır. İster bir HTTP sunucusunun modülü olarak ister ayrı bir CGI çalıştırılabiliri olarak çalışıyor olsun, sunucu üzerinde ağ bağlantıları açabilir, dosyalara erişebilir ve onları çalıştırabilir. Herşeyi çalıştırılabilir yapan bu özellikler öntanımlı haliyle bir HTTP sunucusunu güvensiz duruma getirir. PHP, CGI programları yazmak için özellikle Perl ve C'den daha güvenli bir dil olması için tasarlanmıştır. Doğru derleme seçenekleri ile derlenir, doğru çalışma anı seçenekleriyle yapılandırılır ve uygun bir kodlama deneyimiyle kullanılırsa arzuladığınız güvenlik ve özgürlüğü size sunar.
PHP ile birçok şey yapmak mümkün olduğu gibi, ayarları da oldukça fazladır. Bu ayarların çokluğu size istediğiniz şekilde bir sunucu ortamını kurmanızı sağlarsa da bu seçeneklerle sunucunun yapılandırması bir araya geldiğinde güvensiz bir ortam oluşma riski anlamına da gelebilir.
PHP yapılandırmasındaki bu esneklik, kod esnekliğiyle rekabet halinde gelişir. PHP ile bir kabuk kullanıcısının tüm gücüne sahip eksiksiz sunucu uygulamaları geliştirlebileceği gibi sıkı bir şekilde denetlenen bir ortamda küçük bir güvenlik riskiyle sunucu taraflı sayfalar oluşturmakta da kullanılabilir. Bu ortamın nasıl kurulacağı ve güvenliğinin nasıl sağlanacağı büyük oranda PHP geliştiricisine bırakılmıştır.
Bu kısıma genel güvenlik tavsiyeleri vererek başlayacağız. Ardından değişik ayarların nasıl yapıldığına dair bilgiler verecek ve hangi güvenlik seviyesinde hangi güvenlik ayarlarının kullanılması gerektiğinden bahsedeceğiz.
Tamamen güvenli ve korunaklı bir sistem oluşturduk diyebilmek neredeyse imkansızdır. Bu sebepten dolayı en uygun davranış riskleri ve kullanılabilirliği uygun şekilde dengelemek olmalıdır. Eğer kullanıcıların bilgi göndermeden önce parmak izi ve gözbebeği taraması gibi ileri güvenlikli bir sistemden geçmesi gerekirse, çok güvenli bir sistem oluşturulduğundan söz edebiliriz. Ancak bu şekilde kullanımı çok zor bir sistem halini alacaktır. Aynı şekilde basit bir amaç için hazırlanmış bir formu doldurmak çok zorsa ve vakit alıyorsa, bunu dolduran kullanıcı güvenliği atlatıp bazı kestirme yolları deneyerek formu göndermek isteyebilir.
En iyi güvenlik sisteminin yolu istenen güvenlik denetimlerinin kullanıcı çok uğraştırılıp bıktırılmadan, yapmak istediği şeye engel olunmadan kurulan bir sistemden geçer. Güvenliği etkileyen bazı saldırıların asıl amacı bazen güvenlik amaçlı kurulan bazı sistemlerin kullanıcıları bıktırması ve bunların kullanıcıyı farklı birşeyler yapmaya itmesidir.
Unutmayın ki, bir zincir ancak en zayıf halkası kadar güçlü olabilir. Tüm hareketleri, zaman, mekan, hareket türü gibi en ince ayrıntısına kadar günlüklere kaydetseniz bile kullanıcı sadece basit bir çerez ile doğrulanıyorsa, kullanıcılarla hareket günlükleri arasındaki ilişki zayıf olacaktır.
Yaptıklarınızı denerken, en basit sayfada bile tüm olasılıkları denemenin imkansız olduğunu unutmayınız. Uygulamanıza ulaşan bilgi şirketinizde çalışan bir tanıdıktan gelebileceği gibi, klavyenin üzerinde dolaşan bir kediden veya dünyanın öteki ucundan sistemlerde açıklar arayan sistem kırıcı birinden de gelebilir. Bu yüzden beklenmeyen bir bilgi geldiğinde nasıl davranılacağını önceden tespit edip, bu durumda kullanıcının uygulamayı kullanarak sisteme erişmesini engellemelisiniz.
Günümüz Genel Ağ'ı, kodunuzu kırarak, sitenizi çökerterek, uygunsuz içerik göndererek veya gününüzü bir şekilde ziyan ederek kendilerine isim yapmaya çalışan kişilerle doludur. Sitenizin küçük ya da büyük olmasının bir önemi yoktur, siz basitçe hatta kalmayı, bağlanacağınız bir sunucu olmasını hedeflersiniz fakat, çoğu kırıcı program için büyüklüğün önemi yoktur, basitçe devasa IP bloklarını tarayarak kendilerine kurban ararlar. Onların kurbanlarından biri olmamaya çalışın.
Using PHP as a CGI binary is an option for setups that for some reason do not wish to integrate PHP as a module into server software (like Apache), or will use PHP with different kinds of CGI wrappers to create safe chroot and setuid environments for scripts. This setup usually involves installing executable PHP binary to the web server cgi-bin directory. CERT advisory » CA-96.11 recommends against placing any interpreters into cgi-bin. Even if the PHP binary can be used as a standalone interpreter, PHP is designed to prevent the attacks this setup makes possible:
If your server does not have any content that is not restricted by password or ip based access control, there is no need for these configuration options. If your web server does not allow you to do redirects, or the server does not have a way to communicate to the PHP binary that the request is a safely redirected request, you can specify the option --enable-force-cgi-redirect to the configure script. You still have to make sure your PHP scripts do not rely on one or another way of calling the script, neither by directly http://my.host/cgi-bin/php/dir/script.php nor by redirection http://my.host/dir/script.php.
Redirection can be configured in Apache by using AddHandler and Action directives (see below).
The configuration directive cgi.force_redirect prevents anyone from calling PHP directly with a URL like http://my.host/cgi-bin/php/secretdir/script.php. Instead, PHP will only parse in this mode if it has gone through a web server redirect rule. PHP older than 4.2.0 used --enable-force-cgi-redirect compile time option for this.
Usually the redirection in the Apache configuration is done with the following directives:
Action php-script /cgi-bin/php AddHandler php-script .php
This option has only been tested with the Apache web server, and relies on Apache to set the non-standard CGI environment variable REDIRECT_STATUS on redirected requests. If your web server does not support any way of telling if the request is direct or redirected, you cannot use this option and you must use one of the other ways of running the CGI version documented here.
To include active content, like scripts and executables, in the web server document directories is sometimes considered an insecure practice. If, because of some configuration mistake, the scripts are not executed but displayed as regular HTML documents, this may result in leakage of intellectual property or security information like passwords. Therefore many sysadmins will prefer setting up another directory structure for scripts that are accessible only through the PHP CGI, and therefore always interpreted and not displayed as such.
Also if the method for making sure the requests are not redirected, as described in the previous section, is not available, it is necessary to set up a script doc_root that is different from web document root.
You can set the PHP script document root by the configuration directive doc_root in the configuration file, or you can set the environment variable PHP_DOCUMENT_ROOT. If it is set, the CGI version of PHP will always construct the file name to open with this doc_root and the path information in the request, so you can be sure no script is executed outside this directory (except for user_dir below).
Another option usable here is user_dir. When user_dir is unset, only thing controlling the opened file name is doc_root . Opening a URL like http://my.host/~user/doc.php does not result in opening a file under users home directory, but a file called ~user/doc.php under doc_root (yes, a directory name starting with a tilde [~]).
If user_dir is set to for example public_php, a request like http://my.host/~user/doc.php will open a file called doc.php under the directory named public_php under the home directory of the user. If the home of the user is /home/user, the file executed is /home/user/public_php/doc.php.
user_dir expansion happens regardless of the doc_root setting, so you can control the document root and user directory access separately.
A very secure option is to put the PHP parser binary somewhere outside of the web tree of files. In /usr/local/bin, for example. The only real downside to this option is that you will now have to put a line similar to:
#!/usr/local/bin/php
as the first line of any file containing PHP tags. You will also need to make the file executable. That is, treat it exactly as you would treat any other CGI script written in Perl or sh or any other common scripting language which uses the #! shell-escape mechanism for launching itself.
To get PHP to handle PATH_INFO and PATH_TRANSLATED information correctly with this setup, the PHP parser should be compiled with the --enable-discard-path configure option.
PHP bir Apache modülü olarak kullanıldığında Apache kullanıcısının (Apache yapılandırma dosyasında user yönergesine bakın) yetkilerini miras alır. Bu kullanıcı genellikle 'nobody' kullanıcısı olur fakat bunun güvenlikle ve kimlik doğrulama ile ilgili olumsuz etkileri olabilir. Örneğin PHP'yi bir veritabanına erişmek için kullanıyorsanız ve bu veritabanına yerleşik olarak erişim izniniz yoksa "nobody" kullanıcısına bu veritabanına erişim izni vermek zorunda kalırsınız. Bu, kötücül bir betiğin bir kullanıcı ismi ve parola belirtmeksizin veritabanına erişebilmesi ve değişiklik yapabilmesi anlamına gelir. Bir ağ örümceğinin veritabanı yönetici sayfasına rast gelmesi ve tüm veritabanınızı yok etmesi çok mümkündür. Bu gibi durumlardan Apache kimlik doğrulaması ile korunabileceğiniz gibi LDAP, .htaccess dosyaları, vs. kullanarak kendi erişim modelinizi tasarlayabilir ve bu kodu PHP betiklerinize dahil edebilirsiniz.
Güvenliğin sağlanması, PHP'nin tamamen etkisiz hale getirilmesi, dosya yazma, veritabanı erişiminin kısıtlanması demek değildir. Bunlar sağlanırsa güvenli bir işlem ortamı oluşmuş olabilir ancak PHP özellikleri kaybolmuş olur.
Sık yapılan bir güvenlik hatası Apache'yi root kullanıcısının aidiyetinde çalıştırmak veya Apache'nin yeteneklerini başka yollarla arttırmaktır.
Apache kullanıcısının yetkilerini root seviyesine yükseltmek, oldukça tehlikeli olup sistemin tamamını tehlikeye atmak demektir. Dolayısıyla, güvenlik profesyoneli olmayanların sudo veya chroot yapmayı ya da Apache'yi root olarak başka bir şekilde çalıştırmayı düşünmemesi gerekir.
PHP bazı basit çözümler içermektedir. Örneğin, open_basedir kullanarak PHP tarafından kullanımına izin verilen dizinlere erişimi denetleyebilir ve kısıtlayabilirsiniz. Ayrıca, sadece Apache'nin erişimine açık bölgeler tanımlayabilir, kullanıcılara ve sisteme ait dosyalara erişimi kısıtlayabilirsiniz.
PHP, çoğu sunucu sisteminde bulunan dizin ve dosya erişim izinleri ile ilgili yerleşik güvenlik önlemlerinden etkilenir. Bu izinlerle dosya sisteminden kimin hangi dosyaları okuyabileceğini denetleyebilirsiniz. Dosya sistemine erişimi olan tüm kullanıcıların sadece herkesçe okunabilen dosyaları okuyabilmesini sağlamalısınız.
PHP, dosya sistemine kullanıcı seviyesinde düşük seviyeli erişime izin verecek şekilde tasarlandığından, /etc/passwd gibi sistem dosyalarını okumak, eternet bağlantılarını değiştirmek, yazıcılara iş göndermek ve benzerleri tamamen mümkündür. Bu durum sizin bazı önlemler almanızı gerektirir; dosyaları kimlerin okuyabileceğine ve kimlerin yazabileceğine karar vermeniz gerekir.
Örneğin, aşağıdaki betiği ele alalım. Kullanıcı, ev dizinindeki bazı dosyaları silmek istiyor olsun. Bir sayfanın, kullanıcının ev dizinindeki bazı dosyaları Apache kullanıcısına sildirmek için bir arayüz olarak kullanıldığını varsayalım.
Örnek 1 - Değişkenler başınıza iş açabilir...
<?php
// Kullanıcının ev dizininden bir dosya silelim
$kullanıcı = $_POST['kullanıcının_belirttiği_isim'];
$kullanıcı_dosyası = $_POST['kullanıcının_belirttiği_dosyaismi'];
$evdizini = "/home/$kullanıcı";
unlink("$evdizini/$kullanıcı_dosyası");
echo "Dosya silindi!";
?>
Birine ait bir kullanıcı ve dosya ismi bir formdan gönderilebileceğinden bunu yapmaya izni olmayan biri bile bu betikle dosya silebilir. Bu durumda kimlik doğrulaması yapabilen bir betik kullanmak daha iyi olabilir. Birinin formu kullanarak "../etc/" ve "passwd" girdiğini varsayalım ve betikte neler oluyor bakalım:
Örnek 2 ... Bir dosya sistemi saldırısı
<?php
// PHP kullanıcısının erişebildiği bir yerden bir dosyayı silelim.
// PHP root yetkilerine sahip olsun.
$kullanıcı = $_POST['kullanıcının_belirttiği_isim']; // "../etc"
$kullanıcı_dosyası = $_POST['kullanıcının_belirttiği_dosyaismi']; // "passwd"
$evdizini = "/home/$kullanıcı"; // "/home/../etc"
unlink("$evdizini/$kullanıcı_dosyası"); // "/home/../etc/passwd"
echo "Dosya silindi!";
?>
Bu saldırıyı önlemek için dikkate alacağınız iki ölçüt vardır.
Düzeltilmiş betik:
Örnek 3 - Daha güvenilir bir dosya silme betiği
<?php
// PHP kullanıcısının erişebildiği bir dosyayı silelim.
$kullanıcı = $_SERVER['REMOTE_USER']; // kimlik doğrulaması yapıyoruz
$dosya = basename($_POST['kullanıcının_belirttiği_dosyaismi']);
$evdizini = "/home/$kullanıcı";
$dosyayolu = "$evdizini/$dosya";
if (file_exists($dosyayolu) && unlink($dosyayolu)) {
$günce = "$dosyayolu silindi\n";
} else {
$günce = "$dosyayolu silinemedi\n";
}
$dt = fopen("/home/logging/filedelete.log", "a");
fwrite($dt, $günce);
fclose($dt);
echo htmlentities($logstring, ENT_QUOTES);
?>
Ancak, bu bile kusurları örtmeye yetmez. Eğer kimlik doğrulama sisteminiz kullanıcıya kendi ev dizinini belirtmesine izin veriyorsa ve kullanıcı "../etc/" dizinine oturum açmayı istiyorsa sistem hala tehdit altında demektir. Bu nedenle, sınanacak noktaları genişletmelisiniz:
Örnek 4 - Daha da güvenilir bir dosya silme betiği
<?php
$kullanıcı = $_SERVER['REMOTE_USER']; // kimlik doğrulaması yapıyoruz
$dosya = $_POST['kullanıcının_belirttiği_dosyaismi'];
$evdizini = "/home/$kullanıcı";
$dosyayolu = "$evdizini/$dosya";
if (!ctype_alnum($kullanıcı) ||
!preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $dosyayolu)) {
die("Kullanıcı veya dosya ismi hatalı");
}
//vs...
?>
Kullandığınız işletim sistemine bağlı olarak, dikkate alacağınız geniş bir dosya isimleri yelpazesi vardır: aygıt dosyaları (/dev/ veya COM1 gibi), yapılandırma dosyaları (/etc/ ve .ini dosyaları), bildik saklama alanları (/home/, My Documents), vb. Bu nedenle, açıkça izin verilenler dışında kalan herşeyi yasaklamak en kolayıdır.
PHP, dosya sistemi ile ilgili işlemler için kod seviyesinde C işlevlerini kullandığından boş baytlı (\0) dizgeler beklenmedik davranışlara yol açabilir. Boş bayt, C'de dizgeleri sonlandırmak için kullanıldığından boş bayt içeren dizgelerin tamamı değil, boş bayta kadar olan bölüm işleme sokulur. Aşağıdaki örnekte bunun sebep olduğu bir sorun ele alınmıştır:
Örnek 1 - Boş baytlardan olumsuz etkilenen bir betik
<?php
$dosya = $_GET['dosya']; // "../../etc/passwd\0"
if (file_exists('/home/siteler/'.$dosya.'.php')) {
/* /home/siteler/../../etc/passwd mevcut olduğundan
file_exists işlevi TRUE döndürür */
include '/home/siteler/'.$dosya.'.php';
// /etc/passwd dosyası betiğe dahil edildi
}
?>
Bu bakımdan, bir dosya sistemi işleminde kullanılan her dizge daima denetlenmelidir. Aşağıda, önceki örneğin iyileştirilmişi verilmiştir:
Örnek 2 - Girdiyi doğru şekilde ele almak
<?php
$dosya = $_GET['dosya'];
// Kabul edilebilir değerlerin listesi
switch ($file) {
case 'main':
case 'foo':
case 'bar':
include '/home/siteler/include/'.$dosya.'.php';
break;
default:
include '/home/siteler/include/main.php';
}
?>
Nowadays, databases are cardinal components of any web based application by enabling websites to provide varying dynamic content. Since very sensitive or secret information can be stored in a database, you should strongly consider protecting your databases.
To retrieve or to store any information you need to connect to the database, send a legitimate query, fetch the result, and close the connection. Nowadays, the commonly used query language in this interaction is the Structured Query Language (SQL). See how an attacker can tamper with an SQL query.
As you can surmise, PHP cannot protect your database by itself. The following sections aim to be an introduction into the very basics of how to access and manipulate databases within PHP scripts.
Keep in mind this simple rule: defense in depth. The more places you take action to increase the protection of your database, the less probability of an attacker succeeding in exposing or abusing any stored information. Good design of the database schema and the application deals with your greatest fears.
The first step is always to create the database, unless you want to use one from a third party. When a database is created, it is assigned to an owner, who executed the creation statement. Usually, only the owner (or a superuser) can do anything with the objects in that database, and in order to allow other users to use it, privileges must be granted.
Applications should never connect to the database as its owner or a superuser, because these users can execute any query at will, for example, modifying the schema (e.g. dropping tables) or deleting its entire content.
You may create different database users for every aspect of your application with very limited rights to database objects. The most required privileges should be granted only, and avoid that the same user can interact with the database in different use cases. This means that if intruders gain access to your database using your applications credentials, they can only effect as many changes as your application can.
You are encouraged not to implement all the business logic in the web application (i.e. your script), instead do it in the database schema using views, triggers or rules. If the system evolves, new ports will be intended to open to the database, and you have to re-implement the logic in each separate database client. Over and above, triggers can be used to transparently and automatically handle fields, which often provides insight when debugging problems with your application or tracing back transactions.
You may want to establish the connections over SSL to encrypt client/server communications for increased security, or you can use ssh to encrypt the network connection between clients and the database server. If either of these is used, then monitoring your traffic and gaining information about your database will be difficult for a would-be attacker.
SSL/SSH protects data travelling from the client to the server, SSL/SSH does not protect the persistent data stored in a database. SSL is an on-the-wire protocol.
Once an attacker gains access to your database directly (bypassing the webserver), the stored sensitive data may be exposed or misused, unless the information is protected by the database itself. Encrypting the data is a good way to mitigate this threat, but very few databases offer this type of data encryption.
The easiest way to work around this problem is to first create your own encryption package, and then use it from within your PHP scripts. PHP can assist you in this with several extensions, such as Mcrypt and Mhash, covering a wide variety of encryption algorithms. The script encrypts the data before inserting it into the database, and decrypts it when retrieving. See the references for further examples of how encryption works.
In case of truly hidden data, if its raw representation is not needed (i.e. not be displayed), hashing may also be taken into consideration. The well-known example for the hashing is storing the MD5 hash of a password in a database, instead of the password itself. See also crypt() and md5().
Örnek 1 Using hashed password field
<?php
// storing password hash
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username), md5($password));
$result = pg_query($connection, $query);
// querying if user submitted the right password
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
pg_escape_string($username), md5($password));
$result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) {
echo 'Welcome, $username!';
} else {
echo 'Authentication failed for $username.';
}
?>
Many web developers are unaware of how SQL queries can be tampered with, and assume that an SQL query is a trusted command. It means that SQL queries are able to circumvent access controls, thereby bypassing standard authentication and authorization checks, and sometimes SQL queries even may allow access to host operating system level commands.
Direct SQL Command Injection is a technique where an attacker creates or alters existing SQL commands to expose hidden data, or to override valuable ones, or even to execute dangerous system level commands on the database host. This is accomplished by the application taking user input and combining it with static parameters to build a SQL query. The following examples are based on true stories, unfortunately.
Owing to the lack of input validation and connecting to the database on behalf of a superuser or the one who can create users, the attacker may create a superuser in your database.
Örnek 1 Splitting the result set into pages ... and making superusers (PostgreSQL)
<?php
$offset = $argv[0]; // beware, no input validation!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
$result = pg_query($conn, $query);
?>
Normal users click on the 'next', 'prev' links where the $offset is encoded into the URL. The script expects that the incoming $offset is a decimal number. However, what if someone tries to break in by appending a urlencode()'d form of the following to the URL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
If it happened, then the script would present a superuser access to him. Note that 0; is to supply a valid offset to the original query and to terminate it.
Bilginize: It is common technique to force the SQL parser to ignore the rest of the query written by the developer with -- which is the comment sign in SQL.
A feasible way to gain passwords is to circumvent your search result pages. The only thing the attacker needs to do is to see if there are any submitted variables used in SQL statements which are not handled properly. These filters can be set commonly in a preceding form to customize WHERE, ORDER BY, LIMIT and OFFSET clauses in SELECT statements. If your database supports the UNION construct, the attacker may try to append an entire query to the original one to list passwords from an arbitrary table. Using encrypted password fields is strongly encouraged.
Örnek 2 Listing out articles ... and some passwords (any database server)
<?php
$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
?>
The static part of the query can be combined with another SELECT statement which reveals all passwords:
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --
If this query (playing with the ' and --) were assigned to one of the variables used in $query, the query beast awakened.
SQL UPDATE's are also susceptible to attack. These queries are also threatened by chopping and appending an entirely new query to it. But the attacker might fiddle with the SET clause. In this case some schema information must be possessed to manipulate the query successfully. This can be acquired by examining the form variable names, or just simply brute forcing. There are not so many naming conventions for fields storing passwords or usernames.
Örnek 3 From resetting a password ... to gaining more privileges (any database server)
<?php
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>
But a malicious user sumbits the value ' or uid like'%admin%'; -- to $uid to change the admin's password, or simply sets $pwd to "hehehe', admin='yes', trusted=100 " (with a trailing space) to gain more privileges. Then, the query will be twisted:
<?php
// $uid == ' or uid like'%admin%'; --
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";
// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE
...;";
?>
A frightening example how operating system level commands can be accessed on some database hosts.
Örnek 4 Attacking the database hosts operating system (MSSQL Server)
<?php
$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
?>
If attacker submits the value a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- to $prod, then the $query will be:
<?php
$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
?>
MSSQL Server executes the SQL statements in the batch including a command to add a new user to the local accounts database. If this application were running as sa and the MSSQLSERVER service is running with sufficient privileges, the attacker would now have an account with which to access this machine.
Bilginize: Some of the examples above is tied to a specific database server. This does not mean that a similar attack is impossible against other products. Your database server may be similarly vulnerable in another manner.
You may plead that the attacker must possess a piece of information about the database schema in most examples. You are right, but you never know when and how it can be taken out, and if it happens, your database may be exposed. If you are using an open source, or publicly available database handling package, which may belong to a content management system or forum, the intruders easily produce a copy of a piece of your code. It may be also a security risk if it is a poorly designed one.
These attacks are mainly based on exploiting the code not being written with security in mind. Never trust any kind of input, especially that which comes from the client side, even though it comes from a select box, a hidden input field or a cookie. The first example shows that such a blameless query can cause disasters.
If the application waits for numerical input, consider verifying data with is_numeric(), or silently change its type using settype(), or use its numeric representation by sprintf().
Örnek 5 A more secure way to compose a query for paging
<?php
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// please note %d in the format string, using %s would be meaningless
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
$offset);
?>
Besides these, you benefit from logging queries either within your script or by the database itself, if it supports logging. Obviously, the logging is unable to prevent any harmful attempt, but it can be helpful to trace back which application has been circumvented. The log is not useful by itself, but through the information it contains. More detail is generally better than less.
With PHP security, there are two sides to error reporting. One is beneficial to increasing security, the other is detrimental.
A standard attack tactic involves profiling a system by feeding it improper data, and checking for the kinds, and contexts, of the errors which are returned. This allows the system cracker to probe for information about the server, to determine possible weaknesses. For example, if an attacker had gleaned information about a page based on a prior form submission, they may attempt to override variables, or modify them:
Örnek 1 Attacking Variables with a custom HTML page
<form method="post" action="attacktarget?username=badfoo&password=badfoo"> <input type="hidden" name="username" value="badfoo" /> <input type="hidden" name="password" value="badfoo" /> </form>
The PHP errors which are normally returned can be quite helpful to a developer who is trying to debug a script, indicating such things as the function or file that failed, the PHP file it failed in, and the line number which the failure occurred in. This is all information that can be exploited. It is not uncommon for a php developer to use show_source(), highlight_string(), or highlight_file() as a debugging measure, but in a live site, this can expose hidden variables, unchecked syntax, and other dangerous information. Especially dangerous is running code from known sources with built-in debugging handlers, or using common debugging techniques. If the attacker can determine what general technique you are using, they may try to brute-force a page, by sending various common debugging strings:
Örnek 2 Exploiting common debugging variables
<form method="post" action="attacktarget?errors=Y&showerrors=1&debug=1"> <input type="hidden" name="errors" value="Y" /> <input type="hidden" name="showerrors" value="1" /> <input type="hidden" name="debug" value="1" /> </form>
Regardless of the method of error handling, the ability to probe a system for errors leads to providing an attacker with more information.
For example, the very style of a generic PHP error indicates a system is running PHP. If the attacker was looking at an .html page, and wanted to probe for the back-end (to look for known weaknesses in the system), by feeding it the wrong data they may be able to determine that a system was built with PHP.
A function error can indicate whether a system may be running a specific database engine, or give clues as to how a web page or programmed or designed. This allows for deeper investigation into open database ports, or to look for specific bugs or weaknesses in a web page. By feeding different pieces of bad data, for example, an attacker can determine the order of authentication in a script, (from the line number errors) as well as probe for exploits that may be exploited in different locations in the script.
A filesystem or general PHP error can indicate what permissions the web server has, as well as the structure and organization of files on the web server. Developer written error code can aggravate this problem, leading to easy exploitation of formerly "hidden" information.
There are three major solutions to this issue. The first is to scrutinize all functions, and attempt to compensate for the bulk of the errors. The second is to disable error reporting entirely on the running code. The third is to use PHP's custom error handling functions to create your own error handler. Depending on your security policy, you may find all three to be applicable to your situation.
One way of catching this issue ahead of time is to make use of PHP's own error_reporting(), to help you secure your code and find variable usage that may be dangerous. By testing your code, prior to deployment, with E_ALL, you can quickly find areas where your variables may be open to poisoning or modification in other ways. Once you are ready for deployment, you should either disable error reporting completely by setting error_reporting() to 0, or turn off the error display using the php.ini option display_errors, to insulate your code from probing. If you choose to do the latter, you should also define the path to your log file using the error_log ini directive, and turn log_errors on.
Örnek 3 Finding dangerous variables with E_ALL
<?php
if ($username) { // Not initialized or checked before usage
$good_login = 1;
}
if ($good_login == 1) { // If above test fails, not initialized or checked before usage
readfile ("/highly/sensitive/data/index.html");
}
?>
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
PHP'deki belki de en tartışmalı değişiklik, register_globals PHP yönergesinin öntanımlı değerinin PHP » 4.2.0'da On iken Off yapılmasıdır. Bu yönerge üzerindeki geçmiş deneyimlere dayanmak oldukça yaygındı ve çoğu kişi yönergenin varlığını bile bilmediği gibi PHP'nin böyle çalıştığını varsayardı. Bu sayfada, bu yönerge ile yazılan kodun nasıl güvensiz olabileceği gösterilecek, fakat güvensizliğin yönergenin kendisinden ziyade nasıl yanlış kullanımından kaynaklandığı açıklanacaktır.
register_globals On iken, HTML formlarındaki istek değişkenleri gibi bir takım değişkenler betiğinize dahil edilir. PHP'nin değişken ilklendirme gerektirmeme olgusu güvensiz kod yazımını daha da kolaylaştırır. Zor bir karar olmasına rağmen PHP topluluğu bu yönergeyi öntanımlı olarak iptal etmeyi uygun gördü. Yönergenin değeri On iken, kullanıcılar, değişkenleri, aslında ne olup bittiğini bilmeden sadece varsayımla kullanırdı. Betiğin kendisi tarafından tanımlanmış dahili değişkenler kullanıcı tarafından gönderilen istek verileri ile karışırdı. register_globals Off yapılınca bu değişti. Yönergenin yanlış kullanımını bir örnekle açıklamaya çalışalım:
Örnek 1 - register_globals = on ile yanlış kullanım örneği
<?php
// Sadece kullanıcı kimliği doğrulanıyorsa $yetkili = true olmalı
if (authenticated_user()) {
$yetkili = true;
}
// $yetkili değişkenini başta false ile ilklendirmediğimizden
// bu atama GET auth.php?yetkili=1 şeklinde register_globals
// üzerinden yapılmış olabilir. Dolayısıyla, kullanıcı kendini
// yetkiliymiş gibi gösterebilir!
if ($yetkili) {
include "/gayet/hassas/veriler.php";
}
?>
register_globals = on iken yukarıda yürüttüğümüz mantık zarar görebilir. register_globals = off olduğunda, $yetkili değişkenine istek üzerinden değer atanamayacağından bir açık söz konunu olmayacaktır. Aslında değişkenleri baştan ilklendirmek iyi bir programcılık alışkanlığıdır. Yukarıdaki örnekte baştan $yetkili = false yapabilirdik. Bu ilklendirme yapılmış olsaydı, kullanıcı öntanımlı olarak yetkisiz olacağından register_globals yönergesinin değerinin ne olduğunun bir önemi olmayacaktı.
Diğer bir örnek oturumlarla ilgilidir. register_globals = on iken, aşağıdaki örnekte $kullanici değişkenini de kullanabilirdik, fakat tekrar hatırlatmakta yarar var: $kullanici, GET gibi başka bir kaynaktan da (örn, URL üzerinden) gelebilirdi.
Örnek 2 - register_globals On veya Off iken oturum örneği
<?php
// $kullanici'nin nereden geleceğini bilemezdik
// Fakat oturum verisi için $_SESSION kullanınca biliriz
if (isset($_SESSION['kullanici'])) {
echo "Merhaba <b>{$_SESSION['kullanici']}</b>";
} else {
echo "Merhaba <b>Ziyaretçi</b><br />";
echo "Oturum açmak ister misiniz?";
}
?>
Sahtecilik yapılmaya çalışıldığında uyaracak önleyici tedbirler almak da mümkündür. Bir değişken vaktinden önce geliyorsa, gönderilen verinin ilgisiz bir teslimat çeşidinden gelip gelmediğini sınayabilirsiniz. Verinin sahte olmadığını garanti etmese de saldırganın yaptığı sahtecilik türünün tahmin edilmesi gerekir. İstek verisinin geldiği yeri önemsemiyorsanız, GET, POST ve COOKIE verilerinin bir karışımını içeren $_REQUEST dizisini kullanabilirsiniz. Ayrıca, Dış Kaynaklı Değişkenler bölümüne de bakınız.
Örnek 3 - Basit değişken sahteciliğinin saptanması
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE bir çerezden gelir.
// Çerez verisini doğrulamayı unutmayın!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("admin@example.com", "Olası kırma çabası", $_SERVER['REMOTE_ADDR']);
echo "Güvenlik ihlali; yönetici uyarıldı.";
exit;
} else {
// MAGIC_COOKIE bu istek (REQUEST) üzerinden atanmamış.
}
?>
Şüphesiz, tek başına register_globals = off, kodunuzun güvenli olduğu anlamına gelmez. Gönderilen her veri parçası başka yollarla da ayrıca sınanmalıdır. Kullanıcı verinizi daima doğrulayın ve değişkenlerinizi daima ilklendirin! İlklendirilmemiş değişkenleri görmek için error_reporting() işlevi ile E_NOTICE seviyesinden hataların gösterilmesini sağlamalısınız.
register_globals'in On veya Off olmasının taklit edilmesi hakkında bilgi edinmek için SSS'deki register_globals ile nasıl çalışacağım? sorusuna bakınız.
Bilginize: Süper Küreseller Kullanılabilirlik Bilgisi
$_GET, $_POST, $_SERVER, vs. gibi süper küreseller PHP 4.1.0 sürümünden beri kullanılabilmektedir. Bu konuda daha ayrıntılı bilgi edinmek için süper küreseller bölümüne bakınız.
PHP de yazılmış bir uygulamanın en zayıf noktası, dilin kendisinde olan bir sorun değil, yazılan uygulamanın bazı varsayımlara dayanarak güvenliği göz önünde bulundurmamasıdır. Bundan dolayı bir uygulama yazarken güvenliğe önem vermeli ve kullanıcıdan gelen bilginin varsayıma dayanmadan denetlenmesini sağlamasınız.
Örnek 1 - Tehlikeli Değişken Kullanımı
<?php
// kullanıcının ev dizininden bir dosyayı silelim...
// acaba başka birininkini mi silecek?
unlink ($fena_veri);
// Girişle ilgili kayıt tutalım...
// acaba /etc/passwd dosyasına mı yazacak?
fwrite ($fp, $fena_veri);
// Denemek için birşeyler çalıştıralım...
// acaba tüm dosyaları silecek bir 'rm -rf' komutu mu?
exec ($fena_veri);
?>
Kod yazarken her zaman yazdıklarınızı dikkatlice inceleyip, kullanıcıdan gelen bilgilerin doğru ve tam şekilde denetlenip onaylandığına emin olmanız gerekir. Kullanıcıdan gelen bilgiyi alıp işleme koyduğunuz her durumda kendinize şu soruları sorabilirsiniz:
Yaptığınız projenin uygunluğuna göre kod yazmadan önce ve yazarken bu soruları sık sık kendinize sormanız, proje bittiğinde değerlendirme yapıp değişiklikler yapmanızdan çok daha faydalı olacaktır. Bu sayede proje tasarımını güvenlik düşünülerek yapmış olacak ve daha sonra güvenlik dolayısıyla ciddi değişiklikler yapma zorunluluğunuz ortadan kalkacaktır. Güvenliğe vereceğiniz öncelikli önem, daha sonra yapacağınız ve güvenliği riske atacak değişikliklerden çok daha faydalıdır.
Belirtilen bir değişkenin değerini, kaynağı veya geçerliliği bozacağını düşündüğünüz register_globals, magic_quotes ve benzeri ayarlarları kapatmanız iyi olabilir. Hata bildirim kipi 'error_reporting(E_ALL)' kullanımı, aynı zamanda uyarıları da göstereceği için kodunuzda sorun olup olmadığı hakkında daha iyi bilgi verebilir.
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
Sihirli Tırnaklar, PHP betiklerine gelen veriyi sihirli bir şekilde önceleyen bir işlemdir. Kodlamayı sihirli tırnakları kullanmadan yapıp bu işlemi çalışma anına bırakmak gerektiğinde de tercih edilebilir.
Etkin olduğunda, ' (tek tırnak), " (çift tırnak), \ (tersbölü) ve NULL karakterlerinin önüne özdevinimli olarak bir tersbölü imi getirilir. Bu işlem addslashes() işlevinin yaptığı işle aynıdır.
Toplam üç adet sihirli tırnak yönergesi vardır:
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
magic_quotes_gpc yönergesi sadece sistem seviyesinde etkisiz kılınabilir, çalışma anında yapılamaz. Başka bir deyişle, ini_set() işlevi bir seçenek değildir.
Örnek 1 - Sihirli tırnakların sunucu taraflı iptali
Aşağıdaki örnekte php.ini içinde bu yönergelere değer olarak Off atanmaktadır. Bu konuda daha ayrıntılı bilgi edinmek için Yapılandırma ayarlarının değiştirilmesi bölümüne bakınız.
; Sihirli tırnakların iptali
;
; Gelen GET/POST/Cookie verisi için sihirli tırnaklar
magic_quotes_gpc = Off
; Çalışma anında üretilen (SQL veya exec() kaynaklı) veri için
magic_quotes_runtime = Off
; Sybase-tarzı sihirli tırnak kullanımı (' yerine \' değil '').
magic_quotes_sybase = Off
Eğer sunucuda yapılandırma dosyasına erişim ve değişiklik mümkün değilse, .htaccess kullanmak da bir seçenektir. Örnek:
php_flag magic_quotes_gpc Off
Taşınabilir kod (her ortamda çalışan kod) yazmaya yönelik olarak, ayarların sunucu seviyesinde değiştirilmesi mümkün değilse magic_quotes_gpc yönergesi örnekteki gibi çalışma anında etkisiz kılınabilir. Bu yol fevkalade verimsizdir ancak uygun yönergeleri başka bir yerden atamaya tercih edilir.
Örnek 2 - Sihirli tırnakların çalışma anında iptali
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
?>
Bazı şeyleri gizleyerek güvenlik sağlama girişimleri en alt düzeydeki çabalardır. Ancak bazı durumlarda en küçük güvenlik arttırıcı önlem bile yararlı olabilir.
Bir kaç basit teknikle PHP'yi gizleyebilir, sisteminizin zayıflıklarını
keşfetmeye çalışan bir saldırganı belki de yavaşlatabilirsiniz. php.ini
dosyanızda expose_php = off yaparak bir saldırganın
erişebileceği bilgiyi en aza indirebilirsiniz.
Başka bir yol da HTTP sunucusuna PHP kodu olarak başka dosya uzantıları belirtmektir. Bu işlem Apache yapılandırma dosyasında veya .htaccess dosyalarında yapılabilir. Yanıltıcı dosya uzantılarını şöyle kullanabilirsiniz:
Örnek 1 - PHP'yi başka bir dil olarak göstermek
# PHP kodlarını başka bir dilin kodları gibi gösterelim AddType application/x-httpd-php .asp .py .pl
Veya tamamen gizleyelim:
Örnek 2 - PHP uzantısı olarak bilinmeyen bir uzantı kullanmak
# PHP kodunu türü bilinmeyen bir dosya gibi gösterelim AddType application/x-httpd-php .hop .yep
Ya da HTML kodu gibi gösterek gizleyelim. Ancak tüm HTML dosyalarını PHP işleyeceği için bu bir miktar başarım kaybına sebep olur:
Örnek 3 - PHP uzantısı olarak HTML uzantılarını kullanmak
# Tüm PHP kodu HTML kodu gibi görünsün AddType application/x-httpd-php .htm .html
Bunun verimli çalışması için tüm PHP dosyalarınızın uzantılarını yukardaki uzantılarla değiştirmeniz gerekir. Dosya adı değiştirme zorunluluğu için bu alt düzey güvenlik önleminin size çıkardığı bir zorluktur diyebiliriz.
PHP, diğer büyük sistemler gibi devamlı ilerlemeler ve yenilikler içermektedir. Her yeni sürümde sistemin güvenliğini ve kararlılığını etkileyen yapılandırma kazalarını ve diğer açıkları kapatmak veya güvenliği arttırmak amacıyla mutlaka büyük ya da küçük değişiklikler ortaya çıkmaktadır.
Yapılması gereken en akılcı yaklaşım, benzeri diğer sistem secviyesinde betik dilleri ve programlarında olduğu gibi, sık sık güncellemeleri takip etmek ve kullanılan sürüme göre daha yeni bir sürüme geçiş yapmak olmalıdır.
PHP'deki HTTP Kimlik Doğrulaması kancaları sadece PHP bir Apache modülü olarak çalıştığında mevcuttur ve CGI sürümünde yoktur. Bir Apache modülü PHP betiğinde, header() işlevini kullanarak istemci tarayıcısına "Kimlik Doğrulaması Gerekli" iletisini gönderebilir ve bunun sonucunda Kullanıcı Adı/Parola giriş penceresi açılır. Kullanıcı kullanıcı adı ve parolasını girdiğinde, PHP betiğini içeren URL, kullanıcı adı, parola ve kimlik doğrulama türünü atayan PHP_AUTH_USER, PHP_AUTH_PW ve AUTH_TYPE öntanımlı değişkenleri ile tekrar çağrılır. Bu öntanımlı değişkenler $_SERVER ve $HTTP_SERVER_VARS dizileri içinde bulunur. "Temel" ve "Özet" (PHP 5.1.0'dan itibaren) kimlik doğrulama yöntemlerinin ikisi de desteklenir. Daha fazla bilgi için header() işlevine bakınız.
Bilginize: PHP Sürüm Bilgisi
$_SERVER gibi süper küreseller, PHP » 4.1.0'dan itibaren kullanılabilmektedir.
İstemci sayfasını kimlik doğrulamaya zorlayacak örnek betik aşağıdaki gibidir:
Örnek 1 - Temel HTTP Kimlik Doğrulaması örneği
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Benim bölgem"');
header('HTTP/1.0 401 Unauthorized');
echo 'Kullanıcı İptal düğmesine basınca çıkacak metin';
exit;
} else {
echo "<p>Merhaba {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Parola olarak {$_SERVER['PHP_AUTH_PW']} verdiniz.</p>";
}
?>
Örnek 2 - Özet HTTP Kimlik Doğrulaması örneği
Bu örnek basit bir Özet HTTP kimlik doğrulama betiğinin nasıl uygulanacağını gösterir. Daha fazla bilgi için » RFC 2617 belgesini okuyunuz.
<?php
$saha = 'Kısıtlanmış alan';
// kullanici => parola
$kullanicilar = array('yonetici' => 'gizlisifre', 'misafir' => 'misafir');
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$saha.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($saha).'"');
die('Kullanıcı İptal düğmesine basınca çıkacak metin');
}
// PHP_AUTH_DIGEST değişkenini inceleyelim
if (!($veri = http_ozet_cozumle($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($kullanicilar[$veri['username']]))
die('Kimlik Doğrulama Hatası!');
// geçerli yanıt üretimi
$A1 = md5($veri['username'] . ':' . $saha . ':' .
$kullanicilar[$veri['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$veri['uri']);
$gecerli_yanit = md5($A1.':'.$veri['nonce'].':'.$veri['nc'].':'.
$veri['cnonce'].':'.$veri['qop'].':'.$A2);
if ($veri['response'] != $gecerli_yanit)
die('Kimlik Doğrulama Hatası!');
// tamam, geçerli kullanıcı adı & parolası
echo 'Hoşgeldiniz : ' . $veri['username'];
// http kimlik doğrulama başlığını çözümleyecek işlev
function http_ozet_cozumle($metin)
{
// eksik veriye karşı koruma
$gerekli_kisimlar = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1,
'username'=>1, 'uri'=>1, 'response'=>1);
$veri = array();
$keys = implode('|', array_keys($gerekli_kisimlar));
preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@',
$metin, $eslesen, PREG_SET_ORDER);
foreach ($eslesen as $m) {
$veri[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($gerekli_kisimlar[$m[1]]);
}
return $gerekli_kisimlar ? false : $veri;
}
?>
Bilginize: Uyumluluk Bilgisi
Lütfen HTTP başlık satırlarını kodlarken dikkatli olun. Bütün istemcilerle uyumluluğu garantilemek için, "Basic" anahtar sözcüğünün "B" harfi büyük yazılmalı, realm metni çift tırnak (tek tırnak değil) ile yazılmalı, ve HTTP/1.0 401 başlık satırındaki 401 kodundan önce tam olarak bir adet boşluk olmalıdır. Yukarıdaki özet örneğinde olduğu gibi kimlik doğrulama değiştirgeleri virgülle ayrılmış olmalıdır.
Yukarıdaki örnekte yapıldığı gibi sadece PHP_AUTH_USER ve PHP_AUTH_PW yazdırmak yerine, kullanıcı adı ve parolasının doğruluğunu denetlemek isteyebilirsiniz. Bunun için belki bir veritabanı sorgusu gönderebilir veya kullanıcıyı bir dbm dosyası içinde arayabilirsiniz.
Burada hatalı Internet Explorer tarayıcılarına dikkat ediniz. Başlıkların sırası konusunda çok seçici görünürler. WWW-Authenticate başlığını HTTP/1.0 401 başlığından önce göndermek hileye neden olabilir.
PHP 4.3.0'dan itibaren geleneksel harici kimlik doğrulama yönteminden geçmiş
bir sayfa için girilmiş parolayı gösteren bir betik yazılmasını engellemek
için, harici kimlik doğrulaması yapılan sayfa için güvenli kip (safe_mode)
etkinleştirilir, böylece PHP_AUTH değişkenlerine değer atanmaz. Harici kimlik
doğrulaması yapılan kullanıcıyı kimliklendirmek için
REMOTE_USER değişkeni
$_SERVER['REMOTE_USER'] olarak kullanılabilir.
Bilginize: Yapılandırma Bilgisi
PHP harici kimlik doğrulamasının etkin olup olmadığnı tespit etmek için AuthType yönergesininin varlığını bakar.
Yukarıdaki örnek, aynı sunucudaki kimlik doğrulamalı URL'lerden girilen parolaları çalmak için kimlik doğrulamasız bir URL'yi kullanmak isteyenleri önlemez.
Hem Netscape Navigator hem de Internet Explorer, 401 sunucu yanıtını almak için yerel tarayıcı penceresinin kimlik doğrulama önbelleğini temizler. Bu işlem, kullanıcıları tekrar kullanıcı adı ve parolasını girmeye zorlayacak şekilde "oturumu kapatır". Bazıları bunu "zaman aşımlı" kullanıcı girişi için kullanırlar veya bir "Çıkış" düğmesi sunarlar.
Örnek 3 - Yeni kullanıcı adı va parolası girmeye zorlayan bir HTTP kimlik doğrulama örneği
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Kimlik Doğrulaması Deneme Sistemi"');
header('HTTP/1.0 401 Unauthorized');
echo "Bu kaynağa erişmek için geçerli bir kullanıcı adı ve " .
"parolası girmelisiniz.\n";
exit;
}
if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Merhaba: {$_SERVER['PHP_AUTH_USER']}<br />";
echo "Eski: {$_REQUEST['OldAuth']}";
echo "<form action='{$_SERVER['PHP_SELF']}' METHOD='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value='{$_SERVER['PHP_AUTH_USER']}' />\n";
echo "<input type='submit' value='Kimliği Yeniden Doğrula />\n";
echo "</form></p>\n";
}
?>
Bu davranış şekli HTTP Temel kimlik doğrulama standardı için gerekli değildir, bu nedenle buna güvenmemelisiniz. Lynx ile denendiğinde Lynx'in kimlik doğrulama kartlarını 401 sunucu yanıtı ile temizlemediğini göstermiştir, bu nedenle kimlik bilgisi değişmediği sürece geri ve ileri düğmesine basmak aynı kaynağı açacaktır. Kullanıcı '_' tuşu ile kimlik doğrulama bilgisini temizleyebilir.
Ayrıca PHP 4.3.3'e kadar, PHP'nin CGI sürümünü kullanan Microsoft'un IIS sunucularında IIS kısıtlaması nedeniyle HTTP kimlik doğrulaması çalışmaz. PHP 4.3.3 ve sonrasında bunun çalışması için IIS yapılandırmasındaki "Dizin Güvenliği"ni değiştirmelisiniz. "Düzenle"ye basınız ve sadece "Anonim Erişim"leri seçiniz, diğer bütün sahalar seçimsiz olmalıdır.
Diğer kısıtlama IIS modülü (ISAPI) ve PHP 4 kullanımında yaşanır. PHP_AUTH_* değişkenlerini kullanamazsınız, bunun yerine HTTP_AUTHORIZATION değişkeni kullanılabilir. Örnek: list($user, $pw) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Bilginize: IIS Bilgisi:
HTTP kimlik doğrulamasının IIS ile çalışması için, PHP yönergesi cgi.rfc2616_headers değeri 0 olmaldır (öntanımlı değer).
Bilginize: Eğer güvenli kip etkinse, betiğin kullanıcı kimliği değeri WWW-Authenticate başlığının realm kısmına eklenir.
PHP HTTP çerezlerini şeffaf olarak destekler. Çerezler, uzak tarayıcıda veri saklamayı ve böylece geri dönen kullanıcılar hakkında veri takibi yapmayı sağlar. Çerezleri, setcookie() ya da setrawcookie() işlevleri ile atayabilirsiniz. Çerezler, HTTP başlığının birer parçasıdır, bu yüzden tarayıcıya bir veri göndermeden önce setcookie() işlevini çağırmalısınız. Aynı kısıtlama header() işlevi için de vardır. çıktı tamponlama işlevlerini kullanarak betik çıktısını, herhangi bir başlık ya da çerez atayıp atamayacağınıza karar verene kadar geciktirebilirsiniz.
İstemci tarafından size gönderilen herhangi bir çerez, variables_order yönergesi "C" değerini içeriyorsa $_COOKIE süper küresel dizisine atanır. Eğer tek bir çereze, birden fazla değer atamak isterseniz, çerez ismine [] eklemeniz yeterli olacaktır.
register_globals yönergesinin değerine bağlı olarak, normal PHP değişkenleri çerezler tarafından oluşturulabilir. Ancak, çoğu zaman güvenlik dolayısıyla bu özellik kapalı olduğundan bunların kullanımı önerilmemektedir. PHP'nin önceki sürümlerinde track_vars yapılandırma değişkeni atanmışsa (PHP 4.0.3'ten beri daima etkindir), $HTTP_COOKIE_VARS da daima atanır.
Tarayıcı hataları dahil, daha fazla bilgi edinmek için setcookie() ve setrawcookie() işlevlerine bakınız.
PHP'de oturum desteği belirli bir veriyi birbirini izleyen erişimler arasında korumak üzere bulunur. Bu size daha özelleştirilmiş uygulamalar yapma ve sitenizin cazibesini artırma imkanı verir. Bu konuyla ilgili bütün bilgi Oturum kılavuzu bölümündedir.
» XForms geleneksel HTML formları üzerinde bir çeşitleme tanımlayarak, formların daha çeşitli platformlarda, tarayıcılarda ve hatta PDF belgeleri gibi geleneksel olmayan ortamlarda kullanılmasına imkan verir.
XForms'daki ilk önemli fark formun istemciye nasıl gönderildiğidir. » HTML Yazarları için XForms XForms yaratılışıyla ilgili ayrıntılı açıklama içerir, bu öğreticinin amacı için aşağıdaki basit örneğe bakınız:
Örnek 1 - Basit bir XForms arama formu
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Arama</h:title>
<model>
<submission action="http://ornek.dom/arama"
method="post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Bul</label></input>
<submit submission="s"><label>Gönder</label></submit>
</h:p>
</h:body>
</h:html>
Yukarıdaki form (q isimli) bir metin kutusu ve gönder düğmesi gösterir. Gönder düğmesine tıklandığında, form action ile gösterilen sayfaya gönderilir.
Normal bir HTML formunda, veri application/x-www-form-urlencoded olarak gönderilir, XForms'da ise bu bilgi XML biçimli veri olarak gönderilir.
Eğer XForms ile çalışmayı seçerseniz muhtemelen bu verinin XML olmasını istiyorsunuz demektir, bu durumda, $HTTP_RAW_POST_DATA içine bakınız, orada tarayıcı tarafından üretilen XML belgesini bulacaksınız; bunu istediğiniz XSLT motoruna veya belge çözümleyiciye aktarabilirsiniz.
Eğer biçimlendirmeyle ilgilenmiyorsanız ve sadece verinizin geleneksel $_POST değişkenine yüklenmesini istiyorsanız, method özelliğini urlencoded-post olarak değiştirebilir ve istemci tarayacıya veriyi application/x-www-form-urlencoded olarak gönderme talimatı verebilirsiniz.
Örnek 2 - $_POST elde etmek için bir XFrom kullanımı
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Ara</h:title>
<model>
<submission action="http://ornek.dom/arama"
method="urlencoded-post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Bul</label></input>
<submit submission="s"><label>Gönder</label></submit>
</h:p>
</h:body>
</h:html>
Bilginize: Bu belge yazılırken birçok tarayıcı XForms'u destemiyordu. Eğer yukarıdaki örnek çalışmıyorsa tarayıcınızın sürümüne bakınız.
Bu özellik metin ve ikil dosyaları yükleme imkanı verir. PHP'nin kimlik doğrulama ve dosya işletim işlevleri ile kimin karşıya dosya yükleme yetkisi olacağına ve yüklenen dosya ile ne yapılacağı hakkında tam denetime sahip olursunuz.
PHP, herhangi bir RFC 1867 uyumlu tarayıcıdan (Netscape Navigator 3 veya sonrası, yamalı bir Microsoft Internet Explorer 3 veya sonrası) gelen dosya yüklemelerini alabilir.
Bilginize: İlgili Yapılandırmalar
Ayrıca php.ini içindeki file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size ve max_input_time yönergelerine bakınız.
PHP ayrıca Netscape Composer ve W3C'nin Amaya istemcileri tarafından kullanılan PUT yöntemiyle dosya yüklemeleri de destekler. Ayrıntılı bilgi için PUT Yöntemi Desteği'ne bakınız.
Örnek 1 - Karşıya Dosya Yükleme Formu
Bir dosya yükleme ekranı aşağıdaki gibi özel bir form ile oluşturulabilir:
<!-- Veri kodlama türü, enctype, aşağıdaki gibi belirtilmek ZORUNDADIR -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
<!-- MAX_FILE_SIZE dosya giriş alanından önce bulunmak zorundadır -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- input elemanının adı $_FILES dizisinin içindeki ismi belirler -->
Bu dosyayı gönder: <input name="kullanici_dosyasi" type="file" />
<input type="submit" value="Dosyayı Gönder" />
</form>
Yukarıdaki örnekteki __URL__ bir PHP dosyası ile değiştirilmelidir.
MAX_FILE_SIZE gizli alanı (bayt cinsinden) dosya giriş alanından önce bulunmak zorundadır ve değeri PHP tarafından kabul edilecek azami dosya boyutudur. Bu form elemanı azami-büyüklüğü aşan bir dosyanın gönderilmesini baştan engelleyeceği için büyük dosyaları boşuna beklememek açısından kullanıcılara zaman kazandırır; bu nedenle her zaman kullanılmalıdır. Ancak unutmayın: Bu ayarı tarayıcı tarafında devre dışı bırakmak oldukça kolaydır, bu nedenle daha büyük boyuttaki dosyaların bu özellik tarafından engelleneceğine güvenmeyiniz. Bunula birlikte, PHP'nin azami-büyüklük ayarı devre dışı bırakılamaz.
Bilginize: Dosya yükleme formunuzun enctype="multipart/form-data" özniteliğine sahip olduğundan emin olun, aksi takdirde dosya yükleme çalışmaz.
$_FILES küreseli PHP 4.1.0'dan itibaren vardır (Daha eski sürümünü kullanıyorsanız yerine $HTTP_POST_FILES kullanın). Bu diziler bütün yüklenen dosya bilgilerini içerir.
Örnek formdaki $_FILES içeriği aşağıda verilmiştir. Yukarıdaki örneğe göre yüklenen dosya adı kullanici_dosyasi'dır. Bu herhangi bir isim olabilir.
İstemci makinasındaki asıl dosya adıdır.
Eğer tarayıcı bu bilgiyi sağladıysa dosyanın MIME türüdür. Örneğin, "image/gif". Bu MIME türü PHP tarafında denetlenmez; bu bakımdan bu değeri dikkate almayın.
Yüklenen dosyanın bayt cinsinden boyutudur.
Yüklenen dosyanın sunucuda saklandığı sıradaki geçici dosya adıdır.
Bu dosya yüklemesiyle ilişkili hata kodudur. Bu eleman PHP 4.2.0'da eklenmiştir
php.ini içindeki upload_tmp_dir yönergesi ile başka bir yer belirtilmediyse, dosyalar, öntanımlı olarak sunucunun öntanımlı geçici dizininde saklanır. Sunucunun öntanımlı geçici dizini PHP'nin içinde çalıştığı ortamdaki TMPDIR ortam değişkenine başka bir değer vererek değiştirilebilir. Buna PHP betiği içinden putenv() işlevi ile değer verirseniz çalışmaz. Bu ortam değişkeni diğer işlemlerin yüklenen dosyalar üzerinde çalıştığından emin olmak için de kullanılabilir.
Örnek 2 - Dosya yüklemelerinin doğrulanması
Daha fazla bilgi için is_uploaded_file() ve move_uploaded_file() işlev girdilerine de bakınız. Aşağıdaki örnek bir formdan gelen dosya yükleme isteğini işleyecektir.
<?php
// 4.1.0'dan önceki PHP sürümlerinde, $_FILES yerine
// $HTTP_POST_FILES kullanılmalıdır.
$dizin = '/var/siteler/uploads/';
$yuklenecek_dosya = $dizin . basename($_FILES['kulldosyasi']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['kulldosyasi']['tmp_name'], $yuklenecek_dosya))
{
echo "Dosya geçerli ve başarıyla yüklendi.\n";
} else {
echo "Olası dosya yükleme saldırısı!\n";
}
echo 'Diğer hata ayıklama bilgileri:';
print_r($_FILES);
print "</pre>";
?>
Yüklenen dosyayı alan PHP betiği yüklenen dosya ile ne yapılacağını belirlemek için gerekli mantığı uygulamalıdır. Örneğin, $_FILES['kullanici_dosyasi']['size'] değişkenini çok küçük ve büyük dosyaları engellemek için kullanabilirsiniz. $_FILES['kullanici_dosyasi']['type'] değişkenini belirli türlere uymayan dosyaları engellemek için kullanabilirsiniz, fakat bunu sadece birincil denetimlerde kullanın, çünkü bu değer tamamen istemci kontrolündedir ve PHP tarafında denetlenmez. PHP 4.2.0'dan itibaren $_FILES['kullanici_dosyasi']['error'] kullanabilir ve mantığınızı hata kodlarına göre planlayabilirsiniz. Her şartta dosyayı ya geçici dizinden silmeli ya da başka bir yere taşımalısınız.
Eğer formunuzda yüklemek için bir dosya seçilmediyse, PHP $_FILES['kullanici_dosyasi']['size'] değerini 0 ve $_FILES['kullanici_dosyasi']['tmp_name'] değerini boş döndürür.
İstemin sonunda dosya başka bir yere taşınmadı veya adı değiştirilmediyse geçici dizinden silinir.
Örnek 3 - Dosya dizisi yükleme
PHP HTML dizisi özelliğini dosyalar için de destekler.
<form action="" method="post" enctype="multipart/form-data"> <p>Resimler: <input type="file" name="resimler[]" /> <input type="file" name="resimler[]" /> <input type="file" name="resimler[]" /> <input type="submit" value="Gönder" /> </p> </form>
<?php
foreach ($_FILES["resimler"]["error"] as $anahtar => $hata) {
if ($hata == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["resimler"]["tmp_name"][$anahtar];
$name = $_FILES["resimler"]["name"][$anahtar];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
Dosya yükleme ilerleme çubuğu apc.rfc1867'ye göre gerçeklenebilir.
PHP 4.2.0'dan beri, PHP, dosya dizisi ile birlikte uygun bir hata kodu döndürür. Hata kodu PHP tarafından dosya yüklenirken oluşturulan dosya dizisinin error bölümünde bulunur. Diğer bir deyişle, hata $_FILES['kullanici_dosyasi']['error'] içinde olabilir.
Değeri: 0; Hata yoktur, dosya yükleme başarılıdır.
Değeri: 1; Yüklenen dosya php.ini içindeki upload_max_filesize yönergesindeki değeri aşmaktadır.
Değeri: 2; Yüklenen dosya HTML form içinde belirtilen MAX_FILE_SIZE değerini aşmaktadır.
Değeri: 3; Dosya kısmen yüklenmiştir.
Değeri: 4; Dosya yüklenmemiştir.
Değeri: 6; Geçici dizin yoktur. PHP 4.3.10 ve PHP 5.0.3'de gelmiştir .
Değeri: 7; Dosya diske yazılamamıştır. PHP 5.1.0'da gelmiştir.
Değeri: 8; Dosya yükleme uzantı nedeniyle durmuştur. PHP 5.2.0'da gelmiştir.
Bilginize: Bunlar PHP 4.3.0'da PHP sabitleri haline gelmişlerdir.
MAX_FILE_SIZE dosya boyutu php.ini dosyasında upload_max_filesize yönergesinde belirtilenden büyük olamaz. Öntanımlı değeri 2 Megabayt'tır.
Eğer bir bellek sınırı etkinleştirildiyse, daha büyük bir memory_limit gerekebilir. memory_limit değerinin yeterli olduğundan emin olun.
Eğer max_execution_time çok küçük verildiyse, betiğin çalışma süresi bu süreyi aşabilir. max_execution_time değerinin yeterli olduğundan emin olun.
Bilginize: max_execution_time sadece betiğin kendi çalışma süresini etkiler. Sistem çağrıları system(), sleep() işlevleri, veritabanı sorguları, dosya yükleme işlemi gibi betiğin işletimi dışında yaşanan etkinliklerde harcanan zaman betiğin azami çalışma süresinin belirlenmesinde hesaba katılmaz.
max_input_time betiğin girdi almak için harcayacağı azami süreyi saniye cinsinden belirler, buna dosya yüklemeleri de dahildir. Büyük veya çoklu dosyalar için veya yavaş bağlantılı kullanıcılar için 60 saniyelik öntanımlı değer aşılabilir.
Eğer post_max_size çok küçük verildiyse, büyük dosyalar yüklenemez. post_max_size değerinin yeterli olduğundan emin olun.
Üzerinde çalıştığınız dosyanın doğrulanmaması kullanıcıların diğer dizinlerde bulunan hassas bilgilere erişebileceği anlamına gelebilir.
CERN httpd istemciden aldığı content-type mime başlığındaki ilk boşluktan itibaren herşeyi soyar. Bu durumda CERN httpd dosya yükleme özelliğini desteklemez.
Bir çok dizin listeleme şeklinin olmasından dolayı özgün isimlerin (örneğin boşluk içerenler) uygun şekilde işlenebileceğinin garantisi yoktur.
Normal girdi alanlarıyla dosya yükleme alanları karıştırılıp aynı form değişkeninde (örneğin foo[] gibi) kullanılamaz.
inputlar için farklı name değerleri kullanarak çoklu dosya gönderilebilir.
Ayrıca bilgilerin özdevinimli olarak dizilerde düzenlendiği bir eşzamanlı dosya gönderimi de mümkündür. Bunun için, HTML formunda birden fazla input için aynı dizi söz dizimini kullanmalısınız:
Örnek 1 - Çoklu dosya yükleme
<form action="dosya-yukle.php" method="post" enctype="multipart/form-data"> Bu dosyaları gönder:<br /> <input name="kullanici_dosyasi[]" type="file" /><br /> <input name="kullanici_dosyasi[]" type="file" /><br /> <input type="submit" value="Dosyaları gönder" /> </form>
Yukarıdaki form gönderildiğinde, $_FILES['kullanici_dosyasi'], $_FILES['kullanici_dosyasi']['name'] ve $_FILES['kullanici_dosyasi']['size'] dizileri ilklendirilir (4.1.0'dan önceki PHP sürümleri için $HTTP_POST_FILES). register_globals değeri "on" olduğunda, yüklenen dosyalar içinde küreseller ilklendirilir. Bunlardan her biri gönderilen dosyanın değerine uygun olarak sayısal indisli bir dizi olurlar.
Örneğin, gönderilen dosya isimleri /home/test/review.html ve /home/test/xwp.out olsun. Bu durumda, $_FILES['kullanici_dosyasi']['name'][0] review.html değerini içerir ve $_FILES['kullanici_dosyasi']['name'][1] xwp.out değerini içerir. Benzer şekilde, $_FILES['kullanici_dosyasi']['size'][0] review.html'in dosya boyutunu içerir ve böyle devam eder.
$_FILES['kullanici_dosyasi']['name'][0], $_FILES['kullanici_dosyasi']['tmp_name'][0], $_FILES['kullanici_dosyasi']['size'][0] ve $_FILES['kullanici_dosyasi']['type'][0]'a da ayrıca değerleri atanır.
PHP bazı istemciler tarafından sunucuda dosya saklamak için kullanılan HTTP PUT yöntemini de destekler. PUT istemleri POST istemleri ile dosya yüklemesinden daha basittir ve şu şekildedir:
PUT /dizin_adi/dosyaismi.html HTTP/1.1
Bu normalde uzak istemci /dizin_adi/dosyaismi.html içeriğini site ağacında saklamak istiyor anlamına gelir. Bu Apache veya PHP'nin herkese site ağacındaki herhangi bir dosya üzerine yazma yetkisi verme anlamına geleceği için iyi bir fikir değildir. Bu nedenle böyle bir istem geldiğinde öncelikle HTTP sunucunuza bu istemin belirli bir PHP betiği tarafından karşılanacağını söylemelisiniz. Apache'de bunu Script yönergesi ile yapabilirsiniz. Bu Apache yapılandırma dosyasının herhangi bir yerine konulabilir. Genellikle <Directory> bloğu içine veya <VirtualHost> bloğu içine konulur. Bu, aşağıdaki gibi bir satır olabilir:
Script PUT /put.php
Bu Apache'ye URI'ler için bütün PUT istemlerinin put.php betiğine gönderilmesini söyler. Tabii ki bu durumda .php uzantısının ve PHP'nin etkin olduğu varsayılmaktadır. Bu betiğe gelen bütün PUT istemleri için hedef kaynağı betiğin kendisi olmalıdır.
PHP ile put.php içinde şunu yapabilirsiniz. Bu yüklenen dosyanın içeriğini sunucudaki myputfile.ext dosyasına kopyalar. Bu dosya kopyalamayı gerçekleştirmeden önce bazı denetimlerin yanında kimlik doğrulaması da yapmak isteyebilirsiniz.
Örnek 1 - HTTP PUT dosyalarının kaydedilmesi
<?php
/* PUT verisi stdin akımına gelir */
$putdata = fopen("php://input", "r");
/* Yazmak için bir dosya aç */
$fp = fopen("put_dosyam.ekl", "w");
/* Bir kerede 1 KB veri oku ve dosyaya yaz */
while ($veri = fread($putdata, 1024))
fwrite($fp, $veri);
/* Akımları kapat */
fclose($fp);
fclose($putdata);
?>
php.ini içinde allow_url_fopen seçeneği etkin olduğu sürece, dosya adını değiştirge olarak alan birçok işlevde HTTP ve FTP URL'lerini kullanabilirsiniz. Ek olarak, URL'ler include(), include_once(), require() ve require_once() deyimleri ile kullanılabilir (PHP 5.2.0'dan beri bunun için allow_url_include seçeneğini etkinleştirmek gerekmektedir). PHP tarafından desteklenen protokoller hakkında daha fazla bilgi için bakınız: Desteklenen Protokollerin ve Sarmalayıcıların Listesi
Bilginize: PHP 4.0.3 ve öncesinde, URL sarmalayıcıları kullanmak için,
--enable-url-fopen-wrapperPHP yapılandırma seçeneğini kullanmanız gerekirdi.
Bilginize: PHP 4.3'den önceki PHP'nin Windows sürümleri aşağıdaki işlevler için uzak dosya erişimini desteklemezdi: include(), include_once(), require(), require_once(), ve GD ve Resim İşlevleri eklentisi içindeki imagecreatefromXXX işlevleri.
Örneğin, bunu uzak web sunucusunda bir dosya açmak, istediğiniz veri için çıktıyı çözümlemek ve bu veriyi bir veritabanı sorgusunda kullanmak veya sadece çıktılamak için kullanabilirsiniz.
Örnek 1 - Uzak sayfanın başlığını elde etmek
<?php
$dosya = fopen ("http://www.ornek_bir_site.com/", "r");
if (!$dosya) {
echo "<p>Uzak dosya açılamıyor.\n";
exit;
}
while (!feof ($dosya)) {
$satir = fgets ($dosya, 1024);
/* Bu sadece başlığın title etiketleri aynı satır üzerindeyse çalışır */
if (preg_match ("@\<title\>(.*)\</title\>@i", $satir, $cikti)) {
$baslik = $cikti[1];
break;
}
}
fclose($dosya);
?>
Aynı zamanda bir FTP sunucusundaki dosyalara da yazabilirsiniz (doğru erişim haklarına sahip bir kullanıcı olarak bağlandığınızda). Bu yöntemi kullanarak sadece yeni dosyalar oluşturabilirsiniz; eğer varolan bir dosyanın üzerine yazmayı denerseniz, fopen() çağrısı başarısız olur.
'anonymous' haricinde bir kullanıcı olarak bağlanmak için, 'ftp://kullanici:parola@ftp.ornek_bir_site.com/ornek/bir/dosya' örneğindeki gibi kullanıcı adı (ve parola) URL içinde belirtilmelidir. (Basit kimlik doğrulaması gerektiren HTTP dosya erişimleri içinde aynı söz dizimini kullanabilirsiniz.)
Örnek 2 - Veriyi uzak sunucuda saklamak
<?php
$dosya = fopen ("ftp://ftp.ornek_bir_site.com/gelen/yazilan_dosya", "w");
if (!$dosya) {
echo "<p>Uzak dosya yazmak için açılamıyor.\n";
exit;
}
/* Veriyi burada yaz. */
fwrite ($dosya, $_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($dosya);
?>
Bilginize: Yukarıdaki örnek, bu tekniğin uzak günlük dosyası yazmak için kullanılabileceği fikrini vermiş olabilir. Ne yazık ki bu çalışmaz çünkü eğer uzak dosya zaten varsa fopen() çağrısı başarısız olur. Böyle bir dağıtık günlüklerle için syslog() işlevine göz atmalısınız.
PHP içinde yerleşik olarak bağlantı durumu saklanır. Olası 3 durum vardır:
PHP betiği normal olarak çalıştığında, NORMAL durumu etkindir. Eğer uzak istemci bağlantıyı keserse ABORTED durumu etkin olur. Uzak istemci bağlantı kesilmesi genellikle kullanıcının DUR düğmesine basmasından kaynaklanır. Eğer PHP tarafından bir zaman sınırı (set_time_limit() işlevine bakınız) tetiklendiyse, TIMEOUT durumu etkin olur.
Kullanıcının bağlantı kesmesiyle betiğinizin iptal edilip edilmeyeceğine
karar verebilirsiniz. Bazen uzak tarayıcı çıktıyı almasa da betiğinizin
işini bitirinceye kadar çalışmasını gerektiren durumlar olabilir. Öntanımlı
davranış uzak istemci bağlantıyı kestiğinde betik çalışmasının iptal
edilmesidir. Bu davranış şekli ignore_user_abort php.ini yönergesi veya ona ilişkin
php_value ignore_user_abort Apache httpd.conf
yapılandırma yönergesi veya ignore_user_abort() işlevi ile
belirlenebilir. Eğer PHP'ye kullanıcı iptallerini gözardı etmesini
söylemezseniz ve kullanıcı iptal ederse betiğiniz sonlanır. Tek istisnası
register_shutdown_function() işleviyle kapatma işlevinin
kayıtlanmasıdır. Bir kapatma işlevi ile, uzak kullanıcı DUR düğmesine
bastığında, betiğinizin sonraki çıktılama denemesinde PHP bağlantının iptal
edildiğini tespit eder ve kapatma işlevi çağrılır. Bu kapatma işlevi ayrıca
normal olarak sonlandırmada betiğinizin sonunda çağrılacaktır, istemci
tarafından bağlantı iptalinde farklı birşey yapmak için
connection_aborted() işlevini kullanabilirsiniz. Eğer
bağlantı iptal edilirse bu işlev TRUE döndürecektir.
Betiğinizi yerleşik betik zamanlayıcı ile de sonlandırabilirsiniz.
Öntanımlı zaman aşımı 30 saniyedir. Bu max_execution_time
php.ini yönergesi veya ilişkili php_value
max_execution_time Apache httpd.conf yapılandırma yönergesi veya
set_time_limit() işlevi ile değiştirilebilir. Zaman
aşımında betik iptal edilir ve yukarıdaki istemci bağlantı kesilmesindeki
gibi, eğer kayıtlı bir kapatma işlevi varsa çağrılır. Bu kapatma işlevi
içinde connection_status() işlevi ile kapatma işlevinin
zaman aşımı nedeniyle mi çağrıldığını denetleyebilirsiniz. Kapatma
işlevinin çağrılmasına zaman aşımı neden olduysa bu işlev 2 döndürür.
ABORTED ve TIMEOUT durumlarının aynı zamanda etkin olabileceğine dikkat edilmesi gerekir. Eğer PHP'ye kullanıcı iptallerini gözardı etmesini söylediyseniz bu mümkündür. PHP kullanıcının bağlantıyı koparmış olabileceğini bilir, fakat betik çalışmaya devam eder. Eğer zaman sınırına ulaşırsa çalışması iptal edilir ve kapatma işleviniz varsa çağrılır. Bu noktada connection_status() işlevinin 3 döndürdüğünü göreceksiniz.
Kalıcı bağlantılar betiğinizin çalışması bittiğinde kapanmayan bağlantılardır. Bir kalıcı bağlantı istendiğinde PHP evvelce açılmış eşdeğer bir kalıcı bağlantı var mı diye bakar ve varsa onu kullanır. Yoksa yeni bir bağlantı oluşturur. Bir 'eşdeğer' bağlantı, aynı konağa (uygulanabildiği takdirde) aynı kullanıcı adı ve parola kullanılarak açılmış bağlantıdır.
HTTP sunucuları hakkında tam bilgi sahibi olmayan kişiler ne yaptıklarını bilmeden yükü yanlış kalıcı bağlantılara dağıtabilir ve bu yanlış bağlantılarla çalışabilirler. Özellikle, size aynı bağlantı üzerinde 'kullanıcı oturumları' açma olanağını, verimli hareket işlemleri kurulmasını ve başka birçok şeyi bir bütün halinde sağlamazlar. Aslında, son derece net olarak, kalıcı bağlantılar, kalıcı olmayan bağlantılarla mümkün olmayan işlevselliği size sağlayamazlar.
Neden?
Bu HTTP sunucusunun işi nasıl yaptığı ile ilgilidir. PHP'nin HTML sayfalarını üretmek için HTTP sunucusunu üç şekilde kullanabilir.
İlk yöntem, PHP'yi bir CGI "sarmalayıcı" olarak kullanmaktır. Bu yolla, HTTP sunucusundan her PHP sayfası isteğinde PHP yorumlayıcısının yeni bir örneği oluşturulup yok edilir. Yorumlayıcı her istekten sonra yok edildiğinden kazanılan özkaynaklar da (bir SQL veritabanı bağlantısı gibi) kaybedilir. Bu durumda, kalıcı bağlantılar kullanarak da hiç bir şey kazanamazsınız; çünkü özkaynaklar kalıcı olmayacaktır.
İkinci ve en çok kullanılan yöntem, PHP'yi çok süreçli bir sunucuda bir modül olarak çalıştırmaktır. Bu olanak şimdilik sadece Apache HTTP sunucusu ile mümkündür. Çok süreçli bir sunucu, işleri sayfaları sunmak olan bir çok (alt) süreci denetimi altında tutan bir ana sürece sahiptir. Bir istemciden bir istek geldiğinde, başka istemcilere hizmet sunmayan alt süreçlerden birini bu isteğe tahsis eder. Eğer aynı istemci ikinci bir istek yaparsa bu isteğe başka bir alt süreç yanıt verebilir. Kalıcı bir bağlantı açıldığında SQL hizmeti isteği yapılan her sayfa isteği SQL sunucuya tahsis edilen aynı bağlantıdan sunulur.
Son yöntem, PHP'yi çok evreli bir sunucuda bir eklenti olarak kullanmaktır. PHP4 şimdilik, PHP'nin bir eklenti olarak kullanımına izin veren Netscape FastTrack (iPlanet), Microsoft's Internet Information Server (IIS) ve O'Reilly's WebSite Pro gibi çok evreli HTTP sunucularında ISAPI, WSAPI ve (Windows üzerinde) NSAPI için destek vermektedir. Davranış esas olarak ikinci yöntemde açıklanan çok süreçli yöntemle aynıdır.
Kalıcı bağlantılar ek bir işlevselliğe sahip değilseler bunlar neden tercih ediliyorlar?
Yanıtı oldukça basittir: Verimlilik. SQL sunucunuza bağlantı açmak çok masraflıysa kalıcı bağlantılar kurmak daha iyidir. Bu bedel gerçekte birçok sebebe bağlı olabileceği gibi olmayabilir de. Bu, veritabanının, HTTP sunucunun bulunduğu makinede olup olmamasından SQL sunucusunun makineye ne kadar yük bindirdiğine kadar geniş bir yelpazede değerlendirilebilir. Son değerlendirmede, eğer bu bedel yüksekse kalıcı bağlantıların büyük ölçüde yardımı olacaktır. SQL sunucuya yapılan her bağlantı isteğinde alt süreç sadece o sayfayı işleyeceği yerde, kalıcı bağlantı durumunda her alt sürecin ömrü boyunca bir bağlantı krmasına olanak tanınır. Yani, bir kalıcı bağlantı açmış her alt sürecin kendine ait bir kalıcı bağlantısı vardır. Örneğin, SQl sunucunuza kalıcı bağlantı açan betiğiniz 20 ayrı alt süreç çalıştırıyorsa alt süreç başına bir tane olmak 20 ayrı bağlantı var demektir.
Ancak şuna dikkat edin, bağlantı sayısı sınırlı bir veritabanını bu sınırın üstünde kalıcı bağlantılarla kullanıyorsanız bunun bazı götürüleri olabilir. Eğer veritabanınız aynı anda 16 bağlantılık bir sınıra sahipse ve çok meşgul bir sunucu oturumunda 17 alt evre bağlantı açmaya çalışıyorsa biri bunu başaramayacaktır. Eğer betiğinizde (sonsuz döngü gibi durumlarda) bağlantıların kapatılmasına izin vermeyen hatalar varsa, veritabanı sadece 16 bağlantı ile hızla batağa saplanacaktır. Terkedilmiş ve boştaki bağlantıların devreye sokulması hakkında bilgi edinmek için veritabanınızın belgelerine bakınız.
Kalıcı bağlantıları kullanırken hesaba katmanız gereken bir çok yetersizlik vardır. Bunlardan biri, bir kalıcı bağlantı üzerinden tablo kilitlemesi yapıyorsanız ve betiğiniz herhangi bir şekilde kilidi serbest bırakamazsa aynı bağlantıyı kullanan sonraki betikler sonsuza kadar engellenebilir ve bunun sonucu olarak HTTP sunucunuzu veya veritabanı sunucunuzu yeniden başlatmak zorunda kalabilirsiniz. Bir diğer durumda, hareketleri (transaction) kullanırken, bir hareket bloğu tamamlanmadan betiğiniz çalışmasını bitirirse aynı bağlantıyı kullanan sonraki betiklerin işleri başlarından aşacaktır. Her durumda, tablolarınızın kilitlerini açmak ve hareketleri başa sarmak için register_shutdown_function() işlevini kullanarak bir temizlik işlevi tanımlayabilirsiniz. Daha da iyisi, tablo kilitleri veya hareket blokları kullanan betiklerde kalıcı bağlantıları kullanmayarak bu sorunlardan tamamiyle kurtulabilirsiniz.
Özetle, kalıcı bağlantılar normal bağlantılarla bire bir eşleşecek şekilde tasarlanmışlardır. Yani, betiğinizin davranışını değiştirmeden kalıcı bağlantılar yerine her zaman kalıcı olmayan bağlantılar kullanabilirsiniz. Bu, muhtemelen betiğinizin verimliliğini etkileyecektir ama davranışında bir değişikliğe yol açmayacaktır!
Ayrıca bakınız: fbsql_pconnect(), ibase_pconnect(), ifx_pconnect(), ingres_pconnect(), msql_pconnect(), mssql_pconnect(), mysql_pconnect(), ociplogon(), odbc_pconnect(), oci_pconnect(), pfsockopen(), pg_pconnect() ve sybase_pconnect().
PHP güvenli kipi, paylaşımlı sunucu güvenliği sorunlarını çözümlemeye çalışır. Bu tür sorunları PHP seviyesinde çözümlemeye çalışmak mimari olarak doğru değildir, fakat HTTP sunucusu ve işletim sistemi seviyesindeki çözümler pek gerçekçi olmadığından çoğu kişi, özellikle de ISP'ler güvenli kipi halen kullanmaktadırlar.
Güvenli Kipin kullanımı PHP 5.3.0'dan beri önerilmemekte olup PHP 6.0.0'da tamamen kaldırılmıştır.
| İsim | Öntanımlı | Değişklik Yeri | Sürüm Bilgisi |
|---|---|---|---|
| safe_mode | "0" | PHP_INI_SYSTEM | PHP 6.0.0'da kaldırılmıştır. |
| safe_mode_gid | "0" | PHP_INI_SYSTEM | PHP 4.1.0'dan beri kullanılabilmektedir. PHP 6.0.0'da kaldırılmıştır. |
| safe_mode_include_dir | NULL | PHP_INI_SYSTEM | PHP 4.1.0'dan beri kullanılabilmektedir. PHP 6.0.0'da kaldırılmıştır. |
| safe_mode_exec_dir | "" | PHP_INI_SYSTEM | PHP 6.0.0'da kaldırılmıştır. |
| safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | PHP 6.0.0'da kaldırılmıştır. |
| safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM | PHP 6.0.0'da kaldırılmıştır. |
| open_basedir | NULL | PHP_INI_ALL | PHP < 5.3.0'da PHP_INI_SYSTEM |
| disable_functions | "" | Sadece php.ini | PHP 4.0.1'den beri kullanılabilmektedir. |
| disable_classes | "" | Sadece php.ini | HP 4.3.2'den beri kullanılabilmektedir. |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
PHP'nin güvenli kipinin etkin olup olmayacağı. PHP --enable-safe-mode seçeneği ile derlenmişse öntanımlı olarak On (etkin), aksi takdirde Off'tur (etkisiz).
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
Dosya erişiminde UID (FALSE) veya GID (TRUE) denetimi yapılıp yapılmayacağı. Öntanımlı olarak güvenli kipte, dosyalar açılırken bir kullanıcı kimliği (UID) karşılaştırması yapılır. Bunu grup kimliğini (GID) denetleterek esnetmek isterseniz safe_mode_gid yönergesine On değerini atayabilirisiniz.
UID/GID denetimleri bu dizinde ve alt dizinlerinde es geçilir. (Dizinin ya tam yolu belirtilmeli ya da include_path yönergesinde de belirtilmelidir).
PHP 4.2.0'dan beri, bu yönergede include_path yönergesinde olduğu gibi, tek bir dizin belirtmek yerine aralarına ikinokta imi (Windows'da noktalı virgül imi) koymak suretiyle birden fazla dizin belirtilebilmektedir. Belirtilen dizinin sonuna bir bölü çizgisi konmadıkça dizin ismi bir önek olarak değerlerdirilir. Örneğin, "safe_mode_include_dir = /dir/incl" ile (varsa) hem "/dir/include" hem de "/dir/incls" dizini belirtilmiş olur. "safe_mode_include_dir = /dir/incl/" durumunda ise sadece /dir/incl dizini belirtilmiş olur. Bu yönergede boş değer belirtilirse PHP 4.2.3 ve PHP 4.3.3'ten itibaren farklı UID/GID'e sahip hiçbir dosya dahil edilmez. Önceki sürümlerde tüm dosyalar dahil edilirdi.PHP güvenli kipte kullanılıyorsa system() ve sistem programlarını çalıştırılan diğer işlevlerin bu dizinde olmayan programları çalıştırmasına izin verilmez. Windows dahil tüm ortamlarda dizin ayracı olarak / kullanmanız gerekir.
Bazı ortam değişkenlerinin kullanımı güvenlik açığı riski içerir. Bu yönergede virgül ayraçlı bir liste olarak önekler belirtilir. Güvenli kipte, kullanıcıların sadece bu yönergede önekleri belirtilen ortam değişkenlerini değiştirmelerine izin verilir. Kullanıcılar öntanımlı olarak sadece PHP_ ile başlayan ortam değişkenlerinde değişiklik yapabilirler (PHP_FOO=BAR gibi).
Bilginize: Bu yönergede boş değer belirtilmişse kullanıcıların tüm ortam değişkenlerinde değişiklik yapmalarına izin verilir!
Bu yönergede, son kullanıcının putenv() kullanarak değiştiremeyeceği ortam değişkenleri virgül ayraçlı bir liste olarak belirtilir. Bu değişkenlerin önekleri safe_mode_allowed_env_vars yönergesinde belirtilmiş olsalar dahi, değiştirilmelerine izin verilmez.
Ayrıca bakınız: open_basedir, disable_functions, disable_classes, register_globals, display_errors ve log_errors.
safe_mode yönergesinin değeri On olduğu takdirde, PHP, betik sahibinin üzerinde çalışılan dosya veya dizin sahibiyle eşleşip eşleşmediğini denetler. Örneğin,
<?php
readfile('/etc/passwd');
?>
kodunu içeren betik.php betiği,
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 betik.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
ortamında çalıştırılırsa, güvenli kip etkin olduğu takdirde işlem şöyle bir hatayla sonuçlanır:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/betik.php on line 2
Bununla birlikte, kesin UID sınamasının uygun olmadığı, esnek GID sınamasının yeterli olduğu sistemler olabilir. Bu durum, safe_mode_gid yönergesi ile sağlanabilir. Bu yönergeye On değeri vererek esnek GID sınaması, Off değeri (öntanımlıdır) vererek UID sınaması yaptırmak mümkündür.
safe_mode yönergesini etkin kılmak yerine, tüm dosya işlemlerini belli bir dizin altındaki dosyalarla sınırlamak için open_basedir yönergesini kullanabilirsiniz. Örneğin, bunu Apache httpd.conf dosyasında şöyle yapabilirsiniz:
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
Önceki örnekteki betik.php dosyanızı bu open_basedir ayarı ile kullanırsanız şöyle bir sonuç alırsınız:
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/betik.php on line 2
Ayrıca, işlevleri tek tek de iptal etmek mümkündür. Ancak, disable_functions yönergesi php.ini dosyası dışında kullanılamaz. Yani, bazı işlevlere erişimi, httpd.conf dosyanızda sanal konak veya dizin temelinde yasaklayamazsınız. php.ini dosyanızda şöyle bir satır varsa:
disable_functions = readfile,system
betik.php dosyanızdan şöyle bir sonuç alırsınız:
Warning: readfile() has been disabled for security reasons in /docroot/betik.php on line 2
Şüphesiz, bu PHP kısıtlamaları çalıştırılabilir dosyalar için geçerli değildir.
Güvenli kip ile sınırlanmış işlev listesi hala yanlış veya eksik olabilir.
| İşlev | Kısıtlama |
|---|---|
| dbmopen() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| dbase_open() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| filepro() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| filepro_rowcount() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| filepro_retrieve() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| ifx_* | sql_safe_mode kısıtlamaları, (!= safe mode) |
| ingres_* | sql_safe_mode kısıtlamaları, (!= safe mode) |
| mysql_* | sql_safe_mode kısıtlamaları, (!= safe mode) |
| pg_lo_import() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| posix_mkfifo() | Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| putenv() | safe_mode_protected_env_vars ve safe_mode_allowed_env_vars yönergelerine tabidir. Ayrıca, putenv() işlevine de bakınız. |
| move_uploaded_file() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| chdir() | Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| dl() | Bu işlev, PHP güvenli kipte çalışırken iptal edilir. |
| ter tırnak işleci | Bu işlev, PHP güvenli kipte çalışırken iptal edilir. |
| shell_exec() (ters tırnakların işlevsel eşdeğeri) | Bu işlev, PHP güvenli kipte çalışırken iptal edilir. |
| exec() | Sadece safe_mode_exec_dir altındaki çalıştırılabilirleri bu işlevle çalıştırabilirsiniz. Uygulamaya bağlı sebeplerle çalıştırılabilirlerin dosya yolunda .. bileşenlerine izin verilmez. Bu işlevin değiştirgeleri üzerinde escapeshellcmd()işlevi çalıştırılır. |
| system() | Sadece safe_mode_exec_dir altındaki çalıştırılabilirleri bu işlevle çalıştırabilirsiniz. Uygulamaya bağlı sebeplerle çalıştırılabilirlerin dosya yolunda .. bileşenlerine izin verilmez. Bu işlevin değiştirgeleri üzerinde escapeshellcmd()işlevi çalıştırılır. |
| passthru() | Sadece safe_mode_exec_dir altındaki çalıştırılabilirleri bu işlevle çalıştırabilirsiniz. Uygulamaya bağlı sebeplerle çalıştırılabilirlerin dosya yolunda .. bileşenlerine izin verilmez. Bu işlevin değiştirgeleri üzerinde escapeshellcmd()işlevi çalıştırılır. |
| popen() | Sadece safe_mode_exec_dir altındaki çalıştırılabilirleri bu işlevle çalıştırabilirsiniz. Uygulamaya bağlı sebeplerle çalıştırılabilirlerin dosya yolunda .. bileşenlerine izin verilmez. Bu işlevin değiştirgeleri üzerinde escapeshellcmd()işlevi çalıştırılır. |
| fopen() | Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| mkdir() | Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| rmdir() | Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| rename() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| unlink() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| copy() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. (kaynak ve hedef üzerinde) |
| chgrp() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| chown() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| chmod() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Ek olarak, SUID, SGID ve yapışkan bitleri tanımlayamazsınız. |
| touch() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. |
| symlink() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. (bilgi: sadece hedef sınanır) |
| link() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. (bilgi: sadece hedef sınanır) |
| apache_request_headers() | Güvenli kipte, authorization ile başlayan başlıklar (harf büyüklüğüne duyarsız) döndürülmeyecektir. |
| header() | Güvenli kipte, betiğin kullanıcı kimliği WWW-Authenticate başlığının realm kısmına eklenir (HTTP Kimlik doğrulamasında bu başlık etkinse). |
| PHP_AUTH değişkenleri | Güvenli kipte, PHP_AUTH_USER, PHP_AUTH_PW ve AUTH_TYPE değişkenleri $_SERVER içinde bulunmaz. Yine de, bundan bağımsız olarak, USER yerine REMOTE_USER kullanabilirsiniz (bilgi: sadece PHP 4.3.0'dan beri etkindir). |
| highlight_file(), show_source() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. (bilgi: sadece PHP 4.2.1'den beri etkindir) |
| parse_ini_file() | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. (bilgi: sadece PHP 4.2.1'den beri etkindir) |
| set_time_limit() |
safe_mode etkinse etkisizdir.
|
| max_execution_time |
safe_mode etkinse etkisizdir.
|
| mail() | Güvenli kipte, 5. değiştirge iptal edilir. (bilgi: sadece PHP 4.2.3'ten beri etkindir) |
| session_start() | session.save_handler yönergesinde files öntanımlı ise betiğin sahibi session.save_path dizininin sahibi ile aynı olmak zorundadır. |
| Tüm dosya sistemi ve akım işlevleri. | Üzerinde işlem yapılan dosya ve dizinlerin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. Betiğin çalıştığı dizinin sahibinin betiği çalıştıran kullanıcı ile aynı olup olmadığı sınanır. (safe_mode_include_dir php.ini yönergesine bakınız.) |
PHP 4.3.0 sürümünden beri, Komut Satırı Arayüzü anlamına gelen CLI isimli yeni bir SAPI türünü (Sunucu Uygulaması Yazılım Arayüzü) desteklemektedir. Adından da anlaşıldığı gibi, bu SAPI türünün ana odağı PHP ile kabuk (veya masaüstü) uygulamaları geliştirmektir. CLI SAPI'nin bu bölümde anlatılan diğer SAPI'lerden az bir farkı vardır. Söylemek gerekir ki, her ne kadar CLI ve CGI birçok aynı davranışı paylaşsa da farklı SAPI'lerdir.
CLI SAPI ilk kez PHP 4.2.0 ile dağıtıldı, fakat hala deneyseldi ve ./configure çalıştırılırken açıkça --enable-cli ile etkinleştirilmesi gerekiyordu. PHP 4.3.0'dan beri CLI SAPI deneysel değil ve --enable-cli öntanımlı olarak bulunmaktadır. Etkinliğini kaldırmak için --disable-cli kullanabilirsiniz.
PHP 4.3.0'dan beri, CLI/CGI çalıştırılabilirinin adı, yeri ve mevcudiyeti PHP'nin sisteminize nasıl kurulduğuna bağlı olarak değişecektir. make çalıştırıldığında öntanımlı olarak, hem CGI hem de CLI derlenir ve PHP kaynak ağacında sapi/cgi/php-cgi ve sapi/cli/php dizinlerine ayrı yerleştirilirler. Her ikisinin de adının php olduğunu farkedeceksiniz. make install çalıştırıldığında ne yaşanacağı yapılandırma satırınıza bağlıdır. Eğer yapılandırma sırasında apxs gibi bir SAPI modülü seçildiyse, veya --disable-cgi seçeneği kullanıldıysa, make install sırasında CLI {PREFIX}/bin/php dizinine kopyalanır, aksi takdirde buraya CGI yerleştirilir. Örneğin, --with--apxs yapılandırma satırınızda ise make install sırasında CLI {PREFIX}/bin/php dizinine kopyalanır. Eğer CGI kurulumunu etkisiz kılmak isterseniz, make install'dan sonra make install-cli kullanın. Ya da yapılandırma satırınızda --disable-cgi belirtebilirsiniz.
Bilginize: --enable-cli ve --enable-cgi öntanımlı olarak etkinleştirildiği için, yapılandırma satırınızda sadece --enable-cli olması CLI'nin make install sırasında {PREFIX}/bin/php dizinine kopyalanacağı anlamına gelmez.
PHP 4.2.0 ve PHP 4.2.3 arasındaki Windows paketlerinde CLI php-cli.exe olarak, CGI da aynı dizinde php.exe olarak dağıtılmıştır. PHP 4.3.0'la başlayarak Windows paketlerinde CLI, cli adlı farklı bir dizinde php.exe olarak dağıtılmıştır, böylece cli/php.exe olmuştur. PHP 5'le başlayarak, CLI ana dizinde php.exe adıyla dağıtılmıştır. CGI sürümü php-cgi.exe olarak dağıtılmaktadır.
PHP 5'den beri, php-win.exe isimli yeni bir dosya dağıtılmaktadır. Bu CLI sürümü ile aynıdır, fakat php-win herhangi çıktı vermez, bu nedenle konsol desteklemez (ekranda "dos penceresi" görünmez). Bu yaklaşım php-gtk ile benzerlik gösterir. --enable-cli-win32 ile yapılandırılması gerekir.
Bilginize: Bende hangi SAPI var?
Kabuktan, php -v yazımı php CGI mı CLI mi olduğunu söyler. Ayrıca php_sapi_name() işlevine ve PHP_SAPI sabitine bakınız.
Bilginize: PHP 4.3.2'de bir Unix kılavuz (man) sayfası eklendi. Bunu kabuk ortamınıza man php yazarak görüntüleyebilirsiniz.
CLI SAPI'nin diğer SAPI'lerden dikkate değer farklılıkları:
CGI SAPI'den farklı olarak, çıktıya hiçbir başlık yazılmaz.
CGI SAPI HTTP başlıklarını önlemek için bir yol sunsa da, CLI SAPI'de onları etkinleştirecek eşdeğer bir seçenek yoktur.
CLI öntanımlı olarak sessiz kipte başlar, -q ve --no-header seçenekleri eski CGI betiklerinin kullanımına uyumluluk için tutulmaktadır.
Çalışma dizinini betiğinki ile aynı yapmaz. (-C ve --no-chdir seçenekleri uyumluluk için tutulmaktadır)
Düz metin hata iletileri (HTML biçimlendirmesi yok).
Kabuk ortamında birşey ifade etmedikleri için CLI SAPI tarafından geçersiz kılınan bazı php.ini yönergeleri vardır:
| Yönerge | CLI SAPI öntanımlı değeri | Yorum |
|---|---|---|
| html_errors | FALSE | Hata iletileri HTML etiketleri ile karıştırılmışken, kabukta bunları okumak oldukça zor olacağı için bu yönerge öntanımlı olarak FALSE değerlidir. |
| implicit_flush | TRUE | print(), echo() ve arkadaşlarından gelen çıktıların önbellekte tutulmadan hemen çıktıya yazılması istenir. Eğer standart çıktıyı ertelemek veya işlemek isterseniz çıktı önbellekleme kullanabilirsiniz. |
| max_execution_time | 0 (sınırsız) | Kabuk ortamlarında PHP kullanımının sonsuz olasılığı olduğu için, azami işletim süresi sınırsız olarak belirtilmiştir. HTML üretmek için yazılan uygulamalar genellikle çok çabuk işletilse de, kabuk uygulamaları daha fazla işletim zamanı harcama eğilimindedirler. |
| register_argc_argv | TRUE |
Bu ayar TRUE olduğu için CLI SAPIdeki argc (uygulamaya aktarılan değiştirge sayısı) ve argv (gerçek değiştirgeler dizisi) değerlerine her zaman erişebilirsiniz. PHP 4.3.0'dan beri, CLI SAPI kullanırken $argc ve $argv PHP değişkenleri uygun değerlerle doldurulur ve kaydedilir. Bu sürümden önce, bu değişkenlerin yaratılışı register_globals PHP yönergesi değerinin on olmasını gerektiren CGI ve modül sürümlerindeki gibi davranırdı. Sürüme ve register_globals ayarına bakmaksızın $_SERVER veya $HTTP_SERVER_VARS üzerinden kullanabilirsiniz. Örnek: $_SERVER['argv'] |
Bilginize: Bu yönergeler php.ini yapılandırma dosyasından başka bir değerle ilklendirilemezler. Bu bir sınırlamadır çünkü bu öntanımlı değerler bütün yapılandırma dosyaları çözümlendikten sonra uygulanırlar. Fakat, çalışma anında bunların değerleri değişirilebilir (bu yönergeler için birşey ifade etmez, örn. register_argc_argv).
Kabuk ortamında kolay çalışmak için aşağıdaki sabitler tanımlanmıştır:
| Sabit | Açıklama |
|---|---|
| STDIN |
stdin'e açılmış bir akımdır. Aşağıdaki örnek akımı açıp geleni kaydeder:
<?phpEğer stdin'den tek satır okumak istenirse şu kullanılabilir:
<?php
|
| STDOUT | stdout'a açılmış bir akımdır. Aşağıdaki örnek akımı açıp gideni kaydeder:
<?php
|
| STDERR |
stderr'e açılmış bir akımdır. Aşağıdaki örnek akımı açıp çıktıyı kaydeder:
<?php
|
Yukarıda verilene göre, örneğin stderr için bir akım açmanız gerekmez, ancak akım kaynağı yerine sabit kullanabilirsiniz:
php -r 'fwrite(STDERR, "stderr\n");'
Betik sonlandığında PHP özdevinimli olarak akımları kapattığı için sizin ayrıca kapatmanız gerekmez.
Bilginize: Bu sabitler, PHP betiğinin stdin'den okunması halinde mevcut değildir.
CLI SAPI geçerli dizini betiğin işletildiği dizine değiştirmez!
CGI SAPI farkını gösteren örnek:
<?php
// deneme.php isimli basit deneme uygulamamız
echo getcwd(), "\n";
?>
CGI sürümününü kullanınca, çıktı şöyle olur:
$ pwd /tmp $ php -q bir_dizin/deneme.php /tmp/bir_dizin
Bu açıkça gösteriyor ki PHP geçerli dizinini betiğin çalıştığı dizine değiştiriyor.
CLI SAPI kullanımı sonucu:
$ pwd /tmp $ php -f bir_dizin/deneme.php /tmp
Bu, PHP'de kabuk araçları yazarken daha fazla esneklik imkanı verir.
Bilginize: CGI SAPI bu CLI SAPI davranışını komut satırından çalışırken -C seçeneği ile destekler.
PHP çalıştırılabiliri tarafından desteklenen komut satırı seçenekleri listesi istenirse PHP -h seçeneği ile çalıştırılarak sorgulanabilir:
Kullanım: php [seçenekler] [-f] <dosya> [--] [değiştirgeler...]
php [seçenekler] -r <kod> [--] [değiştirgeler...]
php [seçenekler] [-B <başlangıç_kodu>] -R <kod> [-E <bitiş_kodu>] [--] [değiştirgeler...]
php [seçenekler] [-B <başlangıç_kodu>] -F <dosya> [-E <bitiş_kodu>] [--] [değiştirgeler...]
php [seçenekler] -- [değiştirgeler...]
php [seçenekler] -a
-a Etkileşimli çalışır
-c <yol>|<dosya> php.ini dosyası bu dizinde aranır
-n Hiçbir php.ini dosyası kullanılmayacak
-d foo[=bar] 'bar' değerli bir foo INI girdisi tanımlar
-e Hata ayıklayıcı/profilci için genişletilmiş bilgi üretir
-f <dosya> <dosya>'yı çözümler ve çalıştırır
-h Bu yardım iletisini gösterir
-i PHP bilgisi
-l Sadece söz dizimi denetimi (lint)
-m Modül olarak derlenenleri gösterir
-r <kod> PHP <kod>unu <?..?> betik etiketleri olmadan çalıştırır
-B <başlangıç_kodu> PHP <başlangıç_kodu>nu girdi satırlarından önce
çalıştırır
-R <kod> PHP <kod>unu her girdi satırı için çalıştırır
-F <dosya> Her girdi satırı için <dosya>yı çözümler ve çalıştırır
-E <bitiş_kodu> PHP <bitiş_kodu>nu bütün girdi satırlarını işledikten
sonra çalıştırır
-H Harici araçlardan aktarılan bütün değiştirgeleri gizler
-s Kaynağı renklendirilmiş söz dizimi ile gösterir
-v Sürüm bilgilerini gösterir
-w Kaynağı boşluklar ve yorumlardan arındırılmış olarak
gösterir
-z <dosya> <dosya> Zend eklentisini yükler
değiştirgeler... Betiğe aktarılan değiştirgeler. Eğer betik stdin'den
okunuyorsa veya ilk değiştirge - ile başlıyorsa
-- değiştirgeler kullanın
--ini Yapılandırma dosyası isimlerini gösterir
--rf <isim> <isim> işlevi hakkında bilgi gösterir
--rc <isim> <isim> sınıfı hakkında bilgi gösterir
--re <isim> <isim> eklentisi hakkında bilgi gösterir
--ri <isim> <isim> eklentisi için yapılandırmayı gösterir
CLI SAPI çalıştırmak istediğiniz PHP kodunu getirmek için üç farklı yola sahiptir:
PHP'ye belli bir dosyayı çalıştırmasını söyleyerek.
php ornek_betik.php php -f ornek_betik.php
Her iki yolla da (-f seçeneğini olsun olmasın) ornek_betik.php dosyası çalıştırılır. Çalıştırmak için herhangi bir dosyayı seçebilirsiniz - PHP betikleriniz .php uzantısı ile bitmek zorunda değildir, istediğiniz herhangi bir isim ve uzantıya sahip olabilirler.
Bilginize: Eğer betiklerinize değiştirgeler aktarmanız gerekirse -f seçeneğini kullandığınızda ilk değiştirge olarak -- aktarmanız gerekir.
Doğrudan komut satırında işletmek üzere PHP kodunu aktararak.
php -r 'print_r(get_defined_constants());'
Kabuk değişken değişimi ve tırnak kullanımı için özel bir çaba sarfetmek gerekir.
Bilginize: Örneği dikkatle okuyunuz, hiçbir başlangıç veya bitiş etiketi yok! -r seçeneği bunlara ihtiyaç duymaz. Bunların kullanımı çözümleme hatasına yol açar.
Çalıştırılacak PHP kodunu standart girdiden (stdin) yollamak suretiyle.
Bu, PHP kodunu devingen olarak oluşturma ve bunu çalıştırma yeteneği sağlar. Örneğin:
$ bir_uygulama | bir_suzgec | php | sort -u > nihai_sonuc.txt
Kodu çalıştırmak için bu üç yol birlikte kullanılamaz.
Her kabuk uygulamasındaki gibi, PHP çalıştırılabiliri bir takım değiştirgeler alabildiği gibi PHP betiğiniz de değiştirgeler alabilir. Betiğinize aktarabileceğiniz değiştirge sayısı PHP tarafından sınırlandırılmamıştır (kabukta aktarılabilecek karakter sayısı sınırlıdır; genellikle bu sınıra ulaşmazsınız). Betiğinize aktarılan değiştirgeler $argv küresel dizisinde bulunur. Sıfır indisi her zaman betik adını içerir (PHP kodu standart girdiden veya -r komut satırı seçeneğiyle çalıştıysa betik adı - olur). İkinci kayıtlı küresel değişken $argc'dir ve $argv dizisindeki eleman sayısını içerir (betiğe aktarılan değiştirge sayısını değil).
Betiğinize aktarmak istediğiniz değiştirgeler - karakteriyle başlamadığı sürece, özel bir şeye dikkat etmeniz gerekmez. Betiğinize - ile başlayan bir değiştirge aktarımı sorun yaratır çünkü PHP bunu kendisinin işlemesi gerektiğini düşünecektir. Bunu önlemek için, değiştirge listesi ayracı olan -- kullanın, bunu izleyen her değiştirge ellenmeden betiğinize aktarılır.
# Bu verilen kodu çalıştırmaz fakat PHP kullanımını gösterir
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# Bu '-h' değiştirgesini betiğinize aktarır ve
# PHP'nin değiştirgeyi görmesini önler
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
Kabuk betikleri için PHP farklı bir yoldan kullanılabilir. İlk satırı #!/usr/bin/php ile başlayan bir betik yazabilirsiniz. Bunu takip eden satırlara başlangıç ve bitiş etiketlerine sahip normal PHP kodunuzu yerleştirebilirsiniz. Dosyanın çalıştırma izinlerini ayarladığınızda (örn. chmod +x deneme) betiğiniz normal bir kabuk veya perl betiği gibi işletilir.
Örnek 1 - PHP betiğini kabuk betiği olarak çalıştırmak
#!/usr/bin/php
<?php
var_dump($argv);
?>
Geçerli dizindeki bu dosyanın isminin deneme olduğunu varsayarsak, aşağıdakini yapabiliriz:
$ chmod +x deneme
$ ./deneme -h -- foo
array(4) {
[0]=>
string(6) "./deneme"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
Gördüğünüz gibi, bu durumda betiğinize - ile başlayan değiştirge aktarırken hiçbir şeye dikkat etmeniz gerekmez.
Uzun seçenekler PHP 4.3.3'den beri mevcuttur.
| Seçenek | Uzun Seçenek | Açıklama |
|---|---|---|
| -a | --interactive |
PHP'yi etkileşimli çalıştırır. Eğer PHP'yi Readline eklentisi ile derlerseniz (Windows'ta yoktur), tamamlama özelliği olan (örneğin bir değişken adını yazmaya başlayıp TAB tuşuna basınca PHP adı tamamlar), ok tuşlarıyla erişebileceğiniz bir komut satırı geçmişi olan güzel bir kabuğunuz olur. Komut satırı geçmişi ~/.php_history dosyasında saklanır.
|
| -b | --bindpath |
Harici FASTCGI Sunucusu kipi için dizin yolu (sadece CGI için). |
| -C | --no-chdir |
Betiğin bulunduğu dizine chdir yapılmaz (sadece CGI için). |
| -q | --no-header |
Sessiz kip. HTTP başlığının çıktılanmasını engeller (sadece CGI için). |
| -T | --timing |
Betiğin çalışma süresini sayı kere ölçer (sadece CGI için). |
| -c | --php-ini |
Bu seçenek php.ini dosyasının aranacağı dizini veya özel bir INI dosyasını (adı php.ini olmak zorunda değildir) belirtebilir. Örneğin: $ php -c /ozel/dizin/ ornek_betik.php $ php -c /ozel/dizin/ozel-dosya.ini ornek_betik.php Eğer bu seçeneği belirtmezseniz, dosya öntanımlı dizinlerde aranır. |
| -n | --no-php-ini |
php.iniyi görmezden gel. Bu seçenek PHP 4.3.0'dan beri vardır. |
| -d | --define |
Bu seçenek php.inide izin verilen yapılandırma yönergelerinden herhangi birine özel değer atamanıza imkan verir. Söz dizimi: -d ayar_yönergesi[=değer] Örnekler (satırlar okunabilirlik açısından kaydırılmıştır):
# Değer kısmını atlamak yapılandırma yönergesini "1" yapar
$ php -d max_execution_time
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"
# Boş değer aktarınca yapılandırma yönergesinine "" atanır
php -d max_execution_time=
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""
# Yapılandırma yönergesine '=' karakterinden sonra aktarılan değer atanır
$ php -d max_execution_time=20
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$ php
-d max_execution_time=herhangi_bir_sey
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "herhangi_bir_sey"
|
| -e | --profile-info |
Hata ayıklayıcı/profilci için kullanılmak üzere genişletilmiş bilgi kipini etkinleştirir. |
| -f | --file |
-f seçeneğiyle verilen dosya adını çözümler ve çalıştırır. Bu seçenek isteğe bağlıdır; verilmese de olur. Sadece çalıştırılacak dosya adını belirtmek yeterlidir.
|
| -h ve -? | --help ve --usage | Bu seçenekle, komut satırı seçenekleri tek satırlık açıklamalarıyla listelenir. |
| -i | --info | Bu komut satırı seçeneği phpinfo() işlevini çağırır ve sonuçları yazdırır. Eğer PHP doğru çalışmıyorsa, php -i komutunu kullanmanız ve bilgi tablolarından önce herhangi bir hata iletisi yazdırılmış mı bakmanız tavsiye edilir. CGI kipini kullanırken çıktının HTML biçiminde olacağına ve bu nedenle çok büyük olacağına dikkat ediniz. |
| -l | --syntax-check |
Bu seçenek verilen PHP kodunun sadece söz dizimini denetlemek için uygun bir yol sağlar. Başarı halinde, No syntax errors detected in <filename> metni standart çıktıya yazılır ve kabuk dönüş kodu 0 olur. Başarısızlık halinde, iç çözümleyici hatasına ilaveten Errors parsing <filename> metni standart çıktıya yazılır ve kabuk dönüş kodu -1 olur. Bu seçenek ölümcül hataları bulamaz (tanımlanmamış işlevler gibi). Eğer ölümcül hataları da denetlemek isterseniz -f seçeneğini kullanın.
|
| -m | --modules |
Bu seçeneğin kullanımı ile PHP yerleşik (ve yüklü) PHP ve Zend modüllerini listeler: $ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules] |
| -r | --run |
Bu seçenek PHP'nin komut satırından çalıştırılmasına izin verir. PHP başlangıç ve bitiş etiketleri (<?php ve ?>) gerekmez ve eğer bulunurlarsa çözümleme hatasına neden olurlar.
|
| -B | --process-begin |
Standart girdi işlenmeden çalıştırılacak PHP kodudur. PHP 5'de eklenmiştir. |
| -R | --process-code |
Her girdi satırı için işletilecek PHP kodudur. PHP 5'de eklenmiştir. Bu kipte iki özel değişken bulunur: $argn ve $argi. $argn PHP'nin o anda işlediği satırı içerirken, $argi satır numarasını içerir. |
| -F | --process-file |
Her girdi satırı için işletilecek PHP dosyasıdır. PHP 5'de eklenmiştir. |
| -E | --process-end |
Girdi işlendikten sonra işletilecek PHP kodudur. PHP 5'de eklenmiştir. Örnek 2 - Bir projedeki satır sayısını saymak için -B, -R ve -E seçeneklerinin kullanımı $ find projem | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Toplam Satır Sayısı: $l\n";' Toplam Satır Sayısı: 37328 |
| -s | --syntax-highlight ve --syntax-highlighting |
Renklendirilmiş söz dizimi ile kaynak gösterimi. Bu seçenek dosyayı çözümlemek için içsel yöntemleri kullanır ve renklendirilmiş bir HTML sürümü üreterek standart çıktıya yazar. Bütün yaptığı HTML başlıkları olmadan <code> [...] </code> HTML etiketlerinden oluşan bir blok üretmektir.
|
| -v | --version |
PHP, PHP SAPI ve Zend sürümlerini standart çıktıya yazar. Örneğin: $ php -v PHP 5.3.0alpha3-dev (cli) (built: Nov 13 2008 18:20:00) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2008 Zend Technologies |
| -w | --strip |
Kaynağı boşluklar ve yorumlardan arındırılmış olarak gösterir.
|
| -z | --zend-extension |
Zend eklentisini yükler. Eğer sadece dosya ismi verilirse, PHP bu eklentiyi sisteminizde geçerli öntanımlı kütüphane yolundan yüklemeye çalışır (Linux sistemlerde genellikle /etc/ld.so.conf dosyasında belirtilir). Dosya adı tam yol bilgisi ile aktarılırsa sistem kütüphanesi arama yolu kullanılmaz. Bir dizin bilgisiyle göreceli bir dosya ismi kullanımı PHP'ye sadece geçerli dizine göreceli eklentinin yüklenmesini söyler. |
| --ini |
Yapılandırma dosya isimlerini ve taranan dizinleri gösterir. PHP 5.2.3'den beri mevcuttur. Örnek 3 --ini örneği $ php --ini Configuration File (php.ini) Path: /usr/dev/php/5.2/lib Loaded Configuration File: /usr/dev/php/5.2/lib/php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none)
|
|
| --rf | --rfunction |
Verilen işlev veya sınıf yöntemi hakkında bilgi gösterir (örneğin, değiştirge adlarını ve sayısını). PHP 5.1.2'den beri vardır. Bu seçenek sadece PHP Reflection desteği ile derlendiyse mevcuttur.
Örnek 4 - Temel --rf kullanımı $ php --rf var_dump
Function [ <internal> public function var_dump ] {
- Parameters [2] {
Parameter #0 [ <required> $var ]
Parameter #1 [ <optional> $... ]
}
}
|
| --rc | --rclass |
Verilen sınıf hakkında bilgi gösterir (sabitler, özellikler ve yöntemler listesi). PHP 5.1.2'den beri vardır. Bu seçenek sadece PHP Reflection desteği ile derlendiyse mevcuttur.
Örnek 5 --rc örneği $ php --rc Directory
Class [ <internal:standard> class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ <internal> public method close ] {
}
Method [ <internal> public method rewind ] {
}
Method [ <internal> public method read ] {
}
}
}
|
| --re | --rextension |
Verilen eklenti hakkında bilgi gösterir (php.ini seçenekleri, tanımlı işlevler, sabitler ve sınıflar listesi). PHP 5.1.2'den beri vardır. Bu seçenek sadece PHP Reflection desteği ile derlendiyse mevcuttur.
Örnek 6 --re örneği $ php --re json
Extension [ <persistent> extension #19 json version 1.2.1 ] {
- Functions {
Function [ <internal> function json_encode ] {
}
Function [ <internal> function json_decode ] {
}
}
}
|
| --ri | --rextinfo |
Verilen eklenti için yapılandırma bilgisini gösterir (phpinfo() ile aynı bilgiyi döndürür). PHP 5.2.2'den beri vardır. Çekirdek yapılandırma bilgisi "main" eklenti adı kullanılarak bulunabilir.
Örnek 7 --ri örneği $ php --ri date date date/time support => enabled "Olson" Timezone Database Version => 2008.9 Timezone Database => internal Default timezone => Europe/Helsinki Directive => Local Value => Master Value date.timezone => no value => no value date.default_latitude => 31.7667 => 31.7667 date.default_longitude => 35.2333 => 35.2333 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333
|
Bilginize: -rBRFEH, --ini ve --r[fcei] seçenekleri sadece CLI'de kullanılabilir.
PHP çalıştırılabiliri HTTP sunucusundan tamamen bağımsız olarak PHP betikleri çalıştırmak için kullanılabilir. Eğer Unix sistemi üzerindeyseniz, PHP betiğinizin başına özel bir satır eklemeli ve dosyanızı çalıştırılabilir yapmalısınız; böylece sistem betiğinizi hangi programın çalıştıracağını bilir. Windows üzerinde .php dosyalarına çift tıklama seçeneği ile php.exe ilişkilendirebilir veya betiği PHP üzerinden çalıştıracak bir yığın dosyası yapabilirsiniz. Unix'de çalışması için betiğe eklenen ilk satır Windows'da sorun çıkarmaz, böylece platformdan bağımsız programlar yazabilirsiniz. Örnek basit bir komut satırı PHP programı aşağıdaki gibi olabilir.
Örnek 8 - Komut satırından çalıştırılması planlanan betik (betik.php)
#!/usr/bin/php
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
Bu tek seçenekli bir komut satırı PHP betiğidir.
Kullanımı:
<?php echo $argv[0]; ?> <secenek>
<secenek> yazdırmak istediğiniz bir kelime olabilir.
--help, -help, -h,
veya -? seçenekleriyle, bu yardımı alabilirsiniz.
<?php
} else {
echo $argv[1];
}
?>
Yukarıdaki betikte, bu dosyanın PHP tarafından çalıştırılması gerektiğini belirten özel bir ilk satır kullandık. Burada CLI sürümü ile çalışıyoruz, böylece HTTP başlık çıktıları olmayacak. PHP ile komut satırı uygulamaları yazarken kullanabileceğiniz iki değişken vardır: $argc ve $argv. Birincisi değiştirge sayısından bir fazlasıdır (çalışan betiğin adı). İkincisi değiştirgeleri içeren bir dizidir, sıfır numarayla başlar ve ilk elemanında betik adını içerir ($argv[0]).
Yukarıdaki programda birden farklı sayıda değiştirge olup olmadığını kontrol ettik. Ayrıca eğer değiştirge --help, -help, -h veya -? ise yardım iletisini yazdırdık ve betik adını devingen olarak yazdırdık. Eğer bazı başka değiştirgeler aldıysak yazdırdık.
Eğer yukarıdaki betiği Unix üzerinde çalıştırmak isterseniz betiği çalıştırılabilir yapmalı ve betik.php echothis veya betik.php -h ile çağırmalısınız. Windows'da bu iş için bir yığın dosyası yapabilirsiniz:
Örnek 9 - Bir komut satırı PHP betiği çalıştırmak için yığın dosyası (betik.bat)
@echo OFF "C:\php\php.exe" script.php %*
Yukarıdaki programı betik.php olarak adlandırdığınız ve C:\php\php.exe içinde CLI'nin php.exe olduğu varsayılarak bu yığın dosyası sizin eklediğiniz seçeneklerle çalışacaktır: betik.bat echothis veya betik.bat -h.
PHP'deki komut satırı uygulamalarını iyileştirmek için kullanabileceğiniz işlevlerle ilgili bilgi için Readline eklentisinin belgesine bakınız.
Windows üzerindeyseniz PHP, Command Line PHP on Microsoft Windows bölümünde açıklandığı gibi .php uzantısına veya C:\php\php.exe çalıştırılabilirinin belirtilmesine gerek kalmadan çalıştırılmak üzere yapılandırılabilir.
This section explains the merits of the new Garbage Collection (also known as GC) mechanism that is part of PHP 5.3. This was originally written as a three part column for » php|architect.
A PHP variable is stored in a container called a "zval". A zval container contains, besides the variable's type and value, two additional bits of information. The first is called "is_ref" and is a boolean value indicating whether or not the variable is part of a "reference set". With this bit, PHP's engine knows how to differentiate between normal variables and references. Since PHP allows user-land references, as created by the & operator, a zval container also has an internal reference counting mechanism to optimize memory usage. This second piece of additional information, called "refcount", contains how many variable names (also called symbols) point to this one zval container. All symbols are stored in a symbol table, of which there is one per scope. There is a scope for the main script (i.e., the one requested through the browser), as well as one for every function or method.
A zval container is created when a new variable is created with a constant value, such as:
<?php
$a = "new string";
?>
In this case, the new symbol name, "a", is created in the current scope, and a new variable container is created with type "string", value "new string". The "is_ref" bit is by default set to "false" because no user-land reference has been created. The "refcount" is set to "1" as there is only one symbol that makes use of this variable container. Note that if "refcount" is "1", "is_ref" is always "false". If you have » Xdebug installed, you can display this information by calling:
<?php
xdebug_debug_zval('a');
?>
which displays:
Assigning this variable to another variable name increases the refcount:
<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>
which displays:
The refcount is "2" here, because the same variable container is linked with both "a" and "b". PHP is smart enough not to copy the actual variable container when it is not necessary. Variable containers get destroyed when the "refcount" reaches zero. The "refcount" gets decreased by one when any symbol linked to the variable container leaves the scope (e.g. when the function ends) or when unset() is called on a symbol. The following example shows this:
<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
unset( $b, $c );
xdebug_debug_zval( 'a' );
?>
which displays:
If we now call "unset( $a );", the variable container, including the type and value, will be removed from memory.
Things get a tad more complex with compound types such as arrays and objects. Instead of a scalar value, arrays and objects store their properties in a symbol table of their own. This means that the following example creates three zval containers:
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>
which displays (after formatting):
Or graphically:
The three zval containers are: "a", "meaning", and "number". Similar rules apply for increasing and decreasing "refcounts". Below, we add another element to the array, and set its value to the contents of an already existing element:
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );
?>
which displays (after formatting):
Or graphically:
From the above Xdebug output, we see that both the old and new array element now point to a zval container whose "refcount" is "2". Of course, there are now two zval containers, but they are the same one. The xdebug_debug_zval() function does not show this, but you could see this by also displaying the memory pointer. Removing an element from the array is like removing a symbol from a scope. By doing so, the "refcount" of a container that an array element points to is decreased. Again, when the "refcount" reaches zero, the variable container is removed from memory. Again, an example to show this:
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
unset( $a['meaning'], $a['number'] );
xdebug_debug_zval( 'a' );
?>
which displays (after formatting):
Now, things get interesting if we add the array itself as an element of the array, which we do in the next example, in which I also snuck in a reference operator, since otherwise PHP would create a copy:
<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>
which displays (after formatting):
Or graphically:
You can see that the array variable ("a") as well as the second element ("1") now point to a variable container that has a "refcount" of "2". The "..." in the display above shows that there is recursion involved, which, of course, in this case means that the "..." points back to the original array.
Just like before, unsetting a variable removes the symbol, and the reference count of the variable container it points to is decreased by one. So, if we unset variable $a after running the above code, the reference count of the variable container that $a and element "1" point to gets decreased by one, from "2" to "1". This can be represented as:
Or graphically:
Although there is no longer a symbol in any scope pointing to this structure, it cannot be cleaned up because the array element "1" still points to this same array. Because there is no external symbol pointing to it, there is no way for a user to clean up this structure; thus you get a memory leak. Fortunately, PHP will clean up this data structure at the end of the request, but before then, this is taking up valuable space in memory. This situation happens often if you're implementing parsing algorithms or other things where you have a child point back at a "parent" element. The same situation can also happen with objects of course, where it actually is more likely to occur, as objects are always implicitly used by reference.
This might not be a problem if this only happens once or twice, but if there are thousands, or even millions, of these memory losses, this obviously starts being a problem. This is especially problematic in long running scripts, such as daemons where the request basically never ends, or in large sets of unit tests. The latter caused problems while running the unit tests for the Template component of the eZ Components library. In some cases, it would require over 2 GB of memory, which the test server didn't quite have.
Traditionally, reference counting memory mechanisms, such as that used by PHP, fail to address those circular reference memory leaks. Back in 2007, while looking into this issue, I was pointed to a paper by David F. Bacon and V.T. Rajan titled "» Concurrent Cycle Collection in Reference Counted Systems". Although the paper was written with Java in mind, I started to play around with it to see if it was feasible to implement the synchronous algorithm, as outlined in the paper, in PHP. At that moment, I didn't have a lot of time, but along came the Google Summer of Code project and we put forward the implementation of this paper as one of our ideas. Yiduo (David) Wang picked up this idea and started hacking on the first version as part of the Summer of Code project.
A full explanation of how the algorithm works would be slightly beyond the scope of this section, but the basics are explained here. First of all, we have to establish a few ground rules. If a refcount is increased, it's still in use and therefore, not garbage. If the refcount is decreased and hits zero, the zval can be freed. This means that garbage cycles can only be created when a refcount argument is decreased to a non-zero value. Secondly, in a garbage cycle, it is possible to discover which parts are garbage by checking whether it is possible to decrease their refcount by one, and then checking which of the zvals have a refcount of zero.
To avoid having to call the checking of garbage cycles with every possible decrease of a refcount, the algorithm instead puts all possible roots (zvals) in the "root buffer" (marking them "purple"). It also makes sure that each possible garbage root ends up in the buffer only once. Only when the root buffer is full does the collection mechanism start for all the different zvals inside. See step A in the figure.
In step B, the algorithm runs a depth-first search on all possible roots to decrease by one the refcounts of each zval it finds, making sure not to decrease a refcount on the same zval twice (by marking them as "grey"). In step C, the algorithm again runs a depth-first search from each root node, to check the refcount of each zval again. If it finds that the refcount is zero, the zval is marked "white" (blue in the figure). If it's larger than zero, it reverts the decreasing of the refcount by one with a depth-first search from that point on, and they are marked "black" again. In the last step (D), the algorithm walks over the root buffer removing the zval roots from there, and meanwhile, checks which zvals have been marked "white" in the previous step. Every zval marked as "white" will be freed.
Now that you have a basic understanding of how the algorithm works, we will look back at how this integrates with PHP. By default, PHP's garbage collector is turned on. There is, however, a php.ini setting that allows you to change this: zend.enable_gc.
When the garbage collector is turned on, the cycle-finding algorithm as described above is executed whenever the root buffer runs full. The root buffer has a fixed size of 10,000 possible roots (although you can alter this by changing the GC_ROOT_BUFFER_MAX_ENTRIES constant in Zend/zend_gc.c in the PHP source code, and re-compiling PHP). When the garbage collector is turned off, the cycle-finding algorithm will never run. However, possible roots will always be recorded in the root buffer, no matter whether the garbage collection mechanism has been activated with this configuration setting.
If the root buffer becomes full with possible roots while the garbage collection mechanism is turned off, further possible roots will simply not be recorded. Those possible roots that are not recorded will never be analyzed by the algorithm. If they were part of a circular reference cycle, they would never be cleaned up and would create a memory leak.
The reason why possible roots are recorded even if the mechanism has been disabled is because it's faster to record possible roots than to have to check whether the mechanism is turned on every time a possible root could be found. The garbage collection and analysis mechanism itself, however, can take a considerable amount of time.
Besides changing the zend.enable_gc configuration setting, it is also possible to turn the garbage collecting mechanism on and off by calling gc_enable() or gc_disable() respectively. Calling those functions has the same effect as turning on or off the mechanism with the configuration setting. It is also possible to force the collection of cycles even if the possible root buffer is not full yet. For this, you can use the gc_collect_cycles() function. This function will return how many cycles were collected by the algorithm.
The rationale behind the ability to turn the mechanism on and off, and to initiate cycle collection yourself, is that some parts of your application could be highly time-sensitive. In those cases, you might not want the garbage collection mechanism to kick in. Of course, by turning off the garbage collection for certain parts of your application, you do risk creating memory leaks because some possible roots might not fit into the limited root buffer. Therefore, it is probably wise to call gc_collect_cycles() just before you call gc_disable() to free up the memory that could be lost through possible roots that are already recorded in the root buffer. This then leaves an empty buffer so that there is more space for storing possible roots while the cycle collecting mechanism is turned off.
In this section, we saw how the garbage collection mechanism works and how it is integrated into PHP. In the third and final section, we will look at performance considerations and benchmarks.
We have already mentioned in the previous section that simply collecting the possible roots had a very tiny performance impact, but this is when you compare PHP 5.2 against PHP 5.3. Although the recording of possible roots compared to not recording them at all, like in PHP 5.2, is slower, other changes to the PHP runtime in PHP 5.3 prevented this particular performance loss from even showing.
There are two major areas in which performance is affected. The first area is reduced memory usage, and the second area is run-time delay when the garbage collection mechanism performs its memory cleanups. We will look at both of those issues.
First of all, the whole reason for implementing the garbage collection mechanism is to reduce memory usage by cleaning up circular-referenced variables as soon as the prerequisites are fulfilled. In PHP's implementation, this happens as soon as the root-buffer is full, or when the function gc_collect_cycles() is called. In the graph below, we display the memory usage of the script below, in both PHP 5.2 and PHP 5.3, excluding the base memory that PHP itself uses when starting up.
<?php
class Foo
{
public $var = '3.1415962654';
}
$baseMemory = memory_get_usage();
for ( $i = 0; $i <= 100000; $i++ )
{
$a = new Foo;
$a->self = $a;
if ( $i % 500 === 0 )
{
echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
}
}
?>
In this very academic example, we are creating an object in which a property is set to point back to the object itself. When the $a variable in the script is re-assigned in the next iteration of the loop, a memory leak would typically occur. In this case, two zval-containers are leaked (the object zval, and the property zval), but only one possible root is found: the variable that was unset. When the root-buffer is full after 10,000 iterations (with a total of 10,000 possible roots), the garbage collection mechanism kicks in and frees the memory associated with those possible roots. This can very clearly be seen in the jagged memory-usage graph for PHP 5.3. After each 10,000 iterations, the mechanism kicks in and frees the memory associated with the circular referenced variables. The mechanism itself does not have to do a whole lot of work in this example, because the structure that is leaked is extremely simple. From the diagram, you see that the maximum memory usage in PHP 5.3 is about 9 Mb, whereas in PHP 5.2 the memory usage keeps increasing.
The second area where the garbage collection mechanism influences performance is the time taken when the garbage collection mechanism kicks in to free the "leaked" memory. In order to see how much this is, we slightly modify the previous script to allow for a larger number of iterations and the removal of the intermediate memory usage figures. The second script is here:
<?php
class Foo
{
public $var = '3.1415962654';
}
for ( $i = 0; $i <= 1000000; $i++ )
{
$a = new Foo;
$a->self = $a;
}
echo memory_get_peak_usage(), "\n";
?>
We will run this script two times, once with the zend.enable_gc setting turned on, and once with it turned off:
On my machine, the first command seems to take consistently about 10.7 seconds, whereas the second command takes about 11.4 seconds. This is a slowdown of about 7%. However, the maximum amount of memory used by the script is reduced by 98% from 931Mb to 10Mb. This benchmark is not very scientific, or even representative of real-life applications, but it does demonstrate the memory usage benefits that this garbage collection mechanism provides. The good thing is that the slowdown is always the same 7%, for this particular script, while the memory saving capabilities save more and more memory as more circular references are found during script execution.
Let's now have a look at non-academic situation. I first started looking for circular reference collecting algorithms when I found out that while running the tests of the eZ Components' Template component with PHPUnit, I ended up swapping a lot, rendering my machine useless in the process. In order to do some benchmarks for this article, I re-ran those same tests with an empty php.ini file to disable the overhead and memory allocation that Xdebug was creating while doing code-coverage analysis.
Memory consumption dropped 95% from 1.7Gb to 75Mb, and the runtime as reported by PHPUnit increased from 2:17 for the non-GC enabled run to 2:33 for the GC enabled run, an increase of about 12%. However, with the non-GC enabled run, PHP sat there doing "nothing" for almost 15 seconds. Upon investigation with the Unix debugger, GDB, I noticed that those 15 seconds were all spent on freeing memory allocated for objects inside the PHP runtime. The actual time that the script ran was about the same in the end.
It is possible to coax a little bit more information about how the garbage collection mechanism is run from within PHP. But in order to do so, you will have to re-compile PHP to enable the benchmark and data-collecting code. You will have to set the CFLAGS environment variable to -DGC_BENCH=1 prior to running ./configure with your desired options. The following sequence should do the trick:
When you run the above example code again with the newly built PHP binary, you will see the following being shown after PHP has finished execution:
The most informative statistics are displayed in the first block. You can see here that the garbage collection mechanism ran 110 times, and in total, more than 2 million memory allocations were freed during those 110 runs. As soon as the garbage collection mechanism has run at least one time, the "Root buffer peak" is always 10000.
In this third and final installment, we had a quick look at the performance implications of the garbage collection mechanism that is now part of PHP 5.3. In general, it will only cause a slowdown when the cycle collecting algorithm actually runs, whereas in normal (smaller) scripts there should be no performance hit at all.
However, in the cases where the cycle collection mechanism does run for normal scripts, the memory reduction it will provide allows more of those scripts to run concurrently on your server, since not so much memory is used in total.
The benefits are most apparent for longer-running scripts, such as lengthy test suites or daemon scripts. Also, for PHP-GTK applications that generally tend to run longer than scripts for the Web, the new mechanism should make quite a bit of a difference regarding memory leaks creeping in over time.
Ayrıca bakınız: Eklenti Grupları/Listesi.
Alternatif PHP Önbelleği (APC), PHP için işlem kodu önbelleklemesi sağlayan özgür ve açık kaynaklı bir yazılımdır. PHP ara kodlarını en iyilemek, önbellekleme sağlamak için tasarlanmıştır.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu » PECL eklentisi PHP ile gelmez.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/apc.
Bu PECL eklentisi için bir DLL mevcut değildir. Ayrıca, Windows üzerinde kurulum bölümüne de bakınız.
Bilginize: Windows'ta, APC bir geçici dizinin varlığını ve HTTP sunucusu tarafından yazılabilir olmasını gerektirir. Bunun için TMP, TEMP, USERPROFILE ortam değişkenlerine bakar ve hiçbiri atanmamışsa son olarak WINDOWS dizinini dener.
Bilginize: Gerçeklenimle ilgili daha derinliğine ve daha teknik ayrıntılar için » geliştiriciler tarafından yazılmış TECHNOTES dosyasına bakınız.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
APC öntanımlı ayarları çoğu kurulum için yeterli olsa da daha fazla başarım için aşağıdaki değiştirgelerde ince ayarlar yapmak gerekebilir.
Başlıca iki önemli ayara karar vermek gerekir. Birincisi, APC için ne kadar paylaşımlı bellek ayıracaksınız, ikincisi APC'nin her istekte dosya değiştirilmiş mi diye bakmasını istiyor musunuz? Bu ayarların ini yönergeleri sırası ile apc.shm_size ve apc.stat'dır.
Çalışır halde bir sunucuda, eklenti ile birlikte gelen apc.php betiğini sunucunun belge kök dizinindeki bir yere koymak ve tarayıcıdan çağırmak önbellek ile ilgili ayrıntılı bilgiler sağlayacaktır. Eğer PHP kurulumunda GD desteği varsa grafikler de görüntülenecektir. Denetlenmesi gereken ilk şey önbelleğe alınan dosyalardır. Önbelleğin çalıştığını varsayar isek Önbellek tam dolma sayısı'na dikkat etmek gerekir. Bu sayı önbelleğin dolup son apc.ttl saniyede erişilmeyen girdilerin kaç kez zorla temizlenmek zorunda kalındığını gösterir. Ayarlarınızı bu sayıyı küçüktecek şekilde yapmanız gerekir. Eğer sürekli önbelleğinizi dolduruyor iseniz bu önbellek başarımınızı kötü etkileyecektir. APC için daha fazla bellek ayırmanız veya apc.filters kullanarak daha az betiği önbelleğe almanız sorunu çözebilir.
| İsim | Öntanımlı değeri | Değişiklik yeri | Değişiklik bilgisi |
|---|---|---|---|
| apc.enabled | "1" | PHP_INI_SYSTEM | APC 2'de PHP_INI_SYSTEM. APC <= 3.0.12'de PHP_INI_ALL. |
| apc.shm_segments | "1" | PHP_INI_SYSTEM | |
| apc.shm_size | "30" | PHP_INI_SYSTEM | |
| apc.optimization | "0" | PHP_INI_ALL | APC 2'de PHP_INI_SYSTEM. APC 3.0.13 sürümünde çıkartılmıştır. |
| apc.num_files_hint | "1000" | PHP_INI_SYSTEM | |
| apc.user_entries_hint | "4096" | PHP_INI_SYSTEM | APC 3.0.0'dan beri kullanılabilmektedir. |
| apc.ttl | "0" | PHP_INI_SYSTEM | APC 3.0.0'dan beri kullanılabilmektedir. |
| apc.user_ttl | "0" | PHP_INI_SYSTEM | APC 3.0.0'dan beri kullanılabilmektedir. |
| apc.gc_ttl | "3600" | PHP_INI_SYSTEM | |
| apc.cache_by_default | "1" | PHP_INI_ALL | APC <= 3.0.12'de PHP_INI_SYSTEM. APC 3.0.0'dan beri kullanılabilmektedir. |
| apc.filters | NULL | PHP_INI_SYSTEM | |
| apc.mmap_file_mask | NULL | PHP_INI_SYSTEM | |
| apc.slam_defense | "0" | PHP_INI_SYSTEM | APC 3.0.0'dan beri kullanılabilmektedir. |
| apc.file_update_protection | "2" | PHP_INI_SYSTEM | APC 3.0.6'dan beri kullanılabilmektedir. |
| apc.enable_cli | "0" | PHP_INI_SYSTEM | APC 3.0.7'den beri kullanılabilmektedir. |
| apc.max_file_size | "1M" | PHP_INI_SYSTEM | APC 3.0.7'dan beri kullanılabilmektedir. |
| apc.stat | "1" | PHP_INI_SYSTEM | APC 3.0.10'dan beri kullanılabilmektedir. |
| apc.write_lock | "1" | PHP_INI_SYSTEM | APC 3.0.11'den beri kullanılabilmektedir. |
| apc.report_autofilter | "0" | PHP_INI_SYSTEM | APC 3.0.11'den beri kullanılabilmektedir. |
| apc.include_once_override | "0" | PHP_INI_SYSTEM | APC 3.0.12'den beri kullanılabilmektedir. |
| apc.rfc1867 | "0" | PHP_INI_SYSTEM | APC 3.0.13'den beri kullanılabilmektedir. |
| apc.rfc1867_prefix | "upload_" | PHP_INI_SYSTEM | |
| apc.rfc1867_name | "APC_UPLOAD_PROGRESS" | PHP_INI_SYSTEM | |
| apc.rfc1867_freq | "0" | PHP_INI_SYSTEM | |
| apc.localcache | "0" | PHP_INI_SYSTEM | APC 3.0.14'den beri kullanılabilmektedir. |
| apc.localcache.size | "512" | PHP_INI_SYSTEM | APC 3.0.14'den beri kullanılabilmektedir. |
| apc.coredump_unmap | "0" | PHP_INI_SYSTEM | APC 3.0.16'dan beri kullanılabilmektedir. |
| apc.stat_ctime | "0" | PHP_INI_SYSTEM | APC 3.0.13'den beri kullanılabilmektedir. |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
APC'yi etkisiz duruma getirmek için apc.enabled 0 olarak ayarlanabilir. Bu APC durağan bir şekilde PHP içine derlendi ise özellikle yararlıdır, zaten bu şekilde derlendi ise etkisiz kılmanın başka bir yolu yoktur (DSO olarak derlendi ise php.ini içindeki ilgili extension satırı çıkartılabilir).
Derleyici önbelleği için ayrılan paylaşılan bellek bölümlerinin sayısı. Eğer APC paylaşılan belleğin dışına taşıyorsa ve apc.shm_size için sisteminizin izin verdiği en yüksek değeri verdiyseniz bu değeri yükseltmeyi deneyebilirsiniz.
MB olarak her bir paylaşılan bellek kesiminin boyutu. Öntanımlı olarak bazı sistemler (çoğu BSD türevi dahil) paylaşılan bellek kesimi için çok düşük sınırlara sahiptir.
Eniyileme seviyesi. Sıfır eniyilemeyi iptal eder, daha yüksek değerler daha etkili eniyileme sağlar. Hız artışlarının pek fazla olmamasını bekleyin, deneyseldir.
HTTP sunucundan dahil edilecek veya istenecek bağımsız kaynak dosyalarının sayısı ile ilgili bir "ipucu". Emin değilseniz sıfıra ayarlayın veya ihmal edin; Bu ayar binlerce kaynak dosyası olan sitelerde yararlıdır.
Depolanacak kullanıcı önbellek değişkenlerinin sayısı ile ilgili bir "ipucu" olup apc.num_files_hint'e benzer. Emin değilseniz sıfıra ayarlayın veya ihmal edin.
Bir önbellek girdisinin bellek yuvasında kullanılmadan kalma süresidir, saniye olarak verilir. Sıfır olarak bırakmak eski girdilerin sürekli olarak bellekte kalmasına ve yeni girdi alınmamasına neden olacaktır.
Bir önbellek girdisinin bellek yuvasında kullanılmadan kalma süresidir, saniye olarak verilir. Sıfır olarak bırakmak eski girdilerin sürekli olarak bellekte kalmasına ve yeni girdi alınmamasına neden olacaktır. Önbellekte yer kalmaması durumunda ttl sıfır ise önbellek tamamen silinir; ttl sıfırdan büyük ise sadece süresi dolmuş girdiler silinmeye çalışılır.
Bir önbellek girdisinin bellek yuvasında kullanılmadan kalma süresidir, saniye olarak verilir. Sıfır olarak bırakmak eski girdilerin sürekli olarak bellekte kalmasına ve yeni girdi alınmamasına neden olacaktır. Önbellekte yer kalmaması durumunda ttl sıfır ise önbellek tamamen silinir; ttl sıfırdan büyük ise sadece süresi dolmuş girdiler silinmeye çalışılır.
Öntanımlı olarak etkindir ("On"), fakat sadece olumlu süzgece uyan dosyaların önbelleğe alınması için etkisiz ("Off") hale getirilerek, apc.filters ile birlikte kullanılabilir.
Genişletilmiş POSIX düzenli ifadelerine uyan virgülle ayrılmış dizge değerlerin listesidir. Eğer kaynak dosya adı, listedeki herhangi bir kalıba uyarsa bu dosya önbelleğe alınmaz. Eşleştirme için include / require işlevlerine aktarılmış olan dosya adı kullanılır, mutlak yol kullanılmaz. Eğer deyimin ilk karakteri + ise, süzgeç ile eşleşen dosyalar önbelleğe alınır, - ise alınmaz. - öntanımlıdır, bu yüzden yazılmayabilir.
Eğer --enable-mmap kullanılarak MMAP desteği ile derlendiyse, mmap hafıza bölgesinin dosya mı yoksa paylaşımlı bellek desteği ile mi hazırlandığını belirlemek için mmap modülüne aktarılacak mktemp tarzı dosya maskesidir. Doğrudan dosya destekli mmap için /tmp/apc.XXXXXX'a benzer şekilde ayarlayın (tam olarak 6 adet X). POSIX tarzı shm_open/mmap kullanmak için dosya kalıbına .shm koyun. Örnek olarak /apc.shm.XXXXXX. Ayrıca /dev/zero şeklinde ayarlanarak, anonim mmap bellek için çekirdeğin /dev/zero arabirimi kullanılabilir. Tanımsız olarak bırakmak anonim mmap'e zorlayacaktır.
Çok yoğun sunucularda, sunucuyu başlattığınızda veya dosyaları değiştirdiğinizde, aynı zamanda, aynı dosyayı önbelleğe almaya çalışan birçok sürecin birbiriyle yarışmasına neden olabilirsiniz. Bu ayar önbelleğe alınmamış bir dosya üzerinde süreçlerin es geçme yüzdesini ayarlar. Diğer bir deyişle tek bir sürecin bir dosyayı önbelleğe almama olasılığı olarak düşünebilirsiniz. Örnek olarak, apc.slam_defense'i 75'e ayarlamak %75 olasılıkla sürecin önbellekleme yapmayacağını gösterir. Bu yüzden yüksek değerler daha iyi savunma sağlar. Bu özelliği iptal etmek için 0 olarak ayarlayın.
Sonraki sürümlerde apc.write_lock ile değiştirilmiştir.
Etkin kullanılan bir HTML sunucusunda bir dosyayı değiştirdiğiniz zaman bunu çok kısa atomik bir zaman diliminde yapmalısınız, geçici bir dosyaya yazma işlemi yapılır ve hazır olduğunda özgün dosya adıyla yeniden isimlendirilir (mv). Çoğu metin düzenleyici, cp, tar ve diğer bu türden programlar bu şekilde çalışmaz. Metin düzenleyicileri dosyayı düzenlerken, APC, dosyanın hazır olmayan halinin, önbelleğe alınmasına yol açabilir. apc.file_update_protection ayarı yeni dosyaların önbelleklemesi üzerinde bir geciktirme sağlar. Varsayılan değeri 2 saniyedir. Bu dosyalara erişildiğinde, değişiklik zaman damgası (mtime) 2 saniyeden küçükse önbelleğe alınmayacakları anlamına gelir. Bu tür yarım yazılmış dosyalara erişen ziyaretçiler uygulamalarda tuhaf durumlar ile karşılaşabilir, en azından bu tuhaflıklar kalıcı değildir. Eğer dosyalarınızın güncellemesini atomik zamanlama ile yaptığınızdan eminseniz, rsync bunu doğru bir şekilde yapar, bu koruma mekanizmasını 0'a ayarlayarak kapatabilirsiniz. Eğer yüksek girdi-çıktı nedeniyle 2 saniyeden daha uzun süren güncelleme süreçlerine sahipseniz bunu bir miktar arttırmak isteyebilirsiniz.
Çoğunlukla deneme ve hata arama için kullanılır. Bunu ayarlamak PHP'nin CLI sürümü için APC'nin yetkilendirilmesini sağlar. Normalde her CLI isteği için APC önbelleğinin yeniden oluşturulmasını istemezsiniz, fakat çeşitli deneme senaryoları için APC'nin kolay bir şekilde yetkilendirilmesi yararlı olabilir.
Bu değerden daha büyük dosyaların önbelleğe alınmasını engeller, varsayılan değeri 1M'dır.
Bu ayarı değiştirirseniz dikkatli olun, ayarın varsayılan durumunda APC her istekte betik dosyasının değiştirilme durumu denetlenecektir. Eğer betik değiştirildi ise yeni betiği işleyecek ve önbelleğe alacaktır. Eğer bu ayarı etkisiz duruma getirirseniz APC betiği değiştirilme durumu için denetlemeyecektir. Bu da betik üzerindeki değişikliklerin etkin olması için HTML sunucunuzu yeniden başlatmanızı gerektirir. Ürün ortamında kullanılan bir sunucuda nadiren kod değiştirmeleri yapılır, bu yüzden etkisiz duruma getirilmesi önemli başarım artışlarına neden olabilir.
Betiğe dışardan dahil edilen (include/require) dosyalar için de bu seçenek geçerlidir, fakat eğer göreli dosya yolları (Unix üzerinde / ile başlamayan herhangi bir yol) kullanarak dahil ediyorsanız APC dosyayı benzersiz olarak diğerlerinden ayırabilmek için denetlemek zorundadır. Eğer mutlak yol kullanıyorsanız APC bu denetimi atlayacak ve dosya için benzersiz tanımlayıcı olarak mutlak yolu kullanacaktır.
Yoğun sunucularda, sunucu başlatıldığında veya birçok dosya değiştirildiğinde, bütün süreçlerinizin aynı dosyaları derleyip önbelleğe almaya çalışması gibi bir durumla karşılabilirsiniz, write_lock etkin durumda iken önbelleğe alınmamış bir betiği sadece bir süreç işleyecektir diğer süreçler kilitli durumun açılmasını beklemek yerine önbelleğe alınmamış bir betiği çalıştıracaklardır.
Erken/Geç bağlama konuları nedeni ile özdevinimli olarak hariç bırakılan betiklerin raporlanmasını sağlar.
include_once() ve require_once() çağrılarında eniyileştirme sağlar ve pahalı sistem çağrılarının kullanımından sakınır.
RFC1867 dosya yükleme aşamalarını kancalama yalnızca APC'yi PHP 5.2.0 veya sonraki sürümlerde derlediyseniz geçerlidir. Etkin duruma getirildiğinde, bir yükleme formunda dosya alanından önce APC_UPLOAD_PROGRESS alanına rastlandığında özdevinimli olarak upload_anahtar içeren bir kullanıcı önbelleği oluşturulur. Burada anahtar, form girdisindeki APC_UPLOAD_PROGRESS elemanının değeridir.
Şuna dikkat edin: APC_UPLOAD_PROGRESS ile belirtilen gizli alan dosya alanından önce gelmelidir, yoksa karşıya yükleme işlemi gerektiği gibi yürümez.
Karşıya dosya yükleme izlemesi, evre korumalı değildir, bu yüzden yeni yapılan yüklemeler bir önceki devam eden izlemeyi devre dışı bırakır.
Örnek 1 - Bir apc.rfc1867 örneği
<?php
print_r(apc_fetch("upload_$_POST[APC_UPLOAD_PROGRESS]"));
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[total] => 1142543
[current] => 1142543
[rate] => 1828068.8
[filename] => test
[name] => file
[temp_filename] => /tmp/php8F
[cancel_upload] => 0
[done] => 1
)
rfc1867 karşıya dosya yükleme işlevselliğince üretilen kullanıcı önbellek girdisi için kullanılacak anahtar öneki.
APC karşıya dosya yükleme aşamalarını etkin hale getiren gizli form girdi adını ve kullanıcı önbellek sonekini bildirir.
Karşıya yükleme işlemleri için kullanıcı önbelleğinin güncellenme sıklığını belirler. Toplam dosya boyutunun belirli bir yüzdesi ya da bayt olarak boyut verilir. Boyuta seçime bağlı olarak kilobayt için 'k', megabayt için 'm', gigabayt için 'g' son ekleri ile belirtilir (büyük veya küçük harf farketmez). Sıfır olarak ayarlamak, mümkün olduğu kadar sık güncellenmesine neden olur fakat bu yükleme işlemlerininin yavaşlamasına neden olabilir.
Yerel işlemler için gölge önbelleği etkin hale getirir, bu kilitsiz işlemler yaparak kilitlerden kaynaklanan çakışmaları azaltır.
Yerel işlemlerin gölge önbellek boyutu, yeteri kadar büyük bir değere ayarlanmalıdır. Yaklaşık olarak apc.num_files_hint değerinin yarısı kadar.
APC'nin idaresi için, sinyal verildiği zaman çekirdek döküm dosyaları yazan SIGSEGV gibi sinyallerin işlenmesini etkin kılar. Bu sinyaller alındığı zaman, APC paylaşılan belleği kaldırarak çekirdek döküm dosyasından yeniden oluşturmayı deneyecektir. Bu ayar ölümcül sinyaller alındığı zaman büyük bir paylaşılan bellek alanı olan sistemlerde istikrarı iyi yönde etkileyebilir.
Bu özelliğin tehlikeli olma olasılığı yüksektir. Ölümcül bir hata meydana geldiğinde, paylaşılan belleği kaldırmak, belirsiz davranışlara neden olabilir.
Bilginize: Bazı sistem çekirdekleri, çekirdek döküm dosyaları oluşturulurken, çeşitli paylaşılan bellek bölümlerinin dökümünü görmezden gelecek araçlar sağlasa da, bu uygulamalar önemli paylaşılan bellek bölümlerini de görmezden gelebilir, Apache puan tahtası gibi.
Düğümlerin değişmediğininden emin olmak için ctime kullanmak svn veya rsync gibi programların neden olduğu sorunları engelleyebilir. APC normalde sadece mtime ile denetim yapar.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Bu eklentinin tanımlanmış sabitleri yoktur.
(PECL apc >= 3.0.13)
apc_add — Bir değişkeni önbellek veri deposunda saklar
Eğer daha önceden saklanmadı ise, bir değişkeni önbellek veri deposunda saklar.
Bilginize: apc_add() işlevi ile saklanan değişkenler, PHP'nin diğer saklama yöntemlerine aykırı olarak, HTTP sunucu istekleri arasında kalıcı olarak saklanacaktır (değişken önbellekten kaldırılana kadar).
Değişken depoda bu anahtar ismi kullanılarak saklanacaktır. anahtar 'lar önbellek içinde benzersizdir, yani apc_add() işlevi kullanarak aynı isimde varolan bir değişkeni saklamaya çalışmak, eski değeri değiştirmeyecek bunun yerine işlevin FALSE dönmesine neden olacaktır. (apc_add() ile apc_store() arasındaki tek fark budur).
Saklanacak değişken
Yaşam Süresi; değişken , yaşam_süresi saniye süresince depoda saklanacaktır. yaşam_süresi geçildikten sonraki istekte önbellekten çıkartılacaktır. Eğer yaşam_süresi verilmediyse veya 0 olarak ayarlandıysa, değer el yordamıyla silinmediği veya önbellek boşaltılma, yeniden başlatma, vs. gibi süreçler ile temizlenmediği sürece saklanacaktır.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apc_add() örneği
<?php
$bilgi = 'bilgi';
apc_add('sakla', $bilgi);
var_dump(apc_fetch('sakla'));
echo "\n";
$bilgi = 'önbelleğe alınmayacak';
apc_add('sakla', $bilgi);
var_dump(apc_fetch('sakla'));
echo "\n";
?>
Yukarıdaki örneğin çıktısı:
string(5) "bilgi" string(5) "bilgi"
(PECL apc >= 2.0.0)
apc_cache_info — APC'nin veri deposundan önbellek bilgisini gösterir
APC'nin veri deposundan önbellek ve tanımlayıcı (meta-data) bilgileri gösterir.
Önbelleğe alınmış veri ve tanımlayıcı veriler dizisi; hata durumunda FALSE
Bilginize: apc_cache_info() eğer önbellek verisini elde edemez ise uyarı verecektir. Genelde APC etkin değilken bu durumla karşılaşırsınız.
Eğer önbellek_türü "user", ise, kullanıcı önbellek bilgisi geri dönecektir.
Eğer önbellek_türü "filehits", ise, güncel istek için hangi dosyalar önbelleğe alınmış bilgisi dönecektir. Bu özelliğin etkin olabilmesi için derleme sırasında --enable-filehits kullanmak gerekir.
Eğer önbellek_türü geçersiz ise veya belirtilmediyse, sistem önbellek bilgisi (önbelleğe alınmış dosyalar) geri dönecektir.
Eğer limited TRUE ise, önbellek girdilerinin bir bölümünü listelemeyecektir. Bu istatistik elde etmek için yapılan çağrıların eniyileştirilmesinde yararlıdır.
| Sürüm: | Açıklama |
|---|---|
| 3.0.11 | sınırlı değiştirgesi eklenmiştir. |
| 3.0.16 | önbellek_türü değiştirgesi için "filehits" seçeneği eklenmiştir. |
Örnek 1 Bir apc_cache_info() örneği
<?php
print_r(apc_cache_info());
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[num_slots] => 2000
[ttl] => 0
[num_hits] => 9
[num_misses] => 3
[start_time] => 1123958803
[cache_list] => Array
(
[0] => Array
(
[filename] => /path/to/apc_test.php
[device] => 29954
[inode] => 1130511
[type] => file
[num_hits] => 1
[mtime] => 1123960686
[creation_time] => 1123960696
[deletion_time] => 0
[access_time] => 1123962864
[ref_count] => 1
[mem_size] => 677
)
[1] => Array (...her önbellek dosyası için yinelenir)
)
(PECL apc >= 2.0.0)
apc_clear_cache — APC önbelleğini temizler
Kullanıcı veya sistem önbelleğini temizler.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Eğer önbellek_türü "user" ise, kullanıcı önbelleği temizlenecektir, aksi durumda sistem önbelleği (önbelleğe alınmış dosyalar) temizlenecektir.
(PECL apc >= 3.0.13)
apc_compile_file — Bir dosyayı, süzgeçlere aldırmadan, arakod (bytecode) önbelleğinde depolar.
Bir dosyayı, süzgeçlere aldırmadan, arakod önbelleğinde depolar.
Derlenip arakod önbelleğinde depolanacak bir PHP dosyasının mutlak veya göreli yol bilgisi.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL apc >= 3.0.0)
apc_define_constants — Yeniden çağırmak ve yığın tanımlama için bir grup sabit tanımlar
define() işlevi herkesin bildiği gibi yavaştır. APC'nin esas faydası betik ve uygulamaların başarımını arttırmak olduğu için böyle bir mekanizma ile yığın sabit tanımlama imkanı sağlanmak istenmiştir. Bununla birlikte bu işlev beklenen başarımı sağlamamaktadır.
Daha iyi başarım sağlayan bir çözüm için, PECL'de bulunan » hidef eklentisini deneyin.
Bilginize: Bütün önbelleği temizlemeden bir grup sabiti depodan silmek için boş bir dizi, sabitler değiştirgesi olarak geçirilebilir.
anahtar depolanan sabitleri isimlendirmekte kullanılır. apc_load_constants() işlevine değiştirge olarak geçirilerek tanımlanan sabitlere ulaşılabilir.
sabit_adi => deger çiftlerinden oluşan bir ilişkisel dizi. sabit_adi normal sabit isimlendirme kurallarına uymalıdır. deger sayıl (scalar) bir değer olmalıdır.
İşlevin öntanımlı davranışı harf büyüklüğüne duyarlıdır, yani SABIT ile Sabit farklı değerlerdir. Eğer bu değiştirge FALSE olarak ayarlanırsa sabitler harf büyüklüğüne duyarsız sembollerle tanımlanacaktır.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apc_define_constants() örneği
<?php
$sabitler = array(
'BIR' => 1,
'IKI' => 2,
'UC' => 3,
);
apc_define_constants('sayilar', $sabitler);
echo BIR, IKI, UC;
?>
Yukarıdaki örneğin çıktısı:
123
(PECL apc >= 3.0.0)
apc_delete — Depolanmış bir değişkeni önbellekten siler
Depolanmış bir değişkeni önbellekten siler.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apc_delete() örneği
<?php
$bar = 'BAR';
apc_store('foo', $bar);
apc_delete('foo');
// saklayip, hemen arkasindan silmek, elbette bir ise yaramaz.
?>
(PECL apc >= 3.0.0)
apc_fetch — Depolanmış bir değişkeni önbellekten alır
Depolanmış bir değişkeni önbellekten alır.
apc_store() işlevi ile değeri depolamak için kullanılan anahtar.
Başarı durumunda TRUE, aksi durumda FALSE değerini alır.
Başarı durumda depolanmış değişken, aksi durumda FALSE
Örnek 1 - apc_fetch() örneği
<?php
$bar = 'BAR';
apc_store('foo', $bar);
var_dump(apc_fetch('foo'));
?>
Yukarıdaki örneğin çıktısı:
string(3) "BAR"
(PECL apc >= 3.0.0)
apc_load_constants — Önbellekten bir sabit kümesini yükler
Önbellekten bir dizi sabiti yükler.
Sabitleri yığın halinde apc_define_constants() ile önbelleğe saklarken verilmiş isim.
İşlevin öntanımlı davranışı harf büyüklüğüne duyarlıdır, yani SABIT ile Sabit farklı değerlerdir. Eğer bu değiştirge FALSE olarak ayarlanırsa sabitler harf büyüklüğüne duyarsız sembollerle tanımlanacaktır.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apc_load_constants() örneği
<?php
$sabitler = array(
'BIR' => 1,
'IKI' => 2,
'UC' => 3,
);
apc_define_constants('sayilar', $sabitler);
apc_load_constants('sayilar');
echo BIR, IKI, UC;
?>
Yukarıdaki örneğin çıktısı:
123
(PECL apc >= 2.0.0)
apc_sma_info — APC paylaşımlı bellek tahsis durumu bilgisini verir
APC paylaşımlı bellek tahsis durumu bilgisini verir.
Bu değiştirge FALSE olarak ayarlandığı zaman apc_sma_info() işlevi her bir bölüm için daha ayrıntılı bilgi verecektir. FALSE öntanımlı değerdir.
Başarı durumunda paylaşımlı bellek tahsis verileri, hata durumunda FALSE.
Örnek 1 - apc_sma_info() örneği
<?php
print_r(apc_sma_info());
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[num_seg] => 1
[seg_size] => 31457280
[avail_mem] => 31448408
[block_lists] => Array
(
[0] => Array
(
[0] => Array
(
[size] => 31448408
[offset] => 8864
)
)
)
)
(PECL apc >= 3.0.0)
apc_store — Bir değişkeni veri deposunda saklar
Bir değişkeni veri deposunda saklar.
Bilginize: apc_store() işlevi ile saklanan değişkenler, PHP'nin diğer saklama yöntemlerinin aksine, istekler arasında kalıcı olacaktır (değer önbellekten kaldırılana kadar).
Değişken depoda bu isimle saklanacaktır. anahtar lar önbellekte benzersizdir, aynı isimde ikinci bir değer saklamaya çalışmak asıl değerin üzerine yazacaktır.
Saklanacak değişken.
Yaşam Süresi (ttl); degisken , yasam_suresi saniye süresince depoda saklanacaktır. yasam_suresi geçildikten sonraki istekte önbellekten çıkartılacaktır. Eğer yasam_suresi verilmediyse veya 0 olarak ayarlandıysa, değer el yordamıyla silinmediği veya önbellek boşaltılma, yeniden başlatma, vs. gibi süreçler ile temizlenmediği sürece saklanacaktır.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apc_store() örneği
<?php
$bilgi = 'bilgi';
apc_store('sakla', $bilgi);
var_dump(apc_fetch('sakla'));
?>
Yukarıdaki örneğin çıktısı:
string(5) "bilgi"
APD Gelişmiş PHP hata ayıklayıcısıdır (Advanced PHP Debugger). PHP kodları için profil oluşturma ve hata ayıklama imkanları sunmanın yanında tam bir yığın geri izlemesi çıkartabilme özelliği vardır. Etkileşimli hata ayıklamayı desteklemesine rağmen APD, öntanımlı olarak verileri izleme dosyalarına yazar. Ayrıca olay tabanlı günlük tutma özelliği sayesinde farklı betikler için farklı düzeylerdeki bilgiler (işlev çağrıları, değiştirge geçişleri, zamanlamalar vb. gibi) açılıp kapatılabilir.
APD bir Zend Eklentisidir, PHP'nin iç işleyişinin işlev çağrılarını ele alış şeklini değiştirir ve bu yüzden diğer Zend Eklentileri (örneğin Zend Optimizer - Zend Verimlileştiricisi) ile uyumlu olmayabilir.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
APD, bir PECL eklentisi olarak » http://pecl.php.net/package/apd adresinden edinilebilir.
Aşağıdaki komutu çalıştırırsanız, APD'nin en son kararlı sürümünü indirilir ve derlenip kurulur:
pear install apd
Bu komut, APD Zend modülünü PHP eklenti dizinine özdevinimli olarak kaydeder. Ancak eklentiyi orada tutmak şart değildir; zend_extension yönergesinde eklentinin yerini belirtmek suretiyle herhangi bir dizine yerleştirebilirsiniz.
Windows kullanıcılarının bu işlevleri kullanabilmesi için php.ini içinde php_apd.dll kütüphanesini etkin kılmaları gerekir. Bu PECL eklentisi için bir DLL mevcut değildir. Ayrıca, Windows üzerinde kurulum bölümüne de bakınız.
INI dosyanıza aşağıdaki satırları ekleyin:
zend_extension = /mutlak/dosya/yolu/apd.so apd.dumpdir = /mutlak/dosya/yolu/trace/directory apd.statement_tracing = 0
PHP kurulumunuza bağlı olarak zend_extension yönergesinde şunlardan biri belirtilebilir:
zend_extension (ZTS'siz, hata ayıklamasız derleme) zend_extension_ts (ZTS'li, hata ayıklamasız derleme) zend_extension_debug (ZTS'siz, hata ayıklamalı derleme) zend_extension_debug_ts (ZTS'li, hata ayıklamalı derleme)
APD'yi Windows altında derlemek için http://php.net/ adresinde açıklandığı gibi çalışan bir PHP derleme ortamına ihtiyacınız var. Temel olarak Microsoft Visual C++, win32build.zip, bison/flex ve biraz da bilgi gerekir. Ayrıca, adp.dsp'nin satır sonlandırmasının da DOS türünde olmasına dikkat edin, Unix türünde olduğu takdirde Microsoft Visual C++ bundan şikayet edecektir.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişiklik Yeri | Sürüm Bilgisi |
|---|---|---|---|
| apd.dumpdir | NULL | PHP_INI_ALL | |
| apd.statement_tracing | "0" | PHP_INI_ALL | 0.9'dan beri kullanılabilmektedir. |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
APD'nin profil döküm dosyalarını yazacağı dizini belirler. Dizini bir mutlak yol olarak belirtebileceğiniz gibi bir göreli yol olarak da belirtebilirsiniz.
apd_set_pprof_trace() işlevine değiştirge olarak farklı bir dizin belirtebilirsiniz.
Satır satır izleme yapılıp yapılmayacağı belirtilir. Bu yönergeye 'On' (1) değeri atarsanız uygulamanızın başarısı bundan etkilenecektir.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
| Sabit | Değer | Açıklama |
|---|---|---|
| FUNCTION_TRACE (integer) | 1 | |
| ARGS_TRACE (integer) | 2 | |
| ASSIGNMENT_TRACE (integer) | 4 | |
| STATEMENT_TRACE (integer) | 8 | |
| MEMORY_TRACE (integer) | 16 | |
| TIMING_TRACE (integer) | 32 | |
| SUMMARY_TRACE (integer) | 64 | |
| ERROR_TRACE (integer) | 128 | |
| PROF_TRACE (integer) | 256 | |
| APD_VERSION (string) | örnek: 1.0.2-dev |
İzlemeyi başlatmak için PHP betiğinizin ilk satırında apd_set_pprof_trace() işlevini çağırın.
apd_set_pprof_trace();
İşlevi betiğinizdeki herhangi bir satıra da ekleyebilirsiniz, fakat eğer izlemeye betiğinizin başından başlamazsanız diğer şekilde sizi bir başarım dar boğazına sürükleyebilecek olan profil bilgisini atmış olacaksınız.
Şimdi betiği çalıştırın. Döküm çıktısı apd.dumpdir/pprof_pid.ext dosyasına yazılacaktır.
Eğer PHP'nin CGI sürümünde çalışıyorsanız, apd'nin doğru
şekilde çalışması için '-e' seçeneğini kullanarak
genişletilmiş bilgiyi etkinleştirmeniz gerekecek. Örneğin:
php -e -f script.php
Biçimlendirilmiş profil bilgisini göstermek için, pprofp komutunu istediğiniz sıralama ve gösterme seçenekleri ile çalıştırın. Biçimlendirilmiş çıktı aşağıdaki gibi görünecektir:
bash-2.05b$ pprofp -R /tmp/pprof.22141.0 Trace for /home/dan/testapd.php Total Elapsed Time = 0.00 Total System Time = 0.00 Total User Time = 0.00 Real User System secs/ cumm %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name -------------------------------------------------------------------------------------- 100.0 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0009 0 main 56.9 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0005 0.0005 0 apd_set_pprof_trace 28.0 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 preg_replace 14.3 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 str_replace
Bu örnekte kullanılan -R seçeneği profil tablosunu betiğin verili işlevi yürütürken kullandığı gerçek zaman miktarına göre sıralar. "cumm call" sütunu her işlevin ortalama kaç kez çağrıldığını, "s/call" sütunu da her işlev çağrısı için ortalama kaç saniye gerektiğini gösterir
KCacheGrind profil çözümleme uygulamasına aktarabileceğiniz bir çağrı-ağacı dosyası oluşturmak için, pprof2calltree komutunu verin.
Açıklama, hata düzeltmesi, genişletme, veya geliştirmeye yardım istekleriniz için » apd@mail.communityconnect.com adresine bir eposta gönderiniz. Her türlü yardımı memnuniyetle kabul ederiz.
(PECL apd >= 0.2)
apd_breakpoint — Yorumlayıcıyı durdurur ve soketten bir satırbaşı bekler
Bu işlev betiğinizin çalışmasını durdurur ve bağlı soketten yanıt bekler. Programa adım attırmak için sadece satırbaşı karakteri yollayın ya da çalıştırılacak bir php komutu girin.
XXX_TRACE sabitlerinin toplamından (VEYAlanmasından) oluşan bir tamsayı.
MEMORY_TRACE sabitini kullanmanız önerilmez; çok yavaş olup gerekli doğruluğa sahip görünmemektedir. ASSIGNMENT_TRACE sabiti ise henüz gerçeklenmemiştir.
Tüm işlevselliğe (TIMING, FUNCTIONS, ARGS SUMMARY (strace -c gibi)) sahip olmak için 99 değerini kullanınız.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - tcplisten kullanılan sıradan bir oturum
bash#tcplisten localhost 7777
APD - Advanced PHP Debugger Trace File
---------------------------------------------------------------------------
Process Pid (6118)
Trace Begun at Sun Mar 10 23:13:12 2002
---------------------------------------------------------------------------
( 0.000000): apd_set_session_trace called at /home/alan/Projects/project2/test.
php:5
( 0.074824): apd_set_session_trace_socket() at /home/alan/Projects/project2/tes
t.php:5 returned. Elapsed (0.074824)
( 0.074918): apd_breakpoint() /home/alan/Projects/project2/test.php:7
++ argv[0] $(??) = 9
apd_breakpoint() at /home/alan/Projects/project2/test.php:7 returned. Elapsed (
-2089521468.1073275368)
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:10
>apd_echo($i);
EXEC: apd_echo($i);
0
>apd_echo(serialize(apd_get_active_symbols()));
EXEC: apd_echo(serialize(apd_get_active_symbols()));
a:47:{i:0;s:4:"PWD";i:1;s:10:"COLORFGBG";i:2;s:11:"XAUTHORITY";i:3;s:14:"
COLORTERM_BCE";i:4;s:9:"WINDOWID";i:5;s:14:"ETERM_VERSION";i:6;s:16:"SE
SSION_MANAGER";i:7;s:4:"PS1";i:8;s:11:"GDMSESSION";i:9;s:5:"USER";i:10;s:5:"
MAIL";i:11;s:7:"OLDPWD";i:12;s:5:"LANG";i:13;s:10:"COLORTERM";i:14;s:8:"DISP
LAY";i:15;s:8:"LOGNAME";i:16;s:6:"
>apd_echo(system('ls /home/mydir'));
........
>apd_continue(0);
(PECL apd 0.2-0.4)
apd_callstack — Geçerli yordam dökümünü bir dizi olarak döndürür
Geçerli yordam dökümünü bir dizi olarak döndürür.
Geçerli yordam dökümünü içeren bir dizi.
Örnek 1 - apd_callstack() örneği
<?php
print_r(apd_callstack());
?>
(PECL apd 0.2-0.4)
apd_clunk — Bir uyarı ve yordam dökümü verip çıkar
Perl'ün Carp::clunk işlevine benzer davranır. Bir uyarı ve yordam dökümü verip çıkar.
Verilecek uyarı.
Ayraç. <BR /> öntanımlıdır.
Hiçbir değer dönmez.
Örnek 1 - apd_clunk() örneği
<?php
apd_clunk("Herhangi bir uyarı...", "<br/>");
?>
(PECL apd >= 0.2)
apd_continue — Yorumlayıcıyı yeniden başlatır
Yorumlayıcıyı tekrar başlatmak isteği genelde hata ayıklama soketi aracılığıyla gönderilir.
XXX_TRACE sabitlerinin toplamından (VEYAlanmasından) oluşan bir tamsayı.
MEMORY_TRACE sabitini kullanmanız önerilmez; çok yavaş olup gerekli doğruluğa sahip görünmemektedir. ASSIGNMENT_TRACE sabiti ise henüz gerçeklenmemiştir.
Tüm işlevselliğe (TIMING, FUNCTIONS, ARGS SUMMARY (strace -c gibi)) sahip olmak için 99 değerini kullanınız.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apd_continue() örneği
<?php
apd_continue(0);
?>
(PECL apd 0.2-0.4)
apd_croak — Bir hata ve yordam dökümü verip çıkar
Perl'ün Carp::croak işlevi gibi davranır. Bir hata ve yordam dökümü verip çıkar.
Verilecek hatanın iletisi.
Ayraç. <BR /> öntanımlıdır.
Hiçbir değer dönmez.
Örnek 1 - apd_croak() örneği
<?php
apd_croak("Bir hata iletisi...","<P>");
?>
(Unknown)
apd_dump_function_table — Geçerli işlev tablosunu çıktılar
Geçerli işlev tablosunu çıktılar.
Hiçbir değer dönmez.
Örnek 1 - apd_dump_function_table() örneği
<?php
apd_dump_function_table();
?>
(PECL apd 0.2-0.4)
apd_dump_persistent_resources — Tüm kalıcı özkaynakları bir dizi içinde döndürür
Tüm kalıcı özkaynakları dizi halinde döndürür.
Geçerli çağrı yığınını içeren bir dizi.
Örnek 1 - apd_dump_persistent_resources() örneği
<?php
print_r(apd_dump_persistent_resources());
?>
(PECL apd 0.2-0.4)
apd_dump_regular_resources — Geçerli normal özkaynakların tümünü bir dizi olarak döndürür
Geçerli normal özkaynakların tümünü bir dizi olarak döndürür.
Geçerli normal özkaynakları içeren bir dizi.
Örnek 1 - apd_dump_regular_resources() örneği
<?php
print_r(apd_dump_regular_resources());
?>
(PECL apd >= 0.2)
apd_echo — Çıktıyı hata ayıklama soketine gönderir
Çalışan betik hakkında bilgi isteğini hata ayıklama soketi üzerinden gönderilir.
Hata ayıklama sürecindeki değişken.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apd_echo() örneği
<?php
apd_echo($i);
?>
(PECL apd 0.2)
apd_get_active_symbols — Yerel etki alanında geçerli değişken isimlerinden oluşan bir dizi döndürür
Etkin etki alanında tanımlı tüm değişkenlerin isimlerini döndürür (değerlerini değil!).
Tüm değişkenleri içeren çok boyutlu bir dizi.
Örnek 1 - apd_get_active_symbols() örneği
<?php
apd_echo(apd_get_active_symbols());
?>
(PECL apd >= 0.2)
apd_set_pprof_trace — Hata ayıklama oturumunu başlatır
Döküm dizininde pprof_{süreç_kimliği} dosyasına hata ayıklamayı başlatır.
Profil döküm dosyasının kaydedileceği dizin. Belirtilmez ise, php.ini dosyasındaki apd.dumpdir ayarı kullanılır.
Dosya ismi için önek; "pprof" öntanımlıdır.
Hedef dosyanın dosya yolunu döndürür.
Örnek 1 - apd_set_pprof_trace() örneği
<?php
apd_set_pprof_trace();
?>
(PECL apd >= 0.2)
apd_set_session_trace_socket — Uzaktan oturumla hata ayıklamayı başlatır
Belirtilen tcp_sunucusu 'na (örneğin, tcplisten) bağlanır ve hata ayıklama verilerini o bağlantı noktasına gönderir.
TCP sunucunun IP'si ya da Unix Alanı bağlantı noktası (bir dosya olarak).
Dosya tabanlı bağlantı noktaları için AF_UNIX ya da standart tcp/ip için APD_AF_INET olabilir.
Herhangi bir portu kullanabilirsiniz, fakat 1024'ten büyük sayıları kullanmanız küçük sayıların diğer sistem tarafından kullanılıyor olma olasılığı nedeniyle daha iyidir.
XXX_TRACE sabitlerinin toplamından (VEYAlanmasından) oluşan bir tamsayı.
MEMORY_TRACE sabitini kullanmanız önerilmez; çok yavaş olup gerekli doğruluğa sahip görünmemektedir. ASSIGNMENT_TRACE sabiti ise henüz gerçeklenmemiştir.
Tüm işlevselliğe (TIMING, FUNCTIONS, ARGS SUMMARY (strace -c gibi)) sahip olmak için 99 değerini kullanınız.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - apd_set_session_trace_socket() örneği
<?php
apd_set_session_trace_socket ("127.0.0.1", APD_AF_INET, 7112, 0);
?>
(PECL apd 0.2-0.4)
apd_set_session_trace — Hata ayıklama oturumunu başlatır
Döküm dizininde pprof_{süreç_kimliği} dosyasına hata ayıklamayı başlatır.
XXX_TRACE sabitlerinin toplamından (VEYAlanmasından) oluşan bir tamsayı.
MEMORY_TRACE sabitini kullanmanız önerilmez; çok yavaş olup gerekli doğruluğa sahip görünmemektedir. ASSIGNMENT_TRACE sabiti ise henüz gerçeklenmemiştir.
Tüm işlevselliğe (TIMING, FUNCTIONS, ARGS SUMMARY (strace -c gibi)) sahip olmak için 99 değerini kullanınız.
Profil döküm dosyasının kaydedileceği dizin. Belirtilmez ise, php.ini dosyasındaki apd.dumpdir ayarı kullanılır.
Hiçbir değer dönmez.
Örnek 1 - apd_set_session_trace() örneği
<?php
apd_set_session_trace(99);
?>
(PECL apd 0.2-0.4)
apd_set_session — Geçerli hata ayıklama seviyesini belirtir ya da değiştirir
Bu işlev uygulamanızın belli bir yerinde hata ayıklama seviyesini arttırmak ya da azaltmak için kullanılır.
XXX_TRACE sabitlerinin toplamından (VEYAlanmasından) oluşan bir tamsayı.
MEMORY_TRACE sabitini kullanmanız önerilmez; çok yavaş olup gerekli doğruluğa sahip görünmemektedir. ASSIGNMENT_TRACE sabiti ise henüz gerçeklenmemiştir.
Tüm işlevselliğe (TIMING, FUNCTIONS, ARGS SUMMARY (strace -c gibi)) sahip olmak için 99 değerini kullanınız.
Hiçbir değer dönmez.
Örnek 1 - apd_set_session() örneği
<?php
apd_set_session(9);
?>
(PECL apd >= 0.2)
override_function — Yerleşik işlevleri geçersiz kılar
Simge tablosunda değişiklik yaparak yerleşik işlevleri geçersiz kılar.
Geçersiz kılınacak işlev.
Virgülle ayrılmış dizgeler halinde işlev değiştirgeleri.
Genellikle bu değiştirgeleri ve işlev_kodu değiştirgelerini tek tırnakla sınırlanmış dizge olarak geçirmek isteyeceksiniz. Tek tırnaklı dizge kullanımının sebebi değişken isimlerinin işlenmesini engellemektir, aksi durumda, çift tırnak kullanırsanız değişken isimlerinde önceleme karakteri kullanmanız gerekir (\$değişken gibi).
İşlevin yeni kodu.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - override_function() örneği
<?php
override_function('test', '$a,$b', 'echo "DNM 123"; return $a * $b;');
?>
(PECL apd >= 0.2)
rename_function — Küresel işlev tablosunda bir işlevin ismini değiştirir
Küresel işlev tablosunda bir işlevin ismini değiştirir. Yerleşik işlevleri geçici olarak geçersiz kılmak için kullanışlıdır.
Asıl işlev ismi.
İşlevin özgün isminin yerini alacak isim.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - rename_function() örneği
<?php
rename_function('mysql_connect', ';debug_mysql_connect' );
?>
Bu eklenti DENEYSELDİR. Bu eklentinin davranışı, işlev isimleri ve tüm belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu eklentiyi kullanmayın.
Bcompiler eklentisi birkaç amacı, görevi gerçekleştirmek için yazılmıştır:
Bunların ilki bcompiler_write_header(), bcompiler_write_file() ve bcompiler_write_footer() işlevleri kullanılarak gerçekleştirilir. Derlenen dosyalar sıkıştırılmamış veya salt metin olarak yazılabilir. Derlenmiş dosyayı kullanabilmek için basit bir şekilde include veya require deyimleri kullanılabilir.
İkinci tip görevler bcompiler_write_header(), bcompiler_write_class(), bcompiler_write_footer(), bcompiler_read(), ve bcompiler_load() işlevleri kullanılarak gerçekleştirilebilir. Derlenmiş dosyalar sıkıştırılmamış veya salt metin olarak yazılabilir. bcompiler_load() işlevi sıkıştırılmış bir derlenmiş dosyayı okuyabilir, bu sıkıştırılmış dosyalar özgün dosyanın 1/3 boyutunda olabilirler.
EXE türünde dosyalar oluşturmak için, bcompiler değiştirilmiş bir sapi dosyası veya paylaşımlı kütüphane şeklinde derlenmiş bir PHP sürümü ile birlikte kullanılmalıdır. Bu durumda, bcompiler sıkıştırılmış kodları exe dosyasının sonundan okur.
Bcompiler sıkıştırılmamış kodlarla kullanıldığı zaman yaklaşık %30 daha verimli çalışabilir. Sıkıştırılmamış kodların özgün kaynak kodundan 5 kez daha büyük olduğunu unutmayın. Kodları sıkıştırılmış şekilde kullanmak size alan kazandırır fakat sıkıştırılmış kodun açılması kaynağın çözümlenmesinden çok daha fazla zaman ister. Bcompiler herhangi bir kod en iyileştirmesi yapmaz, en iyileştirme gelecekte eklenebilir...
Kod koruması bakış açısından, kodun derlenmiş halinden yorumlu kaynak koda ulaşmanın imkansız olduğunu söyleyebiliriz. Bcompiler ile derlenmiş koddan tekrar oluşturulmuş ve değiştirilmiş bir sınıf etkin şekilde kullanılamaz. Bununla birlikte derlenmiş dosyadan veri elde etmek mümkündür, yani şifreleri veya özel olan herhangi bir şeyi derlenecek dosyalara koymayın.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Kısaca kurulum notları:
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Bu eklentinin tanımlanmış sabitleri yoktur.
Yorum, hata düzeltmeleri, öneri veya geliştirmeye yardım etmek için bana » alan_k@php.net adresinden eposta gönderebilirsiniz. Şimdiden teşekkürler.
(PECL bcompiler >= 0.4)
bcompiler_load_exe — bcompiler exe dosyasından sınıfları okur ve oluşturur
bcompiler exe dosyasından veriyi okur ve derlenmiş koddan sınıfları oluşturur.
Dizge olarak exe dosya yolu.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_load_exe() örneği
<?php
bcompiler_load_exe("/tmp/example.exe");
print_r(get_defined_classes());
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
(PECL bcompiler >= 0.4)
bcompiler_load — bz biçiminde sıkıştırılmış dosyadan, sınıfları okur ve oluşturur
bz biçiminde sıkıştırılmış dosyadan veriyi okur ve derlenmiş koddan sınıfları oluşturur.
Dizge olarak, bz sıkıştırılmış dosya yolu.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_load() örneği
<?php
bcompiler_load("/tmp/example");
print_r(get_defined_classes());
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
Bilginize: Derlenmiş kodları çözümlemek için lütfen include veya require deyimlerini kullanın, bu işlevler bcompiler_load işlevinden daha uygun ve taşınabilirdir.
Bu işlevin, derlenmiş dosyanın gövdesinde bulunan betiği çalıştırmadığına dikkat edin.
(PECL bcompiler >= 0.4)
bcompiler_parse_class — Derlenmiş koddan sınıfı okur ve kullanıcı tanımlı işleve geriçağırım yapar
Derlenmiş koddan sınıfı okur ve kullanıcı tanımlı işleve geriçağırım yapar.
Dizge olarak sınıf adı.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_parse_class() örneği
<?php
function readByteCodes($data) {
print_r($data);
}
bcompiler_parse_class("DB","readByteCodes");
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
Bilginize: Bu işlev, bcompiler'dan çıkartılmıştır. 0.5 ve sonraki bcompiler sürümlerinde geçerli değildir.
(PECL bcompiler >= 0.4)
bcompiler_read — Bir dosya tanıtıcısından sınıfları okur ve oluşturur
Açık bir dosya tanıtıcısından derlenmiş veri okur ve sınıflar oluşturur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_read() örneği
<?php
$fh = fopen("/tmp/example","r");
bcompiler_read($fh);
fclose($fh);
print_r(get_defined_classes());
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
Bilginize: Derlenmiş kodları çözümlemek için lütfen include veya require deyimlerini kullanının, bu işlevler bcompiler_load işlevinden daha uygun ve taşınabilirdir.
Bu işlevin, derlenmiş dosyanın gövdesinde bulunan betiği çalıştırmadığına dikkat edin.
(PECL bcompiler >= 0.4)
bcompiler_write_class — Tanımlanmış bir sınıfı dosyaya yazar
Tanımlanmış sınıfı derlenmiş koddan okur ve açık bir dosya tanıtıcısına yazar.
fopen() işlevinden elde edilmiş bir tanıtıcı.
Dizge olarak sınıf adı.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_write_class() örneği
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
// DB_common'u DB_mysql'den önce yazmalısınız, DB_mysql DB_common'u
// genişletir.
bcompiler_write_class($fh,"DB_common");
bcompiler_write_class($fh,"DB_mysql");
bcompiler_write_footer($fh);
fclose($fh);
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
Bilginize: Bu işlev bağımlılık denetlemesi yapmaz, yükleme sırasında undefined class hatası almamak için sınıfları doğru sırada yazdığınızdan emin olmalısınız.
(PECL bcompiler >= 0.5)
bcompiler_write_constant — Tanımlanmış sabiti dosyaya yazar
PHP kodunda tanımlanmış sabiti okur ve açık bir dosya tanıtıcısına yazar.
fopen() işlevinden elde edilmiş bir tanıtıcı.
Dizge olarak, tanımlanmış sabitin adı.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_write_constant() örneği
<?php
define("MODULE_MAX", 30);
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_constant($fh,"MODULE_MAX");
bcompiler_write_footer($fh);
fclose($fh);
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
(PECL bcompiler >= 0.6)
bcompiler_write_file — Bir php kaynak dosyasını derleyerek yazar
Bu işlev, verilmiş php kaynak dosyasını derler ve açık bir dosya tanıtıcısına yazar.
fopen() işlevinden dönen bir tanıtıcı.
Dizge olarak kaynak dosya yolu.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_write_file() örneği
<?php
$fh = fopen("example.phb", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "example.php");
bcompiler_write_footer($fh);
fclose($fh);
/* aşağıdaki iki deyim denk olmalıdır:
include "example.php";
ve
include "example.phb";
*/
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
(PECL bcompiler >= 0.5)
bcompiler_write_function — Tanımlı bir işlevi derlenmiş olarak yazar
İşlevi PHP kodundan okur ve açık dosya tanıtıcısına derlenmiş olarak yazar. Sıralama önemli değildir (aşağıdaki örnekte işlev b, işlev a'yı kullanıyor olsa bile düzgün çalışacaktır).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_write_function() örneği
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_function($fh,"my_function_a");
bcompiler_write_function($fh,"my_function_b");
bcompiler_write_footer($fh);
fclose($fh);
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
(PECL bcompiler >= 0.5)
bcompiler_write_functions_from_file — Bir dosya içinde tanımlanmış bütün işlevleri derleyerek yazar
Dosya içindeki bütün tanımlı işlevleri arar ve derlenmiş karşılıklarını açık dosya tanıtıcısına yazar.
fopen() işlevinden dönen tanıtıcı.
Derlenecek dosya, bu dosyayı daima include veya require deyimleri ile eklemelisiniz.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_write_functions_from_file() örneği
<?php
require('module.php');
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_functions_from_file($fh,'module.php');
bcompiler_write_footer($fh);
fclose($fh);
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
(PECL bcompiler >= 0.3)
bcompiler_write_header — bcompiler dosya başlığını yazar
bcompiler dosyasındaki başlık kısmını yazar.
fopen() işlevinden dönen tanıtıcı.
Derlenmiş kodu bcompiler'ın eski sürümleri ile birlikte kullanabilmek için dosyayı yazarken önceki sürüm biçimi seçeneği kullanılabilir.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - bcompiler_write_header() örneği
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
bcompiler_write_footer($fh);
fclose($fh);
?>
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
(PECL bcompiler >= 0.5)
bcompiler_write_included_filename — Eklenmiş bir dosyayı derlenmiş olarak yazar
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
Bu işlevler hataların elde edilmesi ve günlük kayıtlarının tutulması ile ilgilidir. Bu işlevlerle kendi hata işleme kurallarınızı tanımlayabileceğiniz gibi hataların günlük dosyalarına nasıl kaydedileceğiyle ilgili değişiklikler de yapabilirsiniz. Böylece hata bildirimini ihtiyaçlarınıza uygun bir biçimde değiştirebilir veya genişletebilirsiniz.
Hata iletilerini günlük kayıt işlevleriyle doğrudan diğer makinelere, bir eposta adresine, sistem günlüklerine ve benzerlerine gönderebilirsiniz. Dolayısıyla, uygulamanızın veya sitenizin en önemli kısımlarını gözlem altında tutabilir ve bunlardan istediklerinizi günlük dosyalarına kaydedebilirsiniz.
Hata bildirim işlevleri, basit uyarılardan özel işlevlerin döndürdükleri hatalara kadar bir yelpazede geribildirim çeşidini ve seviyesini belirleyebilme olanağını verır.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu işlevleri kullanmak için hiçbir şey kurmaya gerek yoktur; PHP çekirdeğinin parçasıdırlar.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişiklik Yeri | Sürüm Bilgisi |
|---|---|---|---|
| error_reporting | NULL | PHP_INI_ALL | |
| display_errors | "1" | PHP_INI_ALL | |
| display_startup_errors | "0" | PHP_INI_ALL | |
| log_errors | "0" | PHP_INI_ALL | |
| log_errors_max_len | "1024" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| ignore_repeated_errors | "0" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| ignore_repeated_source | "0" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| report_memleaks | "1" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| track_errors | "0" | PHP_INI_ALL | |
| html_errors | "1" | PHP_INI_ALL | PHP <= 4.2.3'te PHP_INI_SYSTEM. |
| xmlrpc_errors | "0" | PHP_INI_SYSTEM | PHP 4.1.0'dan beri kullanılabilmektedir. |
| xmlrpc_error_number | "0" | PHP_INI_ALL | PHP 4.1.0'dan beri kullanılabilmektedir. |
| docref_root | "" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| docref_ext | "" | PHP_INI_ALL | since PHP 4.3.2'den beri kullanılabilmektedir. |
| error_prepend_string | NULL | PHP_INI_ALL | |
| error_append_string | NULL | PHP_INI_ALL | |
| error_log | NULL | PHP_INI_ALL |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Hata raporlama seviyesini tanımlar. Değiştirge olarak ya bir bit alanını ifade eden bir tamsayı ya da isimli sabitler verilebilir. Hata raporlama seviyeleri ve sabitleri Öntanımlı Sabitler sayfasında ve php.ini içinde açıklanmıştır. Hata raporlama seviyesini çalışma anında belirtmek için error_reporting() işlevini kullanabilirsiniz. Ayrıca, display_errors yönergesine de bakınız.
PHP 4 ve PHP 5'te öntanımlı değer E_ALL & ~E_NOTICE olup bu ayarla E_NOTICE seviyesindeki hatalar gösterilmez. Betiğinizi geliştirirken onları da görmek isteyebilirsiniz.
Bilginize: E_NOTICE seviyesindeki hataların geliştirme aşamasında gösterilmesinin bazı yararları vardır. Hata ayıklama amacıyla kullanıldığında E_NOTICE iletileri kodunuzdaki olası hatalar hakkında sizi uyarır. Örneğin atanmamış değerlerin kullanımı hakkında bir uyarı alırsınız. Özellikle yazım hatalarını bulmakta yardımcı olarak hata ayıklamakla zaman kaybetmekten sizi kurtarır. E_NOTICE iletileri kötü yazım tarzı için de sizi uyarır. Örneğin, PHP "item" indisini bir sabit olarak ele almayı deneyeceğinden $arr[item] yerine $arr['item'] yazmak daha iyidir. Belirttiğiniz indis bir sabit değilse PHP bunu dizinin bir anahtarı (dizgesel indisi) olarak kabul edecektir.
Bilginize: PHP 5'te E_STRICT yeni bir hata seviyesi olarak devreye girmiştir. E_ALL ile birlikte açıkça belirtilmedikçe E_STRICT seviyesinden hata raporları etkin olmayacaktır. E_STRICT seviyesinden hataların geliştirme aşamasında gösterilmesinin bazı yararları vardır. Bu iletiler, en son ve en çok önerilen kodlama yöntemini kullanmanız için size yardımcı olacaktır. Örneğin, kullanımı artık önerilmeyen işlevler hakkında uyarılacaksınız.
Bilginize: PHP dışında PHP sabitleri
httpd.conf gibi PHP dışı yerlerde PHP sabitlerini kullanmak isterseniz, bunların tamsayı değerlerini kullanmak zorunda kalmak anlamlarını anlamayı zorlaştırdığı için elverişli olmayacaktır. Zamanla başka hata seviyeleri ekleneceğinden azami değer de (E_ALL değeri) değişecektir. Bu bakımdan E_ALL yerine şimdiki ve gelecekteki tüm bit alanlarını kapsamak üzere 2147483647 gibi büyük bir değer kullanabilirsiniz (E_ALL'dan başka tüm hataları da içerir).
Hataların çıktının bir parçası olarak ekrana basılıp basılmayacağını veya bunların kullanıcıdan gizlenip gizlenmeyeceğini belirler.
"stderr" değeri hataları stdout (standart çıktı) yerine stderr'e (standart hataya) gönderir. Bu değer PHP'nin 5.2.4 sürümünden beri kullanılabilmektedir. Eski sürümlerde bu yönerge sadece boolean türünde değer kabul ederdi.
Bilginize: Bu özellik sizi geliştirme aşamasında desteklemek amacıyla konmuştur ve kullanıcıya yönelik işlemler için asla kullanılmamalıdır.
Bilginize: Bu yönergeye çalışma anında (ini_set() ile) değer atanabilse de, eğer betik ölümcül bir hataya sahipse bunun herhangi bir etkisi olmayacaktır. Bunun sebebi çalışma anında istenen eylemin yerine getirilmeyecek olmasıdır.
display_errors etkin olsa bile PHP ilk başlatılırken oluşan hatalar gösterilmez. Hata ayıklamıyorsanız display_startup_errors yönergesinin değerini off olarak bırakın.
Betiğin hata iletilerinin sunucunun hata günlüğüne veya error_log ile belirtilen dosyaya kaydedilip kaydedilmeyeceğini belirler. Bu seçenek sunucuya özgüdür.
Bilginize: Sitenizde hataları kullanıcıya göstermek yerine hata günlüklerine kaydetmenizi hararetle tavsiye ederiz.
Hata günlüğü iletilerinin azami uzunluğunu bayt cinsinden belirlemek için kullanılır. Kaynak hakkındaki error_log bilgisi buna eklenir. 1024 öntanımlı değer olup, 0 belirtildiği takdirde hata günlüğü iletilerininin uzunlukları sınırlanmaz. Bu uzunluk günlüğe kaydedilen ve gösterilen hata iletilerinden başka $php_errormsg iletilerine de uygulanır.
integer türünde bir değer kullanıldığında değer baytların sayısıdır. Büyük bayt değerleri için kullanılabilecek birimlerin gösterimleri hakkında bilgiyi bu SSS altında bulabilirsinizYinelenen hata iletileri günlüğe kaydedilmez. ignore_repeated_source yönergesinin değeri true olmadıkça yinelenen hataların aynı dosyanın aynı satırında oluşması gerekir.
Yinelenen iletiler yok sayılırken ileti kaynağının da yoksayılmasını sağlar. Bu yönergenin değeri On olduğu takdirde, farklı dosyalardan veya farklı satırlardan kaynaklanan yinelenmiş iletileri hata günlüklerine kaydedemezsiniz.
Bu yönergenin değeri Off olduğu takdirde, bellek sızıntıları (stdout'ta veya günlük dosyasında) gösterilmez. Bu sadece, hata ayıklama derlemesinde ve error_reporting yönergesinde E_WARNING listeye dahil edilmişse etkilidir.
Bu yönergenin değeri On olduğu takdirde, son hata iletisi daima $php_errormsg değişkenine atanır.
Hata iletilerine HTML etiketleri dahil edilmez. Yeni HTML hataları biçeminde, doğrudan kullanıcıyı hatayı veya hataya sebep olan işlemi açıklayan bir sayfaya yönlendiren tıklanabilir hatalar üretilir. Bu gönderimler docref_root ve docref_ext yönergelerinden etkilenir.
Normal hata raporlaması kapatılıp, hatalar XML-RPC hata iletileri olarak biçemlenir.
XML-RPC hata dizisinin faultCode elemanının değeri olarak bu değer kullanılır (bkz. xmlrpc_is_fault()).
Yeni hata biçemi, hatayı veya hataya sebep olan işlemi
açıklayan bir sayfaya bir gönderim içerir. Bu gönderimin bir kılavuz
sayfasına yönlendirmesi durumunda, kılavuzun dilinizdeki çevirisini
indirebilir ve bu yerel kopyanın bulunduğu yeri bu yönergede
belirtebilirsiniz. Örneğin, kılavuzun yerel kopyasına
"/manual/" ile erişilebiliyorsa bunu
docref_root=/manual/
şeklinde belirtebilirsiniz.
Buna ek olarak, kopyanızın dosya uzantısını
docref_ext yönergesinde belirtebilirsiniz (örnek:
docref_ext=.html
). Harici kaynaklara gönderimler
de mümkündür. Örnekler:
docref_root=http://manual/en/
veya
docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon
&url=http%3A%2F%2Fwww.php.net%2F"
Bazı durumlarda docref_root değerinin sonuna bir bölü çizgisi "/" eklemeniz gerekebilir. Fakat yukarıdaki ikinci örnekteki gibi bir durumda buna asla gerek yoktur.
Bilginize: Bu özellik, bir işlevin açıklamasına bakmayı kolaylaştırması nedeniyle daha ziyade geliştirme aşamasında kullanmanız için tasarlanmıştır. Hataları son kullanıcıya göstermek amacıyla kullanılmamalıdır.
docref_root yönergesine bakınız.
Bilginize: docref_ext değeri bir nokta "." ile başlamalıdır.
Bir hata iletisinden önce çıktılanacak dizge.
Bir hata iletisinden sonra çıktılanacak dizge.
Hataların kaydedileceği dosyanın adı. Dosya, HTTP sunucunun kullanıcısı tarafından yazılabilir olmalıdır. Eğer syslog özel değeri kullanılmışsa hatalar bir dosya yerine sistemin hata günlüğüne gönderilir (Unix'te syslog(3), Windows NT'de olay günlüğü). Windows 95'te sistem günlükçüsü desteği yoktur. Ayrıca, syslog() işlevine de bakınız. Yönerge tanımsız bırakılmışsa hatalar SAPI hata günlükçüsüne gönderilir. Örneğin bu, Apache'nin hata günlüğü veya CLI için stderr olabilir.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Aşağıdaki sabitler PHP çekirdeğinin parçası olarak daima kullanılabilir durumdadır.
Bilginize: Bu sabit isimlerini php.ini dosyasında kullanabilirsiniz, fakat httpd.conf gibi PHP dışı yerlerde isimlerini değil değerlerini bit maskesi olarak kullanabilirsiniz.
| Değer | Sabit | Açıklama | Ek Bilgi |
|---|---|---|---|
| 1 | E_ERROR (integer) | Ölümcül çalışma anı hataları. Bellek ayırma sorunu gibi giderilemeyen hatalar bu sınıfa girer. Böyle hatalar betiğin çalışmasının durmasına sebep olur. | |
| 2 | E_WARNING (integer) | Çalışma anı uyarıları (ölümcül olmayan hatalar). Betiğin çalışması durmaz. | |
| 4 | E_PARSE (integer) | Derleme anı çözümleme hataları. Çözümleme hatalarını sadece çözümleyici üretir. | |
| 8 | E_NOTICE (integer) | Çalışma anı bildirimleri. Betikte bir hataya sebep olabilecek fakat betiğin normal çalışmasını esnasında oluşmayabilecek bir şeylerin saptandığını belirtir. | |
| 16 | E_CORE_ERROR (integer) | PHP'nin başlatılması sırasında oluşan ölümcül hatalar. PHP çekirdeği tarafından üretilmesi dışında E_ERROR gibidir. | PHP 4'ten beri |
| 32 | E_CORE_WARNING (integer) | PHP'nin başlatılması sırasında oluşan uyarılar (ölümcül olmayan hatalar). PHP çekirdeği tarafından üretilmesi dışında E_WARNING gibidir. | PHP 4'ten beri |
| 64 | E_COMPILE_ERROR (integer) | Ölümcül derleme anı hataları. Zend betik motoru tarafından üretilmesi dışında E_ERROR gibidir. | PHP 4'ten beri |
| 128 | E_COMPILE_WARNING (integer) | Derleme anı uyarıları (ölümcül olmayan hatalar). Zend betik motoru tarafından üretilmesi dışında E_WARNING gibidir. | PHP 4'ten beri |
| 256 | E_USER_ERROR (integer) | Kullanıcı üretimi hata iletileri. PHP işlevi trigger_error() tarafından PHP kodunda üretilmesi dışında E_ERROR gibidir. | PHP 4'ten beri |
| 512 | E_USER_WARNING (integer) | Kullanıcı üretimi uyarı iletileri. PHP işlevi trigger_error() tarafından PHP kodunda üretilmesi dışında E_WARNING gibidir. | PHP 4'ten beri |
| 1024 | E_USER_NOTICE (integer) | Kullanıcı üretimi bildirim iletileri. PHP işlevi trigger_error() tarafından PHP kodunda üretilmesi dışında E_NOTICE gibidir. | PHP 4'ten beri |
| 2048 | E_STRICT (integer) | Yazdığınızı PHP kodunun ileriye dönük uyumluluğunu ve birlikte çalışabilirliğini en iyilemek amacıyla PHP tarafından yapılan önerileri etkin kılar. | PHP 5'ten beri |
| 4096 | E_RECOVERABLE_ERROR (integer) | Yakalanabilir ölümcül hata. Tehlikeli olma olasılığı bulunan bir hata oluştuğunu fakat yorumlayıcıyı kararsız durumda bırakmadığını belirtir. Hata, kullanıcı tarafından bir eylemci tanımlanarak yakalanmadığı (set_error_handler() işlevine bakınız) takdirde betik E_ERROR hatasıyla sonlanır. | PHP 5.2.0'dan beri |
| 8192 | E_DEPRECATED (integer) | Çalışma anı bildirimleri. Gelecek sürümlerle çalışmayacak kodlar hakkındaki uyarıları etkin kılar. | PHP 5.3.0'dan beri |
| 16384 | E_USER_DEPRECATED (integer) | Kullanıcı üretimi kullanımı önerilmiyor bildirimleri. PHP işlevi trigger_error() tarafından PHP kodunda üretilmesi dışında E_DEPRECATED gibidir. | PHP 5.3.0'dan beri |
| 30719 | E_ALL (integer) | Desteklenen (PHP 6'da E_STRICT dışında kalan) tüm hatalar ve uyarılar. | PHP 6'da 32767, PHP 5.3.x'te 30719, PHP 5.2.x'te 6143, öncekilerde 2047. |
Gerek sayısal gerekse simgesel olarak yukarıdaki değerler raporlanacak hataları belirten bir bit maskesi oluşturmakta kullanılabilir. Bu değerlerden bir bit maskesi oluşturmak veya bunları çözümlemek için bitsel işleçleri kullanabilirsiniz. php.ini içinde sadece '|', '~', '!', '^' ve '&' işleç karakterlerinin tanındığına dikkat ediniz.
Aşağıda, PHP hata işleme yeteneklerinin kullanımına ilişkin bir örneğe yer verilmiştir. Hataları işleme sokan işlevin iletilerinin (XML biçeminde) bir dosyaya yazılması; kodlama mantığıyla çelişen önemli hataların ise geliştiriciye eposta ile gönderilmesi sağlanmıştır.
Örnek 1 Bir betikte hataların yakalanıp işleme sokulması
<?php
// Kendi hata işleme sistemimizi oluşturacağız.
error_reporting(0);
// kullanıcı tanımlı hata eylemcisi
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
// Hata iletisi için zaman damgası
$dt = date("Y-m-d H:i:s (T)");
// Hata iletisi türlerini bir ilişkisel dizi olarak tanımlayalım.
// Aslında sadece E_WARNING, E_NOTICE, E_USER_ERROR,
// E_USER_WARNING ve E_USER_NOTICE kullanılacak.
$errortype = array (
E_ERROR => 'Hata',
E_WARNING => 'Uyarı',
E_PARSE => 'Çözümleme Hatası',
E_NOTICE => 'Bilginize',
E_CORE_ERROR => 'PHP Hatası',
E_CORE_WARNING => 'PHP Uyarısı',
E_COMPILE_ERROR => 'Derleme Hatası',
E_COMPILE_WARNING => 'Derleme Uyarısı',
E_USER_ERROR => 'Kullanıcı Hatası',
E_USER_WARNING => 'Kullanıcı Uyarısı',
E_USER_NOTICE => 'Kullanıcı Bildirimi',
E_STRICT => 'Çalışma Anı Bildirimi',
E_RECOVERABLE_ERROR => 'Yakalanabilir Ölümcül Hata'
);
// Hataların oluşumunu izlemek için hataları bir değişkene kaydedelim
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>" . $dt . "</datetime>\n";
$err .= "\t<errornum>" . $errno . "</errornum>\n";
$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
if (in_array($errno, $user_errors)) {
$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
}
$err .= "</errorentry>\n\n";
// Denemek için:
// echo $err;
// Hatayı günlüğe kaydedelim ve önemliyse ayrıca bana postalayalım
error_log($err, 3, "/usr/local/php4/error.log");
if ($errno == E_USER_ERROR) {
mail("phpdev@example.com", "Critical User Error", $err);
}
}
function distance($vect1, $vect2)
{
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Değiştirgeler yanlış, dizi belirtilmesi bekleniyor",
E_USER_ERROR);
return NULL;
}
if (count($vect1) != count($vect2)) {
trigger_error("Vektörlerin aynı boyutta olması gerekir", E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error(
"1. vektörün $i konumu bir sayı değil, 0 kullanılıyor",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error(
"2. vektörün $i konumu bir sayı değil, 0 kullanılıyor",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}
$old_error_handler = set_error_handler("userErrorHandler");
// Tanımsız sabit, bir uyarı üretir
$t = TANIMSIZIM;
// bazı "vektörler" tanımlayalım
$a = array(2, 3, "foo");
$b = array(5.5, 4.3, -1.6);
$c = array(1, -3);
// bir kullanıcı hatası üretelim
$t1 = distance($c, $b) . "\n";
// başka bir bir kullanıcı hatası üretelim
$t2 = distance($b, "ben bir dizi değilim") . "\n";
// bir uyarı üretelim
$t3 = distance($a, $b) . "\n";
?>
Ayrıca bakınız: syslog().
(PHP 4 >= 4.3.0, PHP 5)
debug_backtrace — Hata izleme raporunu bir dizi olarak üretir
Hata izleme raporunu (backtrace) bir dizi olarak üretir.
Dönen dizide "object" anahtarının bulunup bulunmayacağı belirtilir.
Bir ilişkisel dizi döner. Dönmesi olası değerler:
| İsim | Tür | Açıklama |
|---|---|---|
| function | string | O anki işlev ismi. Ayrıca bakınız: __FUNCTION__. |
| line | integer | O anki satır numarası. Ayrıca bakınız: __LINE__. |
| file | string | O anki dosya ismi. Ayrıca bakınız: __FILE__. |
| class | string | O anki sınıf ismi. Ayrıca bakınız: __CLASS__ |
| object | object | O anki nesne. |
| type | string | O anki çağrı türü. Bir yöntem çağrısı ise "->", bir duruk yöntem çağrısı ise "::" içerir. Bir işlev çağrısı ise hiçbir şey içermez. |
| args | array | Bir işlevde, işlevin değiştirgelerini; bir dosyada, dahil edilen dosyalar varsa dahil edilen dosya isimlerini içerir. |
| Sürüm: | Açıklama |
|---|---|
| 5.2.5 | Seçimlik nesne_sağla değiştirgesi eklendi. |
| 5.1.1 | Dönmesi olası elemanlara object eklendi. |
Örnek 1 - debug_backtrace() örneği
<?php
// /tmp/a.php dosyası
function a_test($str)
{
echo "\nHi: $str";
var_dump(debug_backtrace());
}
a_test('friend');
?>
<?php
// /tmp/b.php dosyası
include_once '/tmp/a.php';
?>
Results similar to the following when executing /tmp/b.php:
Hi: friend
array(2) {
[0]=>
array(4) {
["file"] => string(10) "/tmp/a.php"
["line"] => int(10)
["function"] => string(6) "a_test"
["args"]=>
array(1) {
[0] => &string(6) "friend"
}
}
[1]=>
array(4) {
["file"] => string(10) "/tmp/b.php"
["line"] => int(2)
["args"] =>
array(1) {
[0] => string(10) "/tmp/a.php"
}
["function"] => string(12) "include_once"
}
}
(PHP 5)
debug_print_backtrace — Bir hata izleme raporu basar
debug_print_backtrace() bir PHP hata izleme raporu (backtrace) basar. İşlev çağrılarını, include()/require() ile dahil edilen dosyaları ve eval() kodlarını basar.
Bu işlevin değiştirgesi yoktur.
Hiçbir değer dönmez.
Örnek 1 - debug_print_backtrace() örneği
<?php
// include.php dosyası
function a() {
b();
}
function b() {
c();
}
function c(){
debug_print_backtrace();
}
a();
?>
<?php
// test.php dosyası
// Bu dosya çalıştırılacak.
include 'include.php';
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
#0 eval() called at [/tmp/include.php:5] #1 a() called at [/tmp/include.php:17] #2 include(/tmp/include.php) called at [/tmp/test.php:3] #0 c() called at [/tmp/include.php:10] #1 b() called at [/tmp/include.php:6] #2 a() called at [/tmp/include.php:17] #3 include(/tmp/include.php) called at [/tmp/test.php:3]
(PHP 5 >= 5.2.0)
error_get_last — Son oluşan hata hakkında bilgi verir
Son oluşan hata hakkında bilgi verir.
Son oluşan hata hakkındaki bilgileri "type", "message", "file" ve "line" anahtarlı bir ilişkisel dizi olarak döndürür. Henüz bir hata oluşmamışsa NULL döner.
Örnek 1 - error_get_last() örneği
<?php
echo $a;
print_r(error_get_last());
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[type] => 8
[message] => Undefined variable: a
[file] => C:\WWW\index.php
[line] => 2
)
(PHP 4, PHP 5)
error_log — Bir yerlere bir hata iletisi gönderir
Bir hata iletisini, HTTP sunucusunun hata günlüğüne, bir TCP portuna veya bir dosyaya gönderir.
Günlüğe kaydedilecek hata iletisi.
Hata iletilerinin nereye gönderileceğini belirler. Olası günlük türleri şunlardır:
| 0 | error_log yönergesinin değerine bağlı olarak, ileti ya işletim sisteminin sistem günlük kayıtları mekanizması kullanılarak PHP'nin sistem günlüğüne ya da bir dosyaya gönderilir. |
| 1 | ileti , hedef değiştirgesinde belirtilen eposta adresine gönderilir. Dördüncü, ek_başlıklar değiştirgesinin kullanıldığı tek günlük türü budur. |
| 2 | Artık bir seçenek değildir. |
| 3 | ileti , hedef dosyasına eklenir. ileti dizgesinin sonuna satırsonu karakteri özdevinimli olarak eklenir. |
| 4 | ileti doğrudan SAPI günlükleme mekanizmasına gönderilir. |
Bu değiştirgenin değeri yukarıda açıklanan günlük_türü değiştirgesine bağlıdır.
günlük_türü değiştirgesinde 1 belirtildiğinde kullanılır. Bu günlük türü mail() işlevinin kullandığı iç işlevi kullanır.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
| Sürüm: | Açıklama |
|---|---|
| 5.2.7 | günlük_türü değiştirgesi kullanılabilir oldu. |
Örnek 1 - error_log() örnekleri
<?php
// Veritabanına bağlanamazsak sunucunun hata günlüğüne bir bildirim gönderir.
if (!Ora_Logon($username, $password)) {
error_log("Oracle database not available!", 0);
}
// FOO'nun dışına çıkmışsak yöneticiye bir eposta ile durumu bildirelim
if (!($foo = allocate_new_foo())) {
error_log("Büyük bir sorun var, FOO'nun dışına çıktık!", 1,
"operator@example.com");
}
// error_log() işlevini çağırmanın başka bir yolu:
error_log("Herşeyi yüzüne gözüne bulaştırdın!", 3,
"/var/tmp/herkes_hata_yapar.log");
?>
(PHP 4, PHP 5)
error_reporting — Hangi PHP hatalarının raporlanacağını tanımlar
error_reporting() işlevi error_reporting yönergesinin değerini çalışma anında tanımlar. PHP bir çok hata seviyesine sahiptir. Bu işlevi kullanarak betiğinizin çalışması esnasında hangi seviyelerin raporlanacağını belirleyebilirsiniz.
Yeni hata raporlama seviyesi. Bir bit maskesi veya isimli sabitler belirtilebilir. Gelecek sürümlerle uyumluluk bakımından bir bit maskesi değil, isimli sabitlerin kullanılması hararetle tavsiye edilir. Yeni hata seviyeleri eklendikçe tamsayı aralığı genişler. Dolayısıyla tamsayı olarak belirtilmiş hata seviyeleri her zaman beklendiği gibi davranmayabilir.
Kullanılabilecek hata seviyesi sabitleri ve anlamları Öntanımlı Sabitler sayfasında açıklanmıştır.
Eski error_reporting değeri döner.
| Sürüm: | Açıklama |
|---|---|
| 6.0.0 | E_STRICT sabiti E_ALL sabitine dahil edildi. |
| 5.3.0 | E_DEPRECATED ve E_USER_DEPRECATED devreye girdi. |
| 5.2.0 | E_RECOVERABLE_ERROR devreye girdi. |
| 5.0.0 | E_STRICT devreye girdi (E_ALL sabitine dahil değildir). |
Örnek 1 - error_reporting() örnekleri
<?php
// Hata raporlamayı tamamen kapatalım
error_reporting(0);
// Basit hataları raporlayalım
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// E_NOTICE de raporlansa iyi olur (ilklendirilmemiş değişkenleri
// veya yanlış yazılmış değişken isimlerini yakalamak için, vb)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// E_NOTICE hariç bütün hatalar raporlansın
// Bu php.ini içindeki öntanımlı değerdir
error_reporting(E_ALL ^ E_NOTICE);
// Tüm PHP hatalarını raporlayalım (changelog dosyasına bakınız)
error_reporting(E_ALL);
// Tüm PHP hatalarını raporlayalım
error_reporting(-1);
// error_reporting(E_ALL) ile aynı;
ini_set('error_reporting', E_ALL);
?>
E_STRICT hatalarının çoğu derleme anında değerlendirilir, bu bakımdan error_reporting yönergesi E_STRICT hatalarını içerse bile böyle hatalar raporlanmaz.
-1 değeri belirtildiği takdirde olası tüm hatalar hatta PHP'nin gelecek sürümlerinde eklenen seviyeler bile raporlanır. Ayrıca PHP 6'daki E_ALL sabiti de bu şekilde davranır.
(PHP 4 >= 4.0.1, PHP 5)
restore_error_handler — Bir önceki hata eylemcisini devreye sokar
set_error_handler() ile hata eylemcisini değiştirdikten sonra önceki hata eylemcisini (yerleşik veya kullanıcı tanımlı bir işlev) devreye sokmak için kullanılır.
Bu işlev daima TRUE döndürür.
Örnek 1 - restore_error_handler() örneği
unserialize() bir hataya sebep olsun, böylece özgün hata eylemcisini devreye sokalım.
<?php
function unserialize_handler($errno, $errstr)
{
echo "Dizgeleştirilmiş değer geçersiz.\n";
}
$serialized = 'foo';
set_error_handler('unserialize_handler');
$original = unserialize($serialized);
restore_error_handler();
?>
Yukarıdaki örneğin çıktısı:
Dizgeleştirilmiş değer geçersiz.
Bilginize: restore_error_handler() işlevi hata_eylemci işlevinden çağrıldığında yok sayılır.
(PHP 5)
restore_exception_handler — Bir önceki istisna eylemcisini devreye sokar
set_exception_handler() ile istisna eylemcisini değiştirdikten sonra önceki istisna eylemcisini (yerleşik veya kullanıcı tanımlı bir işlev) devreye sokmak için kullanılır.
Bu işlev daima TRUE döndürür.
Örnek 1 - restore_exception_handler() örneği
<?php
function istisna_eylemci_1(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
function istisna_eylemci_2(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
set_exception_handler('istisna_eylemci_1');
set_exception_handler('istisna_eylemci_2');
restore_exception_handler();
throw new Exception('İlk istisna eylemcisi tetiklenir...');
?>
Yukarıdaki örneğin çıktısı:
[istisna_eylemci_1] İlk istisna eylemcisi tetiklenir...
(PHP 4 >= 4.0.1, PHP 5)
set_error_handler — Kullanıcı tanımlı bir hata eylemcisi bildirir
Betikteki hatalarda devreye girmek üzere kullanıcı tanımlı bir işlev (hata_eylemci ) bildirir.
Bu işlev çalışma anında oluşan hatalardan kurtulmak için yapılacak işlemleri tanımladığınız bir işlevi PHP'ye bildirmek için kullanılır. Örneğin, verilerinizi veya dosyalarınızı temizlemek isterken işlemlerin durmasına yol açacak bir hata oluştuğunda veya belli durumlar için (trigger_error() ile) bir hatayı tetiklemek gerektiğinde PHP tarafından çağrılacak bir işlev tanımlayıp, bu işlevin ismini set_error_handler() ile PHP'ye bildirebilirsiniz.
Bu işlevin çağrılmasıyla PHP'nin standart hata eylemcisi tamamen devre dışı kalacaktır. Bunu asla aklınızdan çıkarmayın. error_reporting() ayarları etkisiz olacak ve her durumda sizin hata eylemciniz çağrılacaktır. Ancak, error_reporting yönergesindeki değeri hala okuyabilecek ve buna göre davranabileceksiniz. Özellikle şuna dikkat edin: Eğer hataya sebep olan deyimin önüne bir @ hata denetim işleci konmuşsa bu değer 0 olacaktır.
Ayrıca şunu da aklınızdan çıkarmayın: Gerektiği takdirde die() işlevi de sizin sorumluluğunuzdadır. hata_eylemci işlevi döndükten sonra betiğin çalışması, hataya sebep olan deyimden sonraki deyimden devam edecektir.
Kullanıcı tanımlı bir işlev ile üzerinde herhangi bir işlem yapılamayacak hatalar vardır, bunlar: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING ve set_error_handler() işlevinin çağrıldığı dosyada oluşan E_STRICT hatalarının çoğu.
Eğer betik çalıştırılmadan önce oluşan hatalar varsa (karşıya dosya yükleme sırasında oluşan hatalar gibi), bu gibi durumlar için bildirdiğiniz hata_eylemci işlevi çağrılamayacaktır.
Kullanıcının tanımlayacağı bu işlev iki değiştirge kabul etmelidir: hata kodu ve hatayı açıklayan bir dizge. Bu iki değiştirgeden sonra isteğe bağlı üç değiştirge daha kabul edilebilir: hatanın oluştuğu dosya adı, hatanın oluştuğu satırın numarası ve hatanın oluştuğu bağlam (hatanın oluştuğu noktada etkin simge tablosuna işaret eden bir dizi). hata_eylemci işlevinin söz dizimi:
İşlev FALSE döndürdüğü takdirde normal hata eylemcisi kaldığı yerden devam eder.
hata_eylemci işlevini tetikleyecek hatalar sabitleriyle, error_reporting yönergesine gösterilecek hataların değerleri belirtilirken yapıldığı gibi bir bit maskesi olarak belirtilebilir. Bu maskenin belirtilmediği durumda, error_reporting yönergesinde belirtilen değere bakılmaksızın her hatada hata_eylemci işlevi çağrılacaktır.
(Varsa) Evvelce tanımlanmış hata eylemcisinin ismini bir dizge olarak döndürür. Eğer yerleşik hata eylemcisi kullanılmışsa NULL döner. Ayrıca belirtilen geriçağırım işlevinin geçersiz olduğu durumda da NULL döner. Eğer evvelki hata eylemcisi bir sınıfın yöntemi ise bu sınıfın ve yöntemin isimlerini içeren bir dizi döner.
| Sürüm: | Açıklama |
|---|---|
| 5.2.0 | $php_errormsg kullanılması durumunda hata eylemcisi FALSE döndürmelidir. |
| 5.0.0 | hata_türü değiştirgesi kullanılabilir oldu. |
| 4.3.0 | hata_eylemci değiştirgesinde bir işlev ismi yerine bir nesne başvurusu ve bir yöntem ismi içeren bir dizi belirtebilmek mümkün oldu. |
| 4.0.2 | hata_eylemci işlevinin isteğe bağlı ek üç değiştirge (betik ismi, satır numarası ve bağlam) kabul edebilmesi mümkün oldu. |
Örnek 1 - set_error_handler() ve trigger_error() ile hataların ele alınması
Bu örnekte hatalar tetiklenerek oluşan dahili istisnaların kullanıcı tanımlı bir işlev ile ele alınması gösterilmiştir.
<?php
// hata eylemci işlevi
function hataEylemcim($hatanum, $ileti, $betik, $satırnum)
{
switch ($hatanum) {
case E_USER_ERROR:
echo "<b>HATA</b> [$hatanum] $ileti<br />\n";
echo " $betik dosyasının $satırnum. satırında ölümcül hata";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Çıkılıyor...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>UYARI</b> [$hatanum] $ileti<br />\n";
break;
case E_USER_NOTICE:
echo "<b>BİLGİ</b> [$hatanum] $ileti<br />\n";
break;
default:
echo "Bilinmeyen hata türü: [$hatanum] $ileti<br />\n";
break;
}
/* PHP'nin yerleşik hata eylemcisi çalışmasın */
return true;
}
// Hatanın oluşacağı işlev
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("x <= 0 için log(x) tanımsız, scale = $scale verilmiş",
E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Yanlış girdi, değerler dizi olarak verilmeliydi",
E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $value) {
if (!is_numeric($value)) {
trigger_error("$pos. değer bir sayı değil, 0 kullanılıyor",
E_USER_NOTICE);
$value = 0;
}
$temp[$pos] = log($scale) * $value;
}
return $temp;
}
// kullanıcı tanımlı hata eylemcisini bildirelim
$old_error_handler = set_error_handler("hataEylemcim");
// Bazı hataları tetikleyelim.
// Önce sayısal olmayan bir eleman içeren bir dizi tanımlayalım.
echo "ilk durum; bir hata: sayı yerine dizge\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// burada ikinci hatayı üretiyoruz
echo "----\nikinci durum - bir uyarı (b = log(PI) * a)\n";
/* $pos. değer bir sayı değil, 0 kullanılıyor */
$b = scale_by_log($a, M_PI);
print_r($b);
// Bir dizi yerine bir dizge aktarıp yine sorun çıkarıyoruz
echo "----\nüçüncü durum - bir uyarı\n";
/* Yanlış girdi, değerler dizi olarak verilmeliydi */
$c = scale_by_log("not array", 2.3);
var_dump($c); // NULL
// Bu önemli bir hata; sıfır veya negatif bir sayının logaritması.
echo "----\ndördüncü durum - ölümcül hata\n";
/* x <= 0 için log(x) tanımsız, scale = $scale olmalıydı */
$d = scale_by_log($a, -2.5);
var_dump($d); // Bu satır hiç çalışmayacak.
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
ilk durum; bir hata: sayı yerine dizge
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
ikinci durum - bir uyarı (b = log(PI) * a)
<b>BİLGİ</b> [1024] 2. değer bir sayı değil, 0 kullanılıyor<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
üçüncü durum - bir uyarı
<b>UYARI</b> [512] Yanlış girdi, değerler dizi olarak verilmeliydi<br />
NULL
----
dördüncü durum - ölümcül hata
<b>HATA</b> [256] x <= 0 için log(x) tanımsız, scale = -2.5 verilmiş<br />
php-dnm dosyasının 36. satırında ölümcül hata, PHP 5.3.0beta2-dev
(Linux)<br />
Çıkılıyor...<br />
(PHP 5)
set_exception_handler — Kullanıcı tanımlı bir istisna eylemcisi bildirir
İstisna bir try/catch bloğu içinde yakalanamadığı durumlarda kullanılmak üzere bir istisna eylemcisi bildirir. istisna_eylemcisi işlevinin çağrılmasıyla istisna durdurulmuş olur.
Yakalanmamış bir istisna olduğunda çağrılacak işlevin ismi. Bu işlev set_exception_handler() çağrılmadan önce tanımlanmış olmalıdır. Bu eylemci işlevin tek bir değiştirge kabul etmesi gerekir: Oluşan istisna nesnesi.
Hata durumunda NULL aksi takdirde evvelce tanımlanmış istisna eylemcisinin ismini döndürür. Evvelce tanımlanmış bir eylemci olmaması durumunda da NULL döner.
Örnek 1 - set_exception_handler() örneği
<?php
function istisna_eylemcisi($istisna) {
echo "Yakalanmamış istisna: " , $istisna->getMessage(), "\n";
}
set_exception_handler('istisna_eylemcisi');
throw new Exception('Yakalanmamış İstisna');
echo "Çalışmadı\n";
?>
(PHP 4 >= 4.0.1, PHP 5)
trigger_error — Kullanıcı seviyesinde bir hata/uyarı/bilgi iletisi üretir
Bir kullanıcı hatası durumunu tetiklemek için kullanır. Yerleşik bir hata eylemcisi ile birlikte kullanılabileceği gibi (set_error_handler() ile) yeni bir hata eylemcisi olarak bildirilmiş bir kullanıcı tanımlı işlev ile birlikte de kullanılabilir.
Bu işlev çalışma anında, bir olağandışılık durumunda, belli bir yanıt üretmek gerektiğinde çok kullanışlıdır.
Tetiklenen hata için tasarlanmış hata iletisi. En fazla 1024 karakter uzunluğunda olabilir. 1024'ten sonraki karakterler kırpılır.
Tetiklenen hata için tasarlanmış hata türü. Sadece E_USER_ ailesinden sabitler belirtilebilir. E_USER_NOTICE öntanımlıdır.
tür yanlış belirtilmişse FALSE aksi takdirde TRUE döner.
Örnek 1 - trigger_error() örneği
Daha kapsamlı bir örnek için set_error_handler() işlevine bakınız.
<?php
if (assert($divisor == 0)) {
trigger_error("Sıfır bir bölen olamaz", E_USER_ERROR);
}
?>
error_msg içindeki HTML öğeleri öncelenmez. Hta tarayıcıda gösterilecekse htmlentities() kullanın.
The htscanner extension gives the possibility to use htaccess-like file to configure PHP per directory, just like apache's htaccess. It is especially useful with fastcgi (ISS5/6/7, lighttpd, etc.).
PHP version 5.2.0 or greater.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/htscanner
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişlik Yeri | Changelog |
|---|---|---|---|
| htscanner.config_file | ".htscanner" | PHP_INI_SYSTEM | |
| htscanner.default_docroot | "/" | PHP_INI_SYSTEM | |
| htscanner.default_ttl | "300" | PHP_INI_SYSTEM | |
| htscanner."stop_on_error" | "Off" | PHP_INI_SYSTEM |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Filename to use as configuration file.
Default document root.
Cache time out for the configuration data, in seconds.
Stop on error (parse error, cannot set an ini setting).
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Traces through and dumps the hierarchy of file inclusions and class inheritance at runtime.
The files may have been included using include(), include_once(), require(), or require_once().
Class inheritance dependencies are also reported.
PHP version 5.1.0 or greater.
The included gengraph.php file utilizes the » graphviz library, however, this is not required.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/inclued
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişlik Yeri | Changelog |
|---|---|---|---|
| inclued.enabled | Off | PHP_INI_* | |
| inclued.dumpdir | Off | PHP_INI_* |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Whether or not to enable inclued.
Location (path) to the directory that stores inclued files. If set, each PHP request will create a file.
Because every request creates a file, this directory may fill up fast!
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
Bu eklentinin tanımlanmış sabitleri yoktur.
This example demonstrates the process of implementing inclued into an existing application, and viewing the results.
Örnek 1 Getting the data from inclued
<?php
// File to store the inclued information
$fp = fopen('/tmp/wp.json', 'w');
if ($fp) {
$clue = inclued_get_data();
if ($clue) {
fwrite($fp, json_encode($clue));
}
fclose($fp);
}
?>
Now that some data exists, it's time to make sense of it in the form of a graph. The inclued extension includes a PHP file named gengraph.php that creates a dot file that requires the » graphviz library. However, this form is not required.
Örnek 2 Example use of gengraph.php
This example creates an image named inclued.png that shows the inclued data.
# First, create the dot file $ php graphviz.php -i /tmp/wp.json -o wp.dot # Next, create the image $ dot -Tpng -o inclued.png wp.dot
(PECL inclued >= 0.1.0)
inclued_get_data — Get the inclued data
Get the inclued data.
Bu işlevin değiştirgesi yoktur.
The inclued data.
Örnek 1 inclued_get_data() example
See the inclued examples section for ways to create a graphs with this data.
<?php
include 'x.php';
$clue = inclued_get_data();
print_r($clue);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[includes] => Array
(
[0] => Array
(
[operation] => include
[op_type] => 2
[filename] => x.php
[opened_path] => /tmp/x.php
[fromfile] => /tmp/z.php
[fromline] => 2
)
)
)
Bu işlevler PHP'nin kendisi hakkında pek çok bilgi almanızı sağlarlar. Çalışma anı yapılandırması, yüklü eklentiler, sürüm ve daha pek çok bilgi. Ayrıca, çalışmakta olan PHP'nin seçeneklerini atayacak işlevleri de burada bulabilirsiniz. PHP'nin belki de en bilinen işlevi phpinfo()'yu da burada bulabilirsiniz.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu işlevleri kullanmak için hiçbir şey kurmaya gerek yoktur; PHP çekirdeğinin parçasıdırlar.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişiklik Yeri | Sürüm Bilgisi |
|---|---|---|---|
| assert.active | "1" | PHP_INI_ALL | |
| assert.bail | "0" | PHP_INI_ALL | |
| assert.warning | "1" | PHP_INI_ALL | |
| assert.callback | NULL | PHP_INI_ALL | |
| assert.quiet_eval | "0" | PHP_INI_ALL | |
| enable_dl | "1" | PHP_INI_SYSTEM | PHP 6.0.0'da kaldırıldı. |
| max_execution_time | "30" | PHP_INI_ALL | |
| max_input_time | "-1" | PHP_INI_PERDIR | PHP 4.3.0'dan beri kullanılmaktadır. |
| max_input_nesting_level | "64" | PHP_INI_PERDIR | PHP 4.4.8'den beri kullanılmaktadır. PHP 5.0.0'da kaldırıldı. |
| magic_quotes_gpc | "1" | PHP_INI_PERDIR | PHP <= 4.2.3'te PHP_INI_ALL. PHP 6.0.0'da kaldırıldı. |
| magic_quotes_runtime | "0" | PHP_INI_ALL | PHP 6.0.0'da kaldırıldı. |
| zend.enable_gc | "1" | PHP_INI_ALL | PHP 5.3.0'dan beri kullanılmaktadır. |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
assert() değerlendirmesini etkin kılar.
Kararlılık denetimleri başarısız olduğunda betiğin çalışmasını sonlandırır.
Başarısız olan her kararlılık denetimi için bir PHP uyarısı çıktılar.
Kararlılık denetimleri başarısız olduğunda çağrılacak kullanıcı işlevi.
Kararlılık denetimini sağlayan ifadenin değerlendirilmesi sırasında error_reporting() işlevinin o anki ayarları kullanılır. Etkin olduğunda değerlendirme sırasında hiçbir hata gösterilmez (örtük error_reporting(0)). Aksi takdirde, hatalar error_reporting() ayarlarına uygun olarak gösterilir.
Bu yönerge gerçekte sadece PHP'nin Apache modülünde yararlıdır. PHP eklentilerinin dl() işleviyle sanal konak veya dizin temelinde devingen olarak yüklenmesini veya yüklenmemesini etkin kılabilirsiniz.
Devingen yüklemenin devre dışı bırakılmasının asıl sebebi güvenliktir.
Devingen yükleme ile, tüm open_basedir sınırlamalarını yok
saymak mümkündür. Devingen yüklemeye safe_mode kullanımı dışında
öntanımlı olarak izin verilir. Güvenli kipte dl()
işlevi asla kullanılamaz.
Çözümleyici tarafından sonlandırılmadan önce bir betiğin çalışabileceği azami süreyi saniye cinsinden tanımlar. Bu, yetersizce yazılmış betiklerin sunucuya bağlanmasına engel olur. Öntanımlı süre 30 saniyedir. PHP komut satırından çalıştırıldığında bu süre 0 saniyedir.
Azami çalışma süresi sistem çağrılarından, akım işlemlerinden ve benzerlerinden etkilenmez. Daha ayrıntılı bilgi için set_time_limit() işlevinin açıklamasına bakınız.
Güvenli kipte (safe_mode) çalışırken ini_set() ile
bu ayarı değiştiremezsiniz. Bunu yapmanın tek çaresi php.ini içinde
güvenli kipi kapatmak ya da süre sınırlamasını değiştirmektir.
HTTP sunucunuzun PHP'nin çalışmasını kesintiye uğratacak başka zaman aşımı yapılandırmaları olabilir. Apache'nin bir Timeout yönergesi ve IIS'nin bir CGI zaman aşımı işlevi vardır. Bu konuda daha ayrıntılı bilgi edinmek için HTTP sunucunuzun belgelerine bakınız.
Bir betiğin POST, GET ve karşıya dosya yükleme gibi girdileri çözümlemesi için gereken azami süre saniye cinsinden burada belirtilir.
girdi değişkenlerinin ($_GET, $_POST... gibi) azami iç içelik derinliğini ayarlar.
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
GPC (Get/Post/Cookie) işlemleri için sihirli tırnakların durumunu ayarlar. Bu yönergeye 'On' atandığında tüm ' (tek tırnak), " (çift tırnak), \ (tersbölü) ve NULL karakterleri özdevinimli olarak bir tersbölü ile öncelenecektir.
Bilginize: PHP 4'te bunlardan başka $_ENV değişkenleri de öncelenir.
Bilginize: Eğer magic_quotes_sybase yönergesine de ON atanmışsa bu magic_quotes_gpc yönergesini tamamen geçersiz kılacaktır. Her iki yönergenin etkin olmasının anlamı, sadece tek tırnakların '' biçiminde öncelenmesi, çift tırnakların, tersbölülerin ve NULL'ların olduğu gibi bırakılması, öncelenmemesi demektir.
Ayrıca, get_magic_quotes_gpc() işlevinin açıklamasına da bakınız.
Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.
magic_quotes_runtime yönergesi etkinse, veritabanları ve metin dosyaları gibi her tür harici kaynaktan veri döndüren çoğu işlev öncelem için tersbölü karakterini kullanacaktır. Eğer magic_quotes_sybase yönergesi de ON ise, tek tırnaklar tersbölü yerine bir tek tırnak ile öncelenir.
magic_quotes_runtime yönergesinden etkilenen işlevler (PECL'dekiler hariç):
Döngüsel gönderim toplayıcısını açıp kapar.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Aşağıdaki sabitler PHP çekirdeğinin parçası olarak daima kullanılabilir durumdadır.
| Sabit | Değer | Açıklama |
|---|---|---|
| CREDITS_GROUP | 1 | PHP geliştiricilerinin listesi. |
| CREDITS_GENERAL | 2 | Genel katkıcılar: Dil tasarımı ve kavramlar, PHP ve SAPI modülü yazarları. |
| CREDITS_SAPI | 4 | PHP için sunucu API modüllerinin listesi ve bunların yazarları. |
| CREDITS_MODULES | 8 | PHP için eklenti modüllerinin listesi ve bunların yazarları. |
| CREDITS_DOCS | 16 | Belgelendirme ekibi. |
| CREDITS_FULLPAGE | 32 | Genellikle diğer seçeneklerle birlikte kullanılır. Diğer seçeneklerin gösterilmesini gerektirdiği bilgilerin tamamının tek bir HTML sayfasına basılmasını sağlar. |
| CREDITS_QA | 64 | Kalite güvencesi ekibi. |
| CREDITS_ALL | -1 | Tüm katkıcılar; şu sabitlere eşdeğerdir: CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_QA + CREDITS_FULLPAGE. Bu sabitlerle ilgili bilgilerin uygun başlıklarla tek bir HTML sayfasında gösterilmesini sağlar. Bu öntanımlı değerdir. |
| Sabit | Değer | Açıklama |
|---|---|---|
| INFO_GENERAL | 1 | Yapılandırma satırı, php.ini dosyasının yeri, derleme tarihi, HTTP Sunucusu, Sistem ve benzerleri. |
| INFO_CREDITS | 2 | PHP Katkıcıları. Ayrıca bakınız: phpcredits(). |
| INFO_CONFIGURATION | 4 | PHP yönergelerinin geçerli yerel ve asıl değerleri. Ayrıca bakınız: ini_get(). |
| INFO_MODULES | 8 | Yüklü modüller ve bunlarla ilgili ayarlar. |
| INFO_ENVIRONMENT | 16 | $_ENV ile de kullanılabilen ortam değişkenleri bilgisi. |
| INFO_VARIABLES | 32 | EGPCS (Environment, GET, POST, Cookie, Server) ile ilgili tüm öntanımlı değişkenleri listeler. |
| INFO_LICENSE | 64 | PHP Lisans bilgisi. Ayrıca bakınız: » Lisans SSS. |
| INFO_ALL | -1 | Yukarıdakilerin tamamı gösterilir. Bu öntanımlı değerdir. |
Aşağıdaki sabitler sadece Windows içindir. Çeşitli özellikleri saptamak için sürüm bilgileri verirler. Bu sabitler PHP 5.3.0'dan itibaren kullanılabilmektedir
| Sabit | Açıklama |
|---|---|
| PHP_WINDOWS_VERSION_MAJOR | Windows ana sürüm numarası; 4 (NT4/ME/98/95), 5 (XP/2003 R2/2003/2000) veya 6 (Vista/2008) olabilir. |
| PHP_WINDOWS_VERSION_MINOR | Windows alt sürüm numarası; 0 (Vista/2008/2000/NT4/95), 1 (XP), 2 (2003 R2/2003/XP x64), 10 (98) veya 90 (ME) olabilir. |
| PHP_WINDOWS_VERSION_BUILD | Windows derleme sürümü (örneğin, Windows Vista + SP1 için 6001'dir). |
| PHP_WINDOWS_VERSION_PLATFORM | PHP'nin üzerinde çalıştığı platform sürüm numarası; Windows Vista/XP/2000/NT4 ve Server 2008/2003 için 2, Windows ME/98/95 için 1 olabilir. |
| PHP_WINDOWS_VERSION_SP_MAJOR | Kurulu SP ana sürümü; hiçbir SP kurulu değilse 0'dır. Örneğin SP 3 kurulu Windows XP için bu değer 3'tür. |
| PHP_WINDOWS_VERSION_SP_MINOR | Kurulu SP ana sürümü; hiçbir SP kurulu değilse 0'dır. |
| PHP_WINDOWS_VERSION_SUITEMASK | Çeşitli kurulu Windows özelliklerini betimleyen bir bit maskesi, Olası değerler için aşağıdaki tabloya bakınız. |
| PHP_WINDOWS_VERSION_PRODUCTTYPE | This contains the value used to determine the PHP_WINDOWS_NT_* sabitlerini saptamakta kullanılan değer; platform türünü belirleyen PHP_WINDOWS_NT_*sabitlerinden biri olabilir. |
| PHP_WINDOWS_NT_DOMAIN_CONTROLLER | Bir etki alanı denetleyicisidir. |
| PHP_WINDOWS_NT_SERVER | Bir sunucu sistemi belirtir (Server 2008/2003/2000 gibi); ancak, sunucu aynı zamanda bir etki alanı denetleyicisi ise PHP_WINDOWS_NT_DOMAIN_CONTROLLER olarak raporlanır. |
| PHP_WINDOWS_NT_WORKSTATION | Bir istemci sistemi belirtir (Vista/XP/2000/NT4 gibi). |
PHP_WINDOWS_VERSION_SUITEMASK bit maskesinde kullanılabilecek bitsel değerler aşağıdaki tablada gösterilmiştir.
| Bit alanı | Açıklama |
|---|---|
| 0x00000004 | Microsoft BackOffice bileşenleri kurulu. |
| 0x00000400 | Windows Server 2003, Web Edition kurulu. |
| 0x00004000 | Windows Server 2003, Compute Cluster Edition kurulu. |
| 0x00000080 | Windows Server 2008 Datacenter, Windows Server 2003, Datacenter Edition veya Windows 2000 Datacenter Server kurulu. |
| 0x00000002 | Windows Server 2008 Enterprise, Windows Server 2003, Enterprise Edition, Windows 2000 Advanced Server veya Windows NT Server 4.0 Enterprise Edition kurulu. |
| 0x00000040 | Windows XP Embedded kurulu. |
| 0x00000200 | Windows Vista Home Premium, Windows Vista Home Basic, or Windows XP Home Edition kurulu |
| 0x00000100 | Remote Desktop sadece etkileşimli tek oturumla desteklenir. Sistem bir uygulama sunucusu olarak çalışmadıkça bu değer atanır. |
| 0x00000001 | Evvelce sistemde Microsoft Small Business Server kuruluymuş fakat başka bir Windows sürümüne yükseltilmiş. |
| 0x00000020 | Microsoft Small Business Server, sınırlı istemci lisansı ile kurulu. |
| 0x00002000 | Windows Storage Server 2003 R2 veya Windows Storage Server 2003 kurulu. |
| 0x00000010 | Terminal Services kurulu. Bu değer daima atanır. Bu değer atanmışsa ancak 0x00000100 değilse sistem uygulama sunucusu kipinde çalışıyor demektir. |
| 0x00008000 | Windows Home Server kurulu. |
(PHP 4, PHP 5)
assert_options — Çeşitli kararlılık denetim seçeneklerini açar/kapar
assert() işlevi için çeşitli denetim seçeneklerini tanımlar veya mevcut değerlerini sorgular.
| Seçenek | INI değiştirgesi | Öntanımlı | Açıklama |
|---|---|---|---|
| ASSERT_ACTIVE | assert.active | 1 | assert() değerlendirmesi etkin kılınır. |
| ASSERT_WARNING | assert.warning | 1 | Her başarısız sav için bir PHP uyarısı çıktılanır |
| ASSERT_BAIL | assert.bail | 0 | Savın başarısızlığı halinde çalışma durdurulur. |
| ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | Sav ifadesinin değerlendirilmesi sırasında hata raporlama kapatılır. |
| ASSERT_CALLBACK | assert.callback | (NULL) | Savın başarısızlığı halinde çağrılacak geriçağırım işlevi. |
Seçenek için isteğe bağlı yeni değer.
Hata oluşursa FALSE, aksi takdirde belirtilen seçeneğin özgün değeri döner.
Örnek 1 - assert_options() örneği
<?php
// Sav başarısızlıklarında çalışacak işlevimiz
function assert_failure()
{
echo 'İddia geçersiz';
}
// Sınama işlevimiz
function test_assert($parameter)
{
assert(is_bool($parameter));
}
// Sav seçeneklerini atayalım
assert_options(ASSERT_ACTIVE, true);
assert_options(ASSERT_BAIL, true);
assert_options(ASSERT_WARNING, false);
assert_options(ASSERT_CALLBACK, 'assert_failure');
// Başarısız olmasını umarak bir sav ileri sürelim
test_assert(1);
// ASSERT_BAIL true olduğundan buraya asla gelinmez
echo 'Buraya gelinmemesi gerekir';
?>
(PHP 4, PHP 5)
assert — Belirtilen savı sınar
assert() işlevi belirtilen sav 'ı sınar ve sonuç FALSE ise uygun eylemi gerçekleştirir.
sav bir dizge olarak verilmişse işlev tarafından PHP kodu olarak değerlendirilir. Savın bir dizge olarak belirtilmesinin getirisi, sav sınama kapalı olduğu zaman daha az yük oluşması ve sav başarısız olduğunda iletilerin sav ifadesini içerebilmeleridir. Yani, sav olarak bir mantıksal ifade aktardığınız takdirde, bu koşul ifadesi assert_options() işlevi ile tanımladığınız eylemci işleve bir değiştirge olarak gösterilmez, eylemci işlev çağrılmadan önce koşul ifadesi bir dizgeye, mantıksal FALSE değeri ise boş bir dizgeye dönüştürülür.
Savlar sadece bir hata ayıklama aracı olarak kullanılmalıdır. Bazı programlama hatalarının olmadığını belirten veya bir eklenti işlevi gibi belli özelliklerin veya belli sistem sınırlamalarının ve özelliklerinin varlığını sınayan koşul ifadelerinin her zaman TRUE dönmesini gerektiren kararlılık denetimleri için de kullanabilirsiniz.
Savlar, girdi değiştirgelerinin sınanması gibi normal çalışma anı işlemleri için kullanılmamalıdır. Ana kural olarak, bir kararlılık denetimini etkin kılmaksızın kodunuz düzgün olarak çalışabilmelidir.
assert() işlevinin davranışı assert_options() işlevi ile veya bu işlevin kılavuz sayfasında açıklanan INI ayarları ile yapılandırılabilir.
assert_options() işlevi ve/veya ASSERT_CALLBACK yapılandırma yönergesi ile bir savın başarısızlığı halinde çalışacak bir geriçağırım işlevi belirtilebilir.
assert() geriçağırım işlevleri, özellikle özdevinimli deneme ortamları oluşturulurken yararlı olur. Çünkü bunlar, savın oluştuğu yer bilgisi yanında sava aktarılan kodun da yakalanmasını kolaylaştırırlar. Bu bilgi başka yöntemlerle yakalanabilirse de savların kullanımı bu işlemin daha kolay ve çabuk olmasını sağlar.
Geriçağırım işlevinin üç değiştirge kabul etmesi gerekir. İlk değiştirge savın başarısız olduğu dosyayı, ikinci değiştirge savın başarısız olduğu satırı, üçüncü değiştirge ise başarısız olan ifadeyi (1, "iki" gibi herhangi bir değer belirtilebilir) içerir.
İddia.
Sav yanlışsa FALSE değilse TRUE.
Örnek 1 - Başarısız bir savın özel bir işlevle ele alınması
<?php
// Savı etkin ve sessiz kılalım
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);
// Savın başarısızlığı halinde çalışacak işlevimiz
function savcı($dosya, $satır, $ifade)
{
echo "<hr>Sav geçersiz:
Dosya: '$dosya'<br />
Satır: '$satır'<br />
Kod: '$ifade'<br /><hr />";
}
// Geriçağırım işlevimizi belirtelim
assert_options(ASSERT_CALLBACK, 'savcı');
// Başarısız olmasını umarak bir sav ileri sürelim
assert('mysql_query("")');
?>
(PHP 4, PHP 5)
dl — Belirtilen PHP eklentisini çalışma anında yükler
Kütüphane dosyası kütüphane değiştirgesi ile belirtilen PHP eklentisini yükler.
Belli bir eklentinin yüklü olup olmadığını sınamak için, hem yerleşik (php.ini ile yüklenen) hem de devingen olarak (dl() ile) yüklenen eklentileri bulan extension_loaded() işlevini kullanın.
Bu işlevin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu işleve kesinlikle güvenmemelisiniz.
Bu değiştirge ile eklentinin platforma özgü kütüphane dosyasının ismi belirtilir. Örneğin sockets eklentisini Windows platformunda yüklemek için php_sockets.dll ismini kullanmak gerekirken Unix platformlarında sockets.so kullanmak gerekir (bir paylaşımlı modül olarak derlenmişse).
Eklentinin yükleneceği dizin platforma göre değişiklik gösterir:
Windows - php.ini içinde açıkça belirtilmemişse, eklenti öntanımlı olarak c:\php4\extensions\ dizininden yüklenir.
Unix - php.ini içinde açıkça belirtilmemişse, öntanımlı eklenti dizinin yeri şunlara bağlıdır:
Bu durumlar hesaba katılarak eklentilerin öntanımlı yeri şöyle saptanır: <kurulum-dizini>/lib/php/extensions/ <debug/no-debug>-<zts/non-zts>-ZEND_MODULE_API_NO. Örnek: /usr/local/php/lib/php/extensions/debug-non-zts-20010901 veya /usr/local/php/lib/php/extensions/no-debug-zts-20010901.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner. Eğer modül yükleme işlevsel değilse
(enable_dl ile iptal edilmiş veya php.ini içinde
safe_mode etkin kılınmışsa) bir E_ERROR iletisi
çıktılanıp çalışma durdurulur. Eğer işlev, kütüphane yüklenemediğinden
dolayı başarısız olursa bir E_WARNING iletisi
çıktılayarak FALSEdöndürür.
Örnek 1 - dl() örnekleri
<?php
// Platforma göre eklenti yüklemek
if (!extension_loaded('sqlite')) {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
dl('php_sqlite.dll');
} else {
dl('sqlite.so');
}
}
// PHP 4.3.0 ve sonrası için PHP_SHLIB_SUFFIX sabiti de kullanılabilir
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
?>
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | Artık CLI, CGI ve Embed hariç tüm SAPI'lerde bir E_DEPRECATED üretiliyor. |
Bilginize: dl() işlevi çok evreli HTTP sunucularında desteklenmez. Böyle bir ortamda çalışıyorsanız php.ini içinde extensions deyimini kullanın. Ancak, CGI ve CLI sürümleri bundan etkilenmez.
Bilginize: PHP 5'ten beri, dl() işlevinin CLI dışında kullanımı önerilmemektidir. Yerine Eklenti Yükleme Yönergelerini kullanın.
Bilginize: PHP 6'dan beri bu işlev CLI, CGI ve embed dışında kalan tüm SAPI'lerde kaldırılmıştır.
Bilginize: dl() işlevinin değiştirgesi Unix platformlarında harf büyüklüğüne duyarlıdır.
Bilginize: Bu işlev, PHP güvenli kipte çalışırken iptal edilir.
(PHP 4, PHP 5)
extension_loaded — Belirtilen eklenti yüklü mü diye bakar
Belirtilen eklenti yüklü mü diye bakar.
Eklentinin ismi.
Eklentilerin isimlerini phpinfo() işlevini kullanarak veya CGI / CLI sürümlerini kullanıyorsanız -m seçeneği ile listeleyebilirsiniz:
$ php -m [PHP Modules] xml tokenizer standard sockets session posix pcre overload mysql mbstring ctype [Zend Modules]
İsmi belirtilen eklenti yüklü ise TRUE, değilse FALSE döner.
Örnek 1 - extension_loaded() örneği
<?php
if (!extension_loaded('gd')) {
if (!dl('gd.so')) {
exit;
}
}
?>
| Sürüm: | Açıklama |
|---|---|
| 5.0.0 | extension_loaded() işlevi belli bir eklentinin varlığını sınamak için eklentinin dahili ismini kullanır. Çoğu eklentinin ismi küçük harflerle yazılmışsa da büyük harfler kullanılarak yazılmış olanları da vardır. Bu işlev, PHP 5 öncesinde eklenti isimleri bakımından harf büyüklüğüne duyarlı idi. |
(PHP 5 >= 5.3.0)
gc_collect_cycles — Çöp döngülerin toplanması için zorlar
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Çöp döngülerin toplanması için zorlar.
Bu işlevin değiştirgesi yoktur.
Toplanan çöp döngü sayısı ile döner.
(PHP 5 >= 5.3.0)
gc_disable — Döngüsel gönderim toplayıcısını etkisiz kılar
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Döngüsel gönderim toplayıcısını etkisiz kılar.
Bu işlevin değiştirgesi yoktur.
Hiçbir değer dönmez.
(PHP 5 >= 5.3.0)
gc_enable — Döngüsel gönderim toplayıcısını etkin kılar
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Döngüsel gönderim toplayıcısını etkin kılar.
Bu işlevin değiştirgesi yoktur.
Hiçbir değer dönmez.
(PHP 5 >= 5.3.0)
gc_enabled — Döngüsel gönderim toplayıcısının durumunu döndürür
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Döngüsel gönderim toplayıcısının (çöp toplayıcı) durumunu döndürür.
Bu işlevin değiştirgesi yoktur.
Çöp toplayıcı etkinse TRUE değilse FALSE döner.
(PHP 4, PHP 5)
get_cfg_var — Belirtilen PHP yönergesinin değerini döndürür
Belirtilen PHP yapılandırma yönergesininin değerini döndürür.
Bu işlev, PHP yapılandırılırken kullanılan yapılandırma seçeneklerini döndürmediği gibi Apache yapılandırma dosyasını da okumaz.
Sistemin bir yapılandırma dosyası
kullanıp kullanmadığını cfg_file_path yönergesinin değerine
bakarak öğrenebilirsiniz. Bir değer atanmışsa yapılandırma dosyası
kullanılıyordur.
Yapılandırma yönergesinin ismi.
Bir hata oluşursa FALSE, aksi takdirde belirtilen PHP yapılandırma yönergesinin değerini döndürür.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | Dizi değerli yapılandırma yönergelerinin değerlerinin döndürülmesi sağlandı. |
(PHP 4, PHP 5)
get_current_user — PHP betiğinin sahibininin kullanıcı ismini döndürür
Betik sahibininin kullanıcı ismini döndürür.
Kullanıcı ismi bir dizge olarak döner.
Örnek 1 - get_current_user() örneği
<?php
echo 'Betiğin sahibi: ' . get_current_user();
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Betiğin sahibi: SYSTEM
(PHP 4 >= 4.1.0, PHP 5)
get_defined_constants — Tüm sabitlerin isimlerini ve değerlerini içeren bir ilişkisel dizi döndürür
Tanımlı olan tüm sabitlerin isimlerini ve değerlerini içeren bir ilişkisel dizi döndürür. Eklentilerce oluşturulanların yanında define() işleviyle tanımlananları da döndürür.
TRUE belirtildiği takdirde, dizinin içerdiği sabitler dizinin ilk anahtarlarının altında sınıflandırılırlar.
<?php
define("SABİT", 1);
print_r(get_defined_constants(true));
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[internal] => Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
[pcre] => Array
(
[PREG_PATTERN_ORDER] => 1
[PREG_SET_ORDER] => 2
[PREG_OFFSET_CAPTURE] => 256
[PREG_SPLIT_NO_EMPTY] => 1
[PREG_SPLIT_DELIM_CAPTURE] => 2
[PREG_SPLIT_OFFSET_CAPTURE] => 4
[PREG_GREP_INVERT] => 1
)
[user] => Array
(
[SABİT] => 1
)
)
| Sürüm: | Açıklama |
|---|---|
| 5.0.0 | sınıfla değiştirgesi eklendi. |
Örnek 1 - get_defined_constants() örneği
<?php
print_r(get_defined_constants());
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
(PHP 4, PHP 5)
get_extension_funcs — Bir modülün işlevlerinin isimlerini içeren bir dizi döndürür
modül_ismi ile belirtilen modülde tanımlı tüm işlevlerin isimlerini bir dizi içinde döndürür.
Modülün ismi.
Bilginize: Bu değiştirge küçük harflerle yazılmalıdır.
modül_ismi geçerli bir eklenti ismi değilse FALSE, aksi takdirde tüm işlev isimlerini içeren bir dizi döner.
Örnek 1 - XML işlevlerinin listesi
<?php
print_r(get_extension_funcs("xml"));
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[0] => xml_parser_create
[1] => xml_parser_create_ns
[2] => xml_set_object
[3] => xml_set_element_handler
[4] => xml_set_character_data_handler
[5] => xml_set_processing_instruction_handler
[6] => xml_set_default_handler
[7] => xml_set_unparsed_entity_decl_handler
[8] => xml_set_notation_decl_handler
[9] => xml_set_external_entity_ref_handler
[10] => xml_set_start_namespace_decl_handler
[11] => xml_set_end_namespace_decl_handler
[12] => xml_parse
[13] => xml_parse_into_struct
[14] => xml_get_error_code
[15] => xml_error_string
[16] => xml_get_current_line_number
[17] => xml_get_current_column_number
[18] => xml_get_current_byte_index
[19] => xml_parser_free
[20] => xml_parser_set_option
[21] => xml_parser_get_option
[22] => utf8_encode
[23] => utf8_decode
)
(PHP 4 >= 4.3.0, PHP 5)
get_include_path — include_path yönergesinin değerini döndürür
Dosya arama yolları bir dizge olarak döner.
Örnek 1 - get_include_path() örneği
<?php
// PHP 4.3.0 ve sonrasında çalışır
echo get_include_path();
// Tüm PHP sürümlerinde çalışır
echo ini_get('include_path');
?>
(PHP 4, PHP 5)
get_included_files — Betiğe dahil edilen dosyaların isimlerini içeren bir dizi döndürür
include(), include_once(), require() veya require_once() kullanarak betiğe dahil edilen tüm dosyaların isimlerini döndürür.
Betiğe dahil edilen dosyaların isimlerini içeren bir dizi döndürür.
Betiğin kendisi de içerilmiş bir dosya olarak ele alınır ve ismi dönen diziye dahil edilir.
Betiğe birden fazla dahil edilen dosyaların isimleri dönen dizi içinde bir kere zikredilir.
| Sürüm: | Açıklama |
|---|---|
| 4.0.1 | PHP 4.0.1 ve öncesinde, bu işlev betiğe dahil edilen dosyaların .php uzantısına sahip olduklarını varsayar, diğer dosyaların isimlerini döndürmezdi. get_included_files() tarafından döndürülen ilişkisel dizi sadece include() ve include_once() kullanılarak betiğe dahil edilen dosyaların isimlerini döndürürdü. |
Örnek 1 - get_included_files() örneği
<?php
// Dosyanın kendi ismi: abc.php
include 'test1.php';
include_once 'test2.php';
require 'test3.php';
require_once 'test4.php';
$included_files = get_included_files();
foreach ($included_files as $filename) {
echo "$filename\n";
}
?>
Yukarıdaki örneğin çıktısı:
abc.php test1.php test2.php test3.php test4.php
Bilginize: auto_prepend_file yönergesinde belirtilerek dahil edilen dosyaların isimleri dönen dizide bulunmaz.
(PHP 4, PHP 5)
get_loaded_extensions — Derlenmiş ve yüklenmiş tüm modüllerin isimlerini içeren bir dizi döndürür
PHP yorumlayıcı içinde derlenmiş ve yüklenmiş tüm modüllerin isimlerini içeren bir dizi döndürür.
Öntanımlı değeri FALSE olup, bu durumda Zend eklentilerini listelemez.
Tüm modül isimlerini içeren indisli bir dizi ile döner.
| Sürüm: | Açıklama |
|---|---|
| 5.2.4 | Seçimlik zend_eklentileri değiştirgesi eklendi. |
Örnek 1 - get_loaded_extensions() örneği
<?php
print_r(get_loaded_extensions());
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array ( [0] => xml [1] => wddx [2] => standard [3] => session [4] => posix [5] => pgsql [6] => pcre [7] => gd [8] => ftp [9] => db [10] => calendar [11] => bcmath )
(PHP 4, PHP 5)
get_magic_quotes_gpc — magic_quotes_gpc yönergesinin değerini döndürür
magic_quotes_gpc yönergesinin değerini döndürür.
magic_quotes_gpc yönergesine çalışma anında değer atanamadığını unutmayın.
Sihirli tırnaklar hakkında daha ayrıntılı bilgi edinmek için güvenlik bölümüne bakınız.
magic_quotes_gpc yönergesinin değeri "off" ise 0, "on" ise 1 döner.
Örnek 1 - get_magic_quotes_gpc() örneği
<?php
echo get_magic_quotes_gpc(); // 1
echo $_POST['lastname']; // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}
echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')";
?>
Bilginize: Eğer magic_quotes_sybase yönergesinin değeri ON ise magic_quotes_gpc geçersiz olacaktır. Bu bakımdan, get_magic_quotes_gpc() TRUE döndürse bile ne çift tırnaklar ne tersbölüler ne de NULL değerler öncelenecektir. Bu durumda bunlar '' olarak görünecektir.
(PHP 4, PHP 5)
get_magic_quotes_runtime — magic_quotes_runtime yönergesinin çalışma anı değerini döndürür
magic_quotes_runtime yönergesinin çalışma anı değerini döndürür.
Sihirli tırnaklar çalışma anında etkinse 1 değilse 0 döndürür.
Örnek 1 - get_magic_quotes_runtime() örneği
<?php
// magic_quotes_runtime etkinse kapatalım
if(get_magic_quotes_runtime())
{
// Kapat
set_magic_quotes_runtime(false);
}
?>
(PHP 4, PHP 5)
getenv — Bir ortam değişkeninin değerini döndürür
Belirtilen ortam değişkeninin değerini döndürür.
Tüm ortam değişkenlerini phpinfo() işlevini kullanarak bir liste halinde görebilirsiniz. Bunların pek çoğunun anlamlarını » CGI belirtimi belgesinin özellikle » ortam değişkenleri ile ilgili sayfasında bulabilirsiniz.
Ortam değişkeninin ismi.
Bir hata oluşursa FALSE aksi takdirde değişken ile belirtilen ortam değişkeninin değerini döndürür.
Örnek 1 - getenv() örneği
<?php
// getenv() kullanım örneği
$ip = getenv('REMOTE_ADDR');
//Veya basitçe bir süper küresel kullan ($_SERVER veya $_ENV)
$ip = $_SERVER['REMOTE_ADDR'];
?>
(PHP 4, PHP 5)
getlastmod — Geçerli sayfanın son değişiklik zamanını döndürür
Geçerli sayfanın son değişiklik zamanını döndürür.
Başka bir dosyanın değişiklik zamanıyla ilgileniyorsanız filemtime() işlevine bakın.
Geçerli sayfanın son değişiklik zamanını date() işlevinde kullanılabilen bir Unix zaman damgası olarak döndürür. Hata oluşursa FALSE döner.
Örnek 1 - getlastmod() örneği
<?php
$fmt = datefmt_create("tr_TR", IntlDateFormatter::FULL,
IntlDateFormatter::FULL,'Europe/Istanbul',
IntlDateFormatter::GREGORIAN, "dd MMMM yyyy HH:mm:ss");
// Çıktısı: 'Son değişiklik: Son değişiklik: 13 Şubat 2009 14:10:09'
echo "Son değişiklik: " . datefmt_format ($fmt, getlastmod());
?>
(PHP 4 >= 4.1.0, PHP 5)
getmygid — PHP betiğinin sahibinin grup kimliğini döndürür
Betik sahibinin grup kimliğini döndürür.
Hata oluşursa FALSE, aksi takdirde betik sahibinin grup kimliğini döndürür.
(PHP 4, PHP 5)
getmyinode — Çalışan betiğin dosya düğümü numarasını döndürür
Çalışan betiğin dosya düğümü numarasını döndürür.
Hata oluşursa FALSE, aksi takdirde çalışan betiğin dosya düğümü numarasını bir tamsayı olarak döndürür.
(PHP 4, PHP 5)
getmypid — PHP'nin süreç kimliğini (PID) döndürür
PHP'nin süreç kimliğini döndürür.
Hata oluşursa FALSE, aksi takdirde PHP süreç kimliği döner.
Süreç kimlikleri eşsiz değildir, bu bakımdan güvenlikle ilgili konularda güvenilir değildir.
(PHP 4, PHP 5)
getmyuid — PHP betiğinin sahibinin kullanıcı kimliğini döndürür
Betik sahibinin kullanıcı kimliğini döndürür.
Hata oluşursa FALSE, aksi takdirde betik sahibinin kullanıcı kimliğini döndürür.
(PHP 4 >= 4.3.0, PHP 5)
getopt — Komut satırı değiştirgeleri listesinden seçenekleri döndürür
Betiğe aktarılan seçenekleri çözümler.
Bilginize: PHP 5.3.0 öncesinde bu değiştirge sadece bir kaç sistemde kullanılabiliyordu.
kısa_seçenekler değiştirgesi şu bileşenleri içerebilir:
Seçenek değerleri dizgeden sonraki ilk değiştirgedir. Bir değerin sonunda boşluk bulunup bulunmadığına bakılmaz.
Bilginize: İsteğe bağlı değerler bir ayraç olarak " " (boşluk) kabul etmezler.
Bilginize: kısa_seçenekler ve uzun_seçenekler için biçem hemen hemen aynıdır. Tek fark, birincisinin bir dizge (her karakter bir seçenek) ikincisinin bir dizi (her eleman bir seçenek) almasıdır.
Bu işlev başarısız olursa FALSE, aksi takdirde seçenek / değiştirge çiftlerini içeren bir dizi döndürür.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | Değiştirge/değer ayracı olarak "=" desteği eklendi. |
| 5.3.0 | İsteğe bağlı değerler için destek eklendi ("::" ile belirtilir). |
| 5.3.0 | İşlev sisteme bağlı olmaktan çıktı. Artık Windows üzerinde de çalışmaktadır. |
Örnek 1 - getopt() örneği - 1
<?php
$options = getopt("f:hp:");
var_dump($options);
?>
Yukarıdaki betik php betik.php -fdeğer -h komut satırı için aşağıdaki çıktıyı üretir:
array(2) {
["f"]=>
string(5) "değer"
["h"]=>
bool(false)
}
Örnek 2 - getopt() örneği - 2
<?php
$kısalar = "";
$kısalar .= "f:"; // Değer, zorunlu
$kısalar .= "v::"; // Değer, seçimlik
$kısalar .= "abc"; // Bunlar değer kabul etmez
$uzunlar = array(
"gerekli:", // Değer, zorunlu
"seçimlik::", // Değer, seçimlik
"seçenek", // Değer kabul etmez
"sçnk", // Değer kabul etmez
);
$seçenekler = getopt($kısalar, $uzunlar);
var_dump($seçenekler);
?>
Yukarıdaki betik php betik.php -f "f değeri" -v -a --gerekli değer --seçimlik="seçimlik değer" --seçenek komut satırı için aşağıdaki çıktıyı üretir:
array(6) {
["f"]=>
string(9) "f değeri"
["v"]=>
bool(false)
["a"]=>
bool(false)
["gerekli"]=>
string(6) "değer"
["seçimlik"]=>
string(16) "seçimlik değer"
["seçenek"]=>
bool(false)
}
Örnek 3 - getopt() örneği - 3
Çok sayıda seçeneğin tek bir seçenek olarak verilmesi:
<?php
$options = getopt("abc");
var_dump($options);
?>
Yukarıdaki betik php betik.php -aaac komut satırı için aşağıdaki çıktıyı üretir:
array(2) {
["a"]=>
array(3) {
[0]=>
bool(false)
[1]=>
bool(false)
[2]=>
bool(false)
}
["c"]=>
bool(false)
}
(PHP 4, PHP 5)
getrusage — Geçerli özkaynak kullanımlarını döndürür
getrusage(2) için bir arayüz olup sistem çağırısından dönen veriyi döndürür.
1 belirtilirse işlev RUSAGE_CHILDREN ile çağrılır.
Sistem çağrısından dönen veriyi içeren bir ilişkisel dizi döner. Tüm girdilere belgelenmiş alan isimleri kullanılarak erişilebilir.
Örnek 1 - getrusage() örneği
<?php
$dat = getrusage();
echo $dat["ru_nswap"]; // takas alanlarının sayısı
echo $dat["ru_majflt"]; // sayfa hatalarının sayısı
echo $dat["ru_utime.tv_sec"]; // kullanılan kullanıcı zamanı (saniye)
echo $dat["ru_utime.tv_usec"]; // kullanılan kullanıcı zamanı (mikrosaniye)
?>
Bilginize: Bu işlev Windows sistemlerinde çalışmaz.
(PHP 4 >= 4.2.0, PHP 5)
ini_get_all — Tüm yapılandırma yönergelerini döndürür
Kayıtlı yapılandırma seçeneklerinin hepsini değerleriyle döndürür.
İsteğe bağlı olarak bir eklenti ismi. Belirtildiği takdirde sadece bu eklentiye özgü yönergeler döndürülür.
Ya her ayarın geçerli değeri ya da her ayarın ayrıntılı değerleri döndürülür. Öntanımlı olan TRUE değeri ayrıntılı bir çıktı üretir.
Yönerge isimlerinin dizinin anahtarları olduğu bir dizi döner.
ayrıntılı değiştirgesi TRUE (öntanımlı) olduğu takdirde dizinin her elemanı, anahtarları global_value (php.ini'de atanmış değer), local_value (ini_set() veya .htaccess üzerinden atanmış değer), ve access (erişim seviyesi) olan bir alt dizi içerir.
ayrıntılı değiştirgesi FALSE olduğu takdirde her elemanın değeri sadece yönergenin geçerli değerini içerecektir.
Bilginize: Bir yönergenin, access anahtarı altında bir bit maskesi değeri olarak çok sayıda erişim seviyesine sahip olması mümkündür.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | ayrıntılı değiştirgesi eklendi. |
Örnek 1 - ini_get_all() örnekleri
<?php
print_r(ini_get_all("pcre"));
print_r(ini_get_all());
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[pcre.backtrack_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
[pcre.recursion_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
)
Array
(
[allow_call_time_pass_reference] => Array
(
[global_value] => 0
[local_value] => 0
[access] => 6
)
[allow_url_fopen] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 4
)
...
)
Örnek 2 - Ayrıntısız listeleme
<?php
print_r(ini_get_all("pcre", false)); // PHP 5.3.0'dan itibaren
print_r(ini_get_all(null, false)); // PHP 5.3.0'dan itibaren
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[pcre.backtrack_limit] => 100000
[pcre.recursion_limit] => 100000
)
Array
(
[allow_call_time_pass_reference] => 0
[allow_url_fopen] => 1
...
)
(PHP 4, PHP 5)
ini_get — Bir yapılandırma yönergesinin değerini döndürür
Belirtilen yapılandırma yönergesinin değerini döndürür.
yapılandırma yönergesinin ismi.
Başarısızlık durumunda ve NULL değerler için boş bir dizge, aksi takdirde yapılandırma yönergesinin değeri ile döner.
Örnek 1 - ini_get() örnekleri
<?php
/*
php.ini dosyamız şu ayarları içeriyor:
display_errors = On
register_globals = Off
post_max_size = 8M
*/
echo 'display_errors = ' . ini_get('display_errors') . "\n";
echo 'register_globals = ' . ini_get('register_globals') . "\n";
echo 'post_max_size = ' . ini_get('post_max_size') . "\n";
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "\n";
echo 'post_max_size (bayt olarak) = ' . return_bytes(ini_get('post_max_size'));
function return_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// 'G' birimi PHP 5.1.0 sürümünden beri var.
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
display_errors = 1 register_globals = 0 post_max_size = 8M post_max_size+1 = 9 post_max_size (bayt olarak) = 8388608
Bilginize: Mantıksal değerleri sorgularken
Bir mantıksal ini değeri olarak off, boş bir dizge veya "0" olarak dönerken, on değeri "1" olarak dönecektir. Bu işlev ayrıca yönergenin değerini birebir dizge olarak da döndürebilir.
Bilginize: Bellek miktarı değerlerini sorgularken
upload_max_filesize yönergesinde olduğu gibi pek çok bellek miktarı değeri, php.ini dosyasında kısa gösterimleriyle saklanabilir. ini_get() işlevi, yönergenin değeri olarak değerin tamsayı karşılığını değil, php.ini dosyasında saklandığı haliyle dizge değerini döndürür. Bu bakımdan, bu değer üzerindeki aritmetik işlemler beklenen sonuçları vermeyebilir. Yukarıdaki örnekte, kısa gösterimi bayt cinsinden bir değere dönüştürmenin yolu gösterilmektedir.
(PHP 4, PHP 5)
ini_restore — Bir yapılandırma yönergesine eski değerini atar
Belirtilen yapılandırma yönergesine eski değeri atanır.
Yönergenin ismi.
Hiçbir değer dönmez.
Örnek 1 - ini_restore() örneği
<?php
$setting = 'y2k_compliance';
echo '\'' . $setting . '\' yönergesinin şu anki değeri: ' . ini_get($setting), PHP_EOL;
ini_set($setting, ini_get($setting) ? 0 : 1);
echo '\'' . $setting . '\' yönergesinin yeni değeri: ' . ini_get($setting), PHP_EOL;
ini_restore($setting);
echo '\'' . $setting . '\' yönergesinin özgün değeri: ' . ini_get($setting), PHP_EOL;
?>
Yukarıdaki örneğin çıktısı:
'y2k_compliance' yönergesinin şu anki değeri: 1 'y2k_compliance' yönergesinin yeni değeri: 0 'y2k_compliance' yönergesinin özgün değeri: 1
(PHP 4, PHP 5)
ini_set — Bir yapılandırma yönergesine değer atar
Belirtilen yapılandırma yönergesine belirtilen değeri atar. Bu ayarlama betiğinizin çalışma süresince geçerli kalır, betik sonlandığında eski değer geçerli olur.
ini_set() işlevi ile tüm yapılandırma yönergelerine değer atanamaz. Mevcut yapılandırma yönergelerinin listesini eklerde bulabilirsiniz.
Yönergeye atanacak yeni değer.
Atama işlemi başarılı olursa eski değer, aksi takdirde FALSE döner.
Örnek 1 - Bir INI yönergesine değer atamak
<?php
echo ini_get('display_errors');
if (!ini_get('display_errors')) {
ini_set('display_errors', 1);
}
echo ini_get('display_errors');
?>
main — Böyle bir işlev yoktur
PHP kaynak kodunun main() işlevinden başka main() işlevi yoktur. PHP 4.3.0 sürümünde PHP kaynak kodunda yeni bir hata eylemci türü (php_error_docref) devreye girdi. html_errors (öntanımlı olarak 'On') ve docref_root (PHP 4.3.2'ye kadar öntanımlı olarak 'On') yapılandırma yönergelerine 'On' atandığı takdirde, bu özellik, PHP hata iletilerinde bir kılavuz sayfasına atıfta bulunmayı sağlamaktadır.
Bazı hata iletilerinde, bu sayfanın mevcudiyet sebebi olarak, main() işlevi için bir kılavuz sayfasına atıf yapılır. Bir PHP işlevinde main() işlevi ile ilişkili olarak bir hata alırsanız lütfen bunun için » bir hata raporu oluşturun. Bu hata giderilecek ve gerektiği gibi belgelenecektir.
| İşlev ismi | Hatanın artık görülmediği sürüm |
|---|---|
| include() | 5.1.0 |
| include_once() | 5.1.0 |
| require() | 5.1.0 |
| require_once() | 5.1.0 |
(PHP 5 >= 5.2.0)
memory_get_peak_usage — PHP'ye ayrılan belleğin azami miktarını döndürür
PHP betiğinize ayrılan azami belleğin bayt cinsinden miktarını döndürür.
TRUE olduğu takdirde sistem tarafından PHP'ye ayrılan gerçek bellek miktarı, FALSE olduğunda veya değiştirge belirtilmediğinde emalloc() tarafından kullanılan bellek miktarı raporlanır.
Ayrılan azami belleğin bayt cinsinden miktarı.
| Sürüm: | Açıklama |
|---|---|
| 5.2.1 | Bu işlevin kullanılabilmesi için derleme sırasında --enable-memory-limit seçeneğini belirtme ihtiyacı ortadan kalktı. |
| 5.2.0 | real_usage değiştirgesi eklendi. |
(PHP 4 >= 4.3.2, PHP 5)
memory_get_usage — PHP'ye ayrılan belleğin miktarını döndürür
PHP betiğinize ayrılan belleğin bayt cinsinden miktarını döndürür.
TRUE olduğu takdirde sistem tarafından PHP'ye ayrılan gerçek bellek miktarı, FALSE olduğunda veya değiştirge belirtilmediğinde emalloc() tarafından kullanılan bellek miktarı raporlanır.
Ayrılan belleğin bayt cinsinden miktarı.
| Sürüm: | Açıklama |
|---|---|
| 5.2.1 | Bu işlevin kullanılabilmesi için derleme sırasında --enable-memory-limit seçeneğini belirtme ihtiyacı ortadan kalktı. |
| 5.2.0 | gerçek_kullanım değiştirgesi eklendi. |
Örnek 1 - memory_get_usage() örneği
<?php
// Bu sadece bir örnektir.
// Miktarlar, sisteminizde farklı olabilir.
echo memory_get_usage() . "\n"; // 36640
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; // 57960
unset($a);
echo memory_get_usage() . "\n"; // 36744
?>
(PHP 5 >= 5.2.4)
php_ini_loaded_file — Yüklü php.ini dosyasının dosya yolunu döndürür
Bir php.ini dosyası yüklü mü diye bakar ve dosyanın yolunu döndürür.
Bu işlevin değiştirgesi yoktur.
php.ini yüklüyse dosyanın yolu, değilse FALSE döner.
Örnek 1 - php_ini_loaded_file() örneği
<?php
$inipath = php_ini_loaded_file();
if ($inipath) {
echo 'Yüklü php.ini: ' . $inipath;
} else {
echo 'Bir php.ini dosyası yüklü değil';
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Yüklü php.ini: /usr/local/php/php.ini
(PHP 4 >= 4.3.0, PHP 5)
php_ini_scanned_files — Ek ini dizininden ayrıştırılan dosyaların listesi ile döner
php_ini_scanned_files() işlevi php.ini dosyasından sonra ayrıştırılan yapılandırma dosyalarını bir virgül ayraçlı liste olarak döndürür. Bu dosyalar, derleme sırasında --with-config-file-scan-dir seçeneği tarafından tanımlanan bir dizinde bulunur.
Döndürülen yapılandırma dosyaları --with-config-file-scan-dir seçeneğinde bildirilen yolu da içerir.
Başarı durumunda .ini dosyalarının virgül ayraçlı listesini bir dizge olarak döndürür. Derleme sırasında --with-config-file-scan-dir seçeneği kullanılmamışsa FALSE döner. Seçenek kullanılmışsa fakat dizin boşsa bir boş dizge döner. INI dosyası olmayan bir dosyanın varlığı halinde dosya ismi listeye konur, fakat ek olarak bir PHP hatası çıktılanır. Bu PHP hatası hem derleme sırasında hem de php_ini_scanned_files() işlevi kullanıldığında görüntülenir.
Örnek 1 - Dönen ini dosyalarının listelenmesi
<?php
if ($filelist = php_ini_scanned_files()) {
if (strlen($filelist) > 0) {
$files = explode(',', $filelist);
foreach ($files as $file) {
echo "<li>" . trim($file) . "</li>\n";
}
}
}
?>
(PHP 4, PHP 5)
php_logo_guid — PHP logo kimliğini döndürür
Bu işlev, yerleşik resmi kullanarak PHP logosunu göstermekte kullanılacak kimliği döndürür. Logonunu gösterilip gösterilmeyeceğini expose_php yönergesi belirler.
PHPE9568F34-D428-11d2-A769-00AA001ACF42 döner.
Örnek 1 - php_logo_guid() örneği
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . php_logo_guid() . '" alt="PHP Logo !" />';
?>
(PHP 4 >= 4.0.1, PHP 5)
php_sapi_name — HTTP sunucusu ile PHP arasındaki arayüzün türünü döndürür
PHP'nin kullandığı arayüz (Sunucu API'si, SAPI) türünü belirten küçük harfli bir dizge döndürür. Örneğin CLI PHP için bu dizge "cli" olurken Apache ile kullanılan API'ye bağlı olarak değişiklik gösteribilir. Olası değerler aşağıda listelenmiştir.
Arayüz türünü küçük harfli bir dizge olarak döndürür.
Tamamı olmasa da olası değerler şunlardır: aolserver, apache, apache2filter, apache2handler, caudium, cgi (PHP 5.3'ten beri), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux ve webjames.
Örnek 1 - php_sapi_name() örneği
Bu örnektecgi-fcgi değerini de kapsayan cgi alt dizgesinin varlığı aranmaktadır.
<?php
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "CGI PHP kullanıyorsunuz\n";
} else {
echo "CGI PHP kullanmıyorsunuz\n";
}
?>
Bilginize: Başka bir yaklaşım
PHP sabiti PHP_SAPI, php_sapi_name() işlevinden dönen değerin aynını içerir.
Tanımlı SAPI her zaman apaçık belli değildir. Apache örneğindeki gibi apache2handler veya apache2filter olarak tanımlanmış olabilir.
(PHP 4 >= 4.0.2, PHP 5)
php_uname — PHP'nin çalıştığı işletim sistemi hakkında bilgi döndürür
php_uname() işlevi PHP'nin üzerinde çalıştığı işletim sistemi hakkında bilgi döndürür. Bu bilgiyi phpinfo() çıktısının üst satırlarında da görebilirsiniz. İşletim sisteminin sadece ismini öğrenmek isterseniz PHP_OS sabitini kullanabilirsiniz; fakat bu sabiti kullanırken, sabitin, PHP'nin derlendiği işletim sistemi adını içereceğini unutmayın.
Bazı eski Unix sürümlerinde, üzerinde çalışılan işletim sistemi saptanamaz ve PHP üzerinde derlendiği işletim sistemi bilgisi gösterilir. Buna genellikle uname() kütüphane çağrısının mevcut olmadığı veya çalışmadığı sistemlerde rastlanır.
kip döndürülecek bilgi çeşidini belirtmek için kullanılan tek bir karakter içerebilir. Olası değerler:
Bilgiyi bir dizge olarak döndürür.
Örnek 1 - php_uname() örnekleri
<?php
echo php_uname();
echo PHP_OS;
/* Bazı olası çıktılar:
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
Linux
FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD
Windows NT XN1 5.1 build 2600
WINNT
*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'Bu sunucu Windows üzerinde!';
} else {
echo 'Bu sunucu Windows üzerinde değil!';
}
?>
İşinizi yarayacak bazı öntanımlı PHP sabitleri vardır. Örneğin:
Örnek 2 - İşletim sistemine göre bazı sabit örnekleri
<?php
// *nix
echo DIRECTORY_SEPARATOR; // /
echo PHP_SHLIB_SUFFIX; // so
echo PATH_SEPARATOR; // :
// Win*
echo DIRECTORY_SEPARATOR; // \
echo PHP_SHLIB_SUFFIX; // dll
echo PATH_SEPARATOR; // ;
?>
(PHP 4, PHP 5)
phpcredits — PHP'ya katkıda bulunanları gösterir
PHP ve eklenti geliştiricilerinin listesini basar. Uygun HTML kodlarını üretip içine bu bilgiyi yerleştirir.
Bu değiştirgeyi sayfayı özelleştirmek için kullanabilirsiniz. Değiştirge isteğe bağlıdır ve CREDITS_ALL öntanımlıdır.
| Seçenek | Açıklama |
|---|---|
| CREDITS_ALL | Tüm katkıcılar. CREDITS_DOCS, CREDITS_GENERAL, CREDITS_GROUP, CREDITS_MODULES ve CREDITS_FULLPAGE seçeneklerinin tamamına eşdeğerdir. Uygun başlıklarla tek bir HTML sayfası üretilir. |
| CREDITS_DOCS | Belgelendirme ekibi. |
| CREDITS_FULLPAGE | Diğer seçeneklerin çıktılarının birleşiminden oluşan tek bir HTML sayfası üretilir. |
| CREDITS_GENERAL | Genel katkıcılar: Dil tasarımı ve kavramlar, PHP 4.0 ve SAPI modülünün yazarları. |
| CREDITS_GROUP | Çekirdek geliştiricilerin listesi |
| CREDITS_MODULES | Eklenti modüllerinin ve yazarlarının listesi. |
| CREDITS_SAPI | Sunucu API modüllerinin ve yazarlarının listesi. |
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - Genel katkıcıların listelenmesi
<?php
phpcredits(CREDITS_GENERAL);
?>
Örnek 2 - Çekirdek geliştiricilerin ve belgelendirme ekibinin listelenmesi
<?php
phpcredits(CREDITS_GROUP + CREDITS_DOCS + CREDITS_FULLPAGE);
?>
Örnek 3 - Tüm katkıcıların listelenmesi
<html>
<head>
<title>Katılımcılar</title>
</head>
<body>
<?php
// bazı kodlar
phpcredits(CREDITS_ALL - CREDITS_FULLPAGE);
// bazı kodlar
?>
</body>
</html>
(PHP 4, PHP 5)
phpinfo — PHP'nin o anki durumu hakkında büyük miktarda bilgi çıktılar
PHP'nin o anki durumu hakkında büyük miktarda bilgi çıktılar. Bu bilgi, PHP derleme seçenekleri, kurulu eklentiler, PHP sürümü, sunucu bilgisi, (PHP bir modül olarak derlenmişse) sunucu ortam değişkenleri, PHP ortam değişkenleri, işletim sistemi sürüm bilgileri, dosya yolları, asıl ve yerel yapılandırma seçenekleri, HTTP başlıkları ve PHP lisansını içerir.
Her sistemin yapılandırması farklı olduğundan phpinfo() işlevi genellikle, yapılandırma ayarlarını ve kullanılabilecek öntanımlı değişkenleri öğrenmek için kullanılır.
phpinfo() tüm EGPCS (Environment, GET, POST, Cookie, Server) verisini içerdiğinden ayrıca değerli bir hata ayıklama aracıdır.
İsteğe bağlı bu değiştirgede aşağıdaki sabitlerin bitsel değerlerinin toplamı belirtilerek işlevin çıktısı özelleştirilebilir. Bu sabitleri veya bitsel değerlerini VEYA işleci ile birleştirerek belirtebilirsiniz.
| Sabit | Değer | Açıklama |
|---|---|---|
| INFO_GENERAL | 1 | Yapılandırma satırı, php.ini dosyasının yeri, derleme tarihi, HTTP Sunucusu, Sistem, vesaire. |
| INFO_CREDITS | 2 | PHP'ye katkıda bulunanlar. Ayrıca, phpcredits() işlevine de bakınız. |
| INFO_CONFIGURATION | 4 | PHP yönergelerinin asıl ve yerel değerleri. Ayrıca ini_get() işlevine de bakınız. |
| INFO_MODULES | 8 | Yüklü modüller ve binlerğn ayarları. Ayrıca get_loaded_extensions() işlevine de bakınız. |
| INFO_ENVIRONMENT | 16 | $_ENV dizisi ile de edinilebilen ortam değişkenleri bilgileri. |
| INFO_VARIABLES | 32 | EGPCS (Environment, GET, POST, Cookie, Server) verisinden elde edilen tüm öntanımlı değişkenler. |
| INFO_LICENSE | 64 | PHP Lisans bilgileri. Ayıca bakınız: » Lisans SSS. |
| INFO_ALL | -1 | Yukarıdakiler hepsi gösterilir. Bu öntanımlı değerdir. |
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
| Sürüm: | Açıklama |
|---|---|
| 5.2.2 | "Loaded Configuration File" başlığı altında yüklü yapılandırma dosyası bilgi eklendi. Evvelce sadece "Configuration File (php.ini) Path" başlığı altında yapılandırma dosyasının yolu bulunurdu. |
Örnek 1 - phpinfo() örneği
<?php
// Tüm bilgiyi gösterelim (INFO_ALL sabitine eşdeğer)
phpinfo();
// Sadece modül bilgisini gösterelim.
// phpinfo(8) de aynı sonucu verir.
phpinfo(INFO_MODULES);
?>
Bilginize: Parts of the information displayed are disabled when the expose_php yapılandırma seçeneğine off atanmışsa bazı bilgiler gösterilmez. PHP ve Zend logoları ve katkıcılar bunlardan bazılarıdır.
Bilginize: PHP'yi komut satırından kullanıyorsanız phpinfo() işlevi HTML çıktı yerine düz metin çıktı verir.
(PHP 4, PHP 5)
phpversion — Çalışan PHP'nin sürümünü döndürür
Çalışan PHP'nin veya belirtilen eklentinin sürüm numarasını bir dizge olarak döndürür.
İsteğe bağlı bir eklenti ismi.
İsteğe bağlı eklenti değiştirgesi belirtilmişse işlev bu eklentinin sürüm bilgisini döndürür. Eklenti ile ilgili bir sürüm bilgisi yoksa veya eklenti etkin değilse FALSE döner.
Örnek 1 - phpversion() örneği
<?php
// prints e.g. 'Current PHP version: 4.1.1'
echo 'Çalışan PHP\'nin sürümü: ' . phpversion();
// eklenti etkinse '2.0' gibi bir değer basar
// eklenti etkin değilse hiçbir şey basılmaz
echo phpversion('tidy');
?>
Örnek 2 - PHP_VERSION_ID örneği
<?php
// PHP_VERSION_ID, PHP 5.2.7'den beri kullanılabilmektedir.
// Kullandığınız sürüm daha düşükse taklit edin
if(!defined('PHP_VERSION_ID'))
{
$version = explode('.',PHP_VERSION);
define('PHP_VERSION_ID',
($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
// PHP_VERSION_ID bir sayı olarak tanımlanır. PHP sürümü yükseldikçe
// sayı büyür. Şu ifade ile tanımlanır:
//
// $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
//
// Artık PHP sürümlerinin özellikleri için PHP_VERSION_ID'ye bakabiliriz.
// Kullandığınız PHP sürümü bir özelliği desteklemezse version_compare()
// kullanmanız gerekmez. Örneğin 5.2.7 öncesi sürümlerden birini
// kullanıyorsanız PHP_VERSION_* sabitlerini şöyle tanımlayabilirsiniz:
if(PHP_VERSION_ID < 50207)
{
define('PHP_MAJOR_VERSION', $version[0]);
define('PHP_MINOR_VERSION', $version[1]);
define('PHP_RELEASE_VERSION', $version[2]);
// ve böyle gider, ...
}
?>
Bilginize: Bu bilgi ayrıca PHP_VERSION öntanımlı sabitinde de bulunur.
(PHP 4, PHP 5)
putenv — Bir ortam değişkenine değer atar
atama_dizgesi 'ni sunucu ortamına ekler. Yeni ortam değişkeni sadece o anki istek için istek süresince geçerli olacaktır. İstek sunumunun sonunda ortam özgün durumuna getirilir.
Belli ortam değişkenlerinin atanması bir güvenlik sorunun ortaya çıkma ihtimalini arttırır. safe_mode_allowed_env_vars yönergesi virgül ayraçlı bir önekler listesi içerir. Güvenli kipte kullanıcı sadece bu yönergede belirtilen öneklerden biriyle başlayan ortam değişkenlerini değiştirebilir. Öntanımlı olarak, kullanıcılar sadece PHP_ önekiyle başlayan (PHP_FOO=BAR gibi) ortam değişkenlerine değer atayabilirler. Dikkat: Eğer yönergeye değer olarak boş bir dizge atanmışsa kullanıcı her ortam değişkenine değer atayabilir!
safe_mode_protected_env_vars yönergesi, kullanıcının putenv() işlevini kullanarak değiştiremeyeceği ortam değişkenlerinin virgül ayraçlı listesini içerir. safe_mode_allowed_env_vars yönergesinde belirtilen önekler safe_mode_protected_env_vars yönergesinde belirtilen ortam değişkenlerine uysa bile bu ortam değişkenlerine putenv() ile değer atanamaz.
"FOO=BAR" gibi bir atama dizgesi.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - Bir ortam değişkeninin atanması
<?php
putenv("UNIQID=$uniqid");
?>
Bu yönergeler sadece güvenli kip etkinken geçerlidir!
(PHP 4 >= 4.3.0, PHP 5)
restore_include_path — include_path yönergesini eski değerine ayarlar
include_path yönergesinin çalışma anı değerini tekrar php.ini dosyasında belirtilen değerine ayarlar.
Hiçbir değer dönmez.
Örnek 1 - restore_include_path() örneği
<?php
echo get_include_path(); // .:/usr/local/lib/php
set_include_path('/inc');
echo get_include_path(); // /inc
// PHP 4.3.0 ve sonrasında çalışır
restore_include_path();
// Bütün PHP sürümlerinde çalışır
ini_restore('include_path');
echo get_include_path(); // .:/usr/local/lib/php
?>
(PHP 4 >= 4.3.0, PHP 5)
set_include_path — include_path yönergesinin çalışma anı değerini belirler
include_path yönergesinin, betiğin çalışma süresince geçerli olacak değerini belirler.
Başarısızlık durumunda FALSE, aksi takdirde include_path yönergesinin eski değeriyle döner.
Örnek 1 - set_include_path() örneği
<?php
// PHP 4.3.0 ve sonrasında çalışır
set_include_path('/inc');
// PHP'nin tüm sürümlerinde çalışır
ini_set('include_path', '/inc');
?>
Örnek 2 - İçerilecek dosyaların aranacağı yollara bir yenisini eklemek
PATH_SEPARATOR sabitini kullanarak bu yolları işletim sisteminden bağımsız olarak çoğaltmak mümkündür.
Bu örnekte, include_path yönergesinde belirtilen dosya yollarına /usr/lib/pear dizinini ekleyeceğiz.
<?php
$path = '/usr/lib/pear';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
?>
(PHP 4, PHP 5)
set_magic_quotes_runtime — magic_quotes_runtime yönergesinin çalışma anı değerini belirler
magic_quotes_runtime yönergesinin çalışma anı değerini belirler.
Bu işlevin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu işleve kesinlikle güvenmemelisiniz.
Off için FALSE. On için TRUE olmalıdır.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - set_magic_quotes_runtime() örneği
<?php
// Geçici bir dosya tanıtıcısı oluşturalım
$fp = tmpfile();
// Biraz veri yazalım
fwrite($fp, '\'PHP\' ardışık bir kısaltmadır');
// magic_quotes_runtime olmaksızın
rewind($fp);
set_magic_quotes_runtime(false);
echo 'magic_quotes_runtime olmaksızın: ' . fread($fp, 64), PHP_EOL;
// magic_quotes_runtime ile
rewind($fp);
set_magic_quotes_runtime(true);
echo 'magic_quotes_runtime ile: ' . fread($fp, 64), PHP_EOL;
// Ortalığı temizleyelim
fclose($fp);
?>
Yukarıdaki örneğin çıktısı:
magic_quotes_runtime olmaksızın: 'PHP' ardışık bir kısaltmadır magic_quotes_runtime ile: \'PHP\' ardışık bir kısaltmadır
(PHP 4, PHP 5)
set_time_limit — Azami çalıştırma süresini sınırlar
Bir betiğin çalıştırılabileceği süreyi saniye cinsinden belirler. Bu süre aşıldığında betik ölümcül hata ile döner. php.ini dosyasında max_execution_time yönergesi ile başka bir değer belirtilmemişse öntanımlı süre 30 saniyedir.
set_time_limit() işlevi çağrıldığı anda süre sıfırdan başlatılır. Başka bir deyişle, betik örneğin 30 saniyelik öntanımlı zaman aşımı dahilinde 25 saniye çalıştıktan sonra set_time_limit(20) çağrısı yapılırsa süre bitiminde betik 45 saniye çalışmış olacaktır.
Betiğin çalıştırılabileceği azami süre (saniye cinsinden). Sıfır belirtilirse bir zaman sınırlaması kaldırılmış olur.
Hiçbir değer dönmez.
PHP güvenli kipte (safe_mode) çalışıyorsa bu işlevin bir etkisi olmaz.
Azami süreyi değiştirmek için php.ini dosyasında güvenli kipi iptal
etmek veya azami süreyi php.ini dosyasında değiştirmekten başka çare
yoktur.
Bilginize: max_execution_time yönergesi veya set_time_limit() işlevi sadece betiğin kendi çalışma süresini etkilerler. Betiğin çalışması sırasında, akım işlemleri, veritabanı sorguları ve system() işlevi kullanılarak yapılan sistem çağrıları gibi betiğin dışında gerçekleşen işlemler için harcanan zaman betiğin azami çalışma süresinin hesaplanmasında hesaba katılmaz. Gerçek zamanın ölçüldüğü Windows üzerinde bu geçerli değildir.
(PHP 5 >= 5.2.1)
sys_get_temp_dir — Geçici dosyalar için kullanılan dizini döndürür
PHP'nin geçici dosyaları sakladığı öntanımlı dizinin tam yolunu döndürür.
Geçici dosyaların saklandığı dizinin tam yolunu döndürür.
Örnek 1 - sys_get_temp_dir() örneği
<?php
// sys_get_temp_dir() kullanarak geçici dosyaların
// tutulduğu dizinde bir geçici dosya oluşturalım
$temp_file = tempnam(sys_get_temp_dir(), 'Tux');
echo $temp_file;
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
C:\Windows\Temp\TuxA318.tmp
(PHP 4 >= 4.1.0, PHP 5)
version_compare — PHP standardına uygun hale getirilmiş iki sürüm numarası dizgesini karşılaştırır
version_compare() işlevi PHP standardına uygun hale getirilmiş iki sürüm numarası dizgesini karşılaştırır. PHP'nin sadece belli bir sürümü ile çalışabilecek betikler yazıyorsanız bu işleve ihtiyacınız olacaktır.
İşlev önce _, - ve + karakterlerini birer nokta . ile değiştirir, ardından numara olmayan dizgeciklerin önüne ve ardına birer nokta konur. Örneğin, '4.3.2RC1' dizgesi '4.3.2.RC.1' haline gelir. Elde edilen dizge, explode('.', $sürüm) kullanılmışçasına bileşenlerine ayrıldıktan sonra her bileşen soldan sağa karşılaştırılır. Bileşenlerin içerdiği özel sürüm dizgeleri şu sıralamaya göre ele alınırlar: bu listede olmayan bir dizge < dev < alpha = a < beta = b < RC = rc < # < pl = p. Bu yöntemle, '4.1' ve '4.1.2' gibi farklı seviyelerden sürümler karşılaştırabileceği gibi geliştirme sürümlerinin karşılaştırılması için de kullanılabilir.
İlk sürüm numarası.
İkinci sürüm numarası.
İsteğe bağlı bu değiştirge ile sürümler arasında belli ilişkileri sınayabilirsiniz. Olası işleçler şunlardır: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne.
Bu değiştirge harf büyüklüğüne duyarlıdır, yani değerlerin hepsi küçük harfli olmalıdır.
Öntanımlı olarak, version_compare() işlevi, birinci sürüm ikincisinden küçükse -1, büyükse 1, eşitlerse 0 döndürür.
İsteğe bağlı işleç değiştirgesi kullanılırsa ve sürümler arasında belirtilen ilişki varsa TRUE aksi takdirde FALSE döner.
Aşağıdaki örnekte, kodu çalıştıran PHP sürümüne içermesi nedeniyle PHP_VERSION sabiti kullanılmıştır.
Örnek 1 - version_compare() örnekleri
<?php
if (version_compare(PHP_VERSION, '6.0.0') === 1) {
echo 'PHP sürümüm en azından 6.0.0, gerçek sürüm: ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.3.0') === 1) {
echo 'PHP sürümüm en azından 5.3.0, gerçek sürüm: ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '>')) {
echo 'PHP 5 kullanıyorum, gerçek sürüm: ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '<')) {
echo 'PHP 4 kullanıyorum, gerçek sürüm: ' . PHP_VERSION . "\n";
}
?>
Bilginize: PHP_VERSION sabiti kullanılan PHP'nin sürüm numarasını içerir.
Bilginize: 5.3.0-dev gibi ön dağıtım sürümleri için, alt sürümün, ulaşacakları asıl sürümün numarası (PHP 5.3.0) olduğu varsayılır.
(PHP 4, PHP 5)
zend_logo_guid — Zend logo kimliğini döndürür
Bu işlev, yerleşik resmi kullanarak Zend logosunu göstermekte kullanılacak kimliği döndürür.
PHPE9568F35-D428-11d2-A769-00AA001ACF42 dizgesini döndürür.
Örnek 1 zend_logo_guid() örneği
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . zend_logo_guid() . '" alt="Zend Logo!" />';
?>
(PHP 5)
zend_thread_id — Geçerli evre için eşsiz bir betimleyici döndürür
Bu işlev geçerli evre için eşsiz bir betimleyici döndürür.
Evre kimliğini bir tamsayı olarak döndürür.
Örnek 1 - zend_thread_id() örneği
<?php
$thread_id = zend_thread_id();
echo 'Evre kimliği: ' . $thread_id;
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Evre kimliği: 7864
Bilginize: Bu işlev, PHP, ZTS (Zend Thread Safety) desteği ve hata ayıklama kipi (--enable-debug) ile derlendiği takdirde kullanılabilir.
(PHP 4, PHP 5)
zend_version — Zend motorunun sürümünü döndürür
Kurulu Zend Motorunun sürümünü içeren bir dizge döndürür.
Zend Motorunun sürüm numarasını bir dizge olarak döndürür.
Örnek 1 - zend_version() örneği
<?php
echo "Zend motorunun sürümü: " . zend_version();
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Zend motorunun sürümü: 2.3.0
The purpose of this extension is to detect the most memory hungry scripts and functions.
memtrack tracks memory consumption in PHP scripts and produces reports (warnings) when the consumption reaches certain levels set by the user. This is achieved by replacing default executor function by a special function which compares memory usage before and after running the original executor - this way we can tell how much the memory usage has changed during the execution of the current part of the code.
Zend Engine runs its executor for each opcode array (op_array), which usually means function, plain script and such, so memtrack doesn't have any noticeable effect on performance.
memtrack doesn't provide any functions, there are only INI directives which allow you to configure the way it should work.
Bu eklenti DENEYSELDİR. Bu eklentinin davranışı, işlev isimleri ve tüm belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu eklentiyi kullanmayın.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/memtrack
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| Name | Default | Changeable |
|---|---|---|
| memtrack.enabled | "0" | PHP_INI_SYSTEM |
| memtrack.soft_limit | "0" | PHP_INI_ALL |
| memtrack.hard_limit | "0" | PHP_INI_ALL |
| memtrack.vm_limit | "0" | PHP_INI_ALL |
| memtrack.ignore_functions | "" | PHP_INI_SYSTEM |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Disables or enables the extension. Default value is 0, i.e. disabled.
Soft memory limit.
The extension checks memory consumption before and after executing an op_array and produces a warning is the difference between the two values is equal to or greater than the soft limit, but only if the function is not ignored.
Setting this option to 0 also disables both soft and hard limit warnings. Default value is 0, i.e. no warnings is produced.
Hard memory limit.
The extension checks memory consumption before and after executing an op_array and produces a warning is the difference between the two values is equal to or greater than the hard limit, even if the function is ignored. Setting this option to 0 disables hard limit warnings completely. Default value is 0, i.e. no hard limit warnings is produced.
Virtual memory limit (set on a process).
This limit is checked only on shutdown and a warning is produced if the value is greater than or equal to the limit.
This option is currently supported only on OSes where mallinfo() function is available (i.e. Linux).
A comma or whitespace-separated list of functions which are to be ignored by soft_limit. The values are case-insensitive, for class methods use class::method syntax.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Bu eklentinin tanımlanmış sabitleri yoktur.
Basic example on using memtrack extension:
Örnek 1 Creating large array in a function
<?php
/* /tmp/example1.php */
function foo() {
$a = array();
for ($i = 0; $i < 10000; $i++) $a[] = "test";
return $a;
}
$arr = foo();
?>
Run the example with the following command:
php -d memtrack.enabled=1 -d memtrack.soft_limit=1M -d memtrack.vm_limit=3M /tmp/example1.php
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Warning: [memtrack] [pid 26177] user function foo() executed in /tmp/example1.php on line 10 allocated 4194304 bytes in /tmp/example1.php on line 0 Warning: [memtrack] [pid 26177] virtual memory usage on shutdown: 32911360 bytes in Unknown on line 0
Bu eklentinin amacı, nesne özellik erişimlerinin ve yöntem çağrılarının aşırı yüklenmesini mümkün kılmaktır. Bu eklentinin tek bir işlevi vardır: overload(). Bu işlev değiştirge olarak bu işlevselliğin etkin kılınacağı sınıfın ismini alır. İsmi belirtilen sınıf bu işlevselliği istiyorsa uygun yöntemleri tanımlamalıdır: bir özelliği döndürmek için __get(), tanımlamak için __set() ve yöntem çağrısı için __call(). Bu yöntemle aşırı yükleme seçimlik olarak uygulanabilir. Bu eylemci işlevlerin içinde aşırı yükleme kullanılamaz, dolayısıyla nesne özelliklerine normal yollarla erişebilirsiniz.
Bu eklenti DENEYSELDİR. Bu eklentinin davranışı, işlev isimleri ve tüm belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu eklentiyi kullanmayın.
Bu eklenti PHP 5'in bir parçası değildir. PHP 5 __get(), __set() ve __call() çağrılarını yerleşik olarak destekler. Daha fazla bilgi için Aşırı Yükleme sayfasına bakınız.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu eklentiyi kullanabilmek için PHP'yi --enable-overload seçeneği ile derlemeniz gerekir. PHP 4.3.0'dan itibaren bu eklenti öntanımlı olarak etkindir. Eklenti desteğini iptal etmek için derleme sırasında --disable--overload seçeneğini kullanabilirsiniz.
PHP'nin Windows sürümünde bu eklenti yerleşik olarak gelmektedir. Bu işlevleri Windows'ta kullanmak için herhangi bir eklenti kurmanıza gerek yoktur.
Bilginize: Yerleşik aşırı yükleme desteği PHP 4.3.0 ile kullanılabilir olmuştur.
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Bu eklentinin tanımlanmış sabitleri yoktur.
overload() işlevini kullanan basit bir örnek:
Örnek 1 - Bir PHP sınıfının aşırı yüklenmesi
<?php
class OO {
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Bir özelliği döndürmek için geriçağırım yöntemi
function __get($prop_name, &$prop_value)
{
if (isset($this->elem[$prop_name])) {
$prop_value = $this->elem[$prop_name];
return true;
} else {
return false;
}
}
// Bir özelliği tanımlamak için geriçağırım yöntemi
function __set($prop_name, $prop_value)
{
$this->elem[$prop_name] = $prop_value;
return true;
}
}
// Nesneyi burada aşırı yüklüyoruz
overload('OO');
$o = new OO;
echo "\$o->a: $o->a\n"; // print: $o->a: 111
echo "\$o->b: $o->b\n"; // print: $o->b: 9
echo "\$o->c: $o->c\n"; // print: $o->c: 42
echo "\$o->d: $o->d\n"; // print: $o->d:
// $elem dizisine yeni bir öğe ekleyelim
$o->x = 56;
// stdclass'ı örnekleyelim (PHP 4'te yerleşiktir)
// $val aşırı yüklenmez!
$val = new stdclass;
$val->prop = 555;
// içinde $val nesnesi olar bir diziyi "a"'ya atayalım'
// Fakat __set() bunu $elem dizisine koyacak
$o->a = array($val);
var_dump($o->a[0]->prop);
?>
(PHP 4 >= 4.3.0)
overload — Bir sınıfın özellik ve yöntem çağrısı aşırı yüklemesini etkinleştirir
sınıfAdı ile belirtilen sınıfın yöntem çağrısı ve özellik aşırı yüklemesini etkin kılar.
Bir dizge olarak aşırı yüklenecek sınıfın ismi.
Hiçbir değer dönmez.
Örnek için Örnekler sayfasına bakınız.
Çıktı denetim işlevleri, betikten gönderilen çıktıyı denetiminizde tutmaya yardımcı olurlar. Bu özellik, çok çeşitli durumlarda yararlı olabilir, özellikle de betiğiniz veriyi çıktılamaya başladıktan sonra bir başlık göndermek isterseniz. Çıktı denetim işlevleri, header() ve setcookie() işlevlerini kullanarak başlık gönderimini etkilemez, sadece PHP kod blokları arasındaki veriler ve echo() gibi işlevler etkilenir.
Bilginize: PHP 4.1.x'ten (ve 4.2.x'ten) 4.3.x'e sürüm yükseltirken önceki sürümlerdeki bir yazılım hatasından dolayı php.ini dosyanızda implict_flush yönergesine OFF atamak zorunda kalacaksınız, aksi takdirde ob_start() ile yapılan bir çıktı, çıktıdan gizlenmeyecektir.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu işlevleri kullanmak için hiçbir şey kurmaya gerek yoktur; PHP çekirdeğinin parçasıdırlar.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişiklik yeri | Sürüm bilgisi |
|---|---|---|---|
| output_buffering | "0" | PHP_INI_PERDIR | |
| output_handler | NULL | PHP_INI_PERDIR | PHP 4.0.4'ten beri kullanılabilmektedir. |
| implicit_flush | "0" | PHP_INI_ALL | PHP <= 4.2.3'te PHP_INI_PERDIR. |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Bu yönergeye 'On' değeri atamak suretiyle çıktı tamponlamasını bütün dosyalar için etkin kılabilirsiniz. Tamponun boyunu belli bir değerle sınırlamak isterseniz 'On' yerine bu değeri bayt cinsinden yazabilirsiniz (örnek: output_buffering=4096). PHP 4.3.5'ten itibaren PHP-CLI'de bu yönergenin değeri daima 'Off'tur.
Betiğinizin tüm çıktısını bir işleve yönlendirebilirsiniz. Örneğin, bu yönergeye mb_output_handler() atarsanız karakter kodlaması şeffaf olarak belirtilen kodlamaya dönüştürülür. Bu yönergeye herhangi bir çıktı eylemcisinin atanması özdevinimli olarak çıktı tamponlamasını etkin kılar.
Bilginize: mb_output_handler() ve ob_iconv_handler() işlevlerini birlikte kullanamazsınız, bu durum ob_gzhandler() ve zlib.output_compression çifti için de geçerlidir.
Bilginize: Bu yönergede sadece yerleşik işlevler belirtilebilir. Kullanıcı tanımlı işlevler için ob_start() işlevini kullanın.
FALSE öntanımlıdır. TRUE atandığında her çıktı bloğundan sonra çıktı tamponu kendi kendini özdevinimli olarak boşaltır. Bu işlem, her HTML bloğundan, her print() veya echo() çağrısından sonra flush() işlevini çağırmaya eşdeğerdir.
PHP'yi HTTP ortamında kullanırken bu seçeneğe TRUE atandığında bir takım başarım sorunları ortaya çıkabilir, bu bakımdan genellikle sadece hata ayıklama amacıyla kullanılması önerilir. CLI SAPI altında bu yönergenin öntanımlı değeri TRUE'dur.
Ayrıca bakınız: ob_implicit_flush().
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Bu eklentinin tanımlanmış sabitleri yoktur.
Örnek 1 - Çıktı Denetimi örneği
<?php
ob_start();
echo "Hello\n";
setcookie("cookiename", "cookiedata");
ob_end_flush();
?>
Yukarıdaki örnekte, ob_end_flush() işlevi çağrılana kadar echo() çıktısı çıktı tamponunda saklanır. Bu süre zarfında, setcookie() çağrısı çerezi bir hataya yol açmadan başarıyla saklar. (Normalde, tarayıcıya veri gönderildikten sonra başlıkları gönderemezsiniz.)
header() ve setcookie().
(PHP 4, PHP 5)
flush — Çıktı tamponunu boşaltır
PHP'nin kullandığı ve PHP'nin artalanında kullanılan (CGI, HTTP sunucusu gibi) yazma tamponlarını boşaltır. Bu işlem, çıktı tamponları boşalıncaya kadar çıktının kullanıcının tarayıcısına gönderilmesi demektir.
flush() işlevi HTTP sunucunuzun veya istemci tarafında tarayıcının tamponlama ayarlarını ve PHP'nin kullanıcı alanı çıktı tamponlama mekanizmasını etkilemez. Bu bakımdan, çıktı tamponlarını boşaltmak için hem ob_flush() hem de flush() çağrısı yapmalısınız.
Çeşitli sunucular, özellikle de Win32 üstünde, tarayıcıya sonuçların aktarılması bitmemişse betiğiniz sonlanıncaya kadar betiğinizin çıktısı tamponlanmaya devam eder.
mod_gzip gibi Apache sunucu modülleri, verinin istemciye gönderimi bitmeden kendi tamponunu boşaltırken bir flush() işlemine sebep olabilir.
Tarayıcı, göstermeden önce girdisini tamponlayabilir. Örneğin, Netscape, bir satırsonu veya bir kapama etiketi alana kadar metni tamponlar ve en dıştaki tablonun </table> kapama etiketini almadan tabloyu oluşturmaz.
Microsoft Internet Explorer'ın bazı sürümleri 256 baytlık çıktı almadan sayfayı göstermeye başlamaz, yani, bu tarayıcının daha önce birşeyler göstermesini istiyorsanız boşaltma öncesi ek boşluk karakterleri göndermeniz gerekebilir.
Hiçbir değer dönmez.
(PHP 4 >= 4.2.0, PHP 5)
ob_clean — Çıktı tamponunu temizler (siler)
Bu işlev, en üst seviye çıktı tamponunun içeriğini siler.
Bu işlev, ob_end_clean() gibi tamponu yok etmez.
Hiçbir değer dönmez.
(PHP 4, PHP 5)
ob_end_clean — Çıktı tamponunu temizler (siler) ve tamponu kapatır
Bu işlev, en üst seviye çıktı tamponunun içeriğini siler ve bu çıktı tamponunu kapatır. ob_end_clean() çağrısından sonra tampon yok edildiğinden eğer gönderilen tampon içeriğin saklamak istiyorsanız ob_end_clean() çağrısından önce bir ob_get_contents() çağrısı yapmalısınız.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner. Başarısızlık sebeplerinden biri etkin bir tamponun bulunmaması diğeri ise tamponun silinememesi (özel bir tamponsa) olabilir.
İşlev başarısız olursa E_NOTICE seviyesinde bir ileti üretir.
| Sürüm: | Açıklama |
|---|---|
| 4.2.0 | Mantıksal dönüş değeri eklendi. |
Aşağıda çıktı tamponlarından kurtulmanın kolay bir yolu gösterilmiştir:
Örnek 1 - ob_end_clean() örneği
<?php
ob_start();
echo 'Gösterilmek istenmeyen metin.';
ob_end_clean();
?>
(PHP 4, PHP 5)
ob_end_flush — Çıktı tamponunu boşaltır (gönderir) ve tamponu kapatır
Bu işlev en üst seviye çıktı tamponunun (varsa) içeriğini gönderir ve bu tamponu kapatır. ob_end_flush() çağrısından sonra tampon yok edildiğinden eğer gönderilen tampon içeriğin saklamak istiyorsanız ob_end_flush() çağrısından önce bir ob_get_contents() çağrısı yapmalısınız.
Bilginize: ob_get_flush() işlevi, bu işlevden farklı olarak tampon içeriğini bir dizge olarak döndürür.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner. Başarısızlık sebeplerinden biri etkin bir tamponun bulunmaması diğeri ise tamponun silinememesi (özel bir tamponsa) olabilir.
İşlev başarısız olursa E_NOTICE seviyesinde bir ileti üretir.
| Sürüm: | Açıklama |
|---|---|
| 4.2.0 | Mantıksal dönüş değeri eklendi. |
Örnek 1 - ob_end_flush() örneği
Aşağıda çıktı tamponlarının boşaltılıp silinmesinin kolay bir yolu gösterilmiştir:
<?php
while (@ob_end_flush());
?>
(PHP 4 >= 4.2.0, PHP 5)
ob_flush — Çıktı tamponunu boşaltır (gönderir)
Bu işlev (varsa) çıktı tamponunun içeriğini gönderir. ob_flush() sonrası tampon içeriği temizlendiğinden eğer gönderilen içeriği saklamak istiyorsanız ob_flush() çağrısından önce bir ob_get_contents() çağrısı yapmalısınız.
Bu işlev, ob_end_flush() işlevinin yaptığı gibi çıktı tamponunu yok etmez.
Hiçbir değer dönmez.
(PHP 4 >= 4.3.0, PHP 5)
ob_get_clean — Geçerli çıktı tamponun içeriğini döndürüp tamponu siler
Geçerli çıktı tamponun içeriğini döndürüp tamponu siler.
ob_get_clean() esasen ob_get_contents() ve ob_end_clean() işlevlerini çağırır.
Çıktı tamponlaması etkin değilse FALSE, aksi takdirde çıktı tamponunun içeriğini döndürür.
Örnek 1 - Basit bir ob_get_clean() örneği
<?php
ob_start();
echo "Hello World";
$out = ob_get_clean();
$out = strtolower($out);
var_dump($out);
?>
Yukarıdaki örneğin çıktısı:
string(11) "hello world"
(PHP 4, PHP 5)
ob_get_contents — Çıktı tamponunun içeriği ile döner
Çıktı tamponunu temizlemeden içeriği ile döner.
Çıktı tamponlaması etkin değilse FALSE, aksi takdirde çıktı tamponunun içeriğini döndürür.
Örnek 1 - ob_get_contents() örneği
<?php
ob_start();
echo "Hello ";
$out1 = ob_get_contents();
echo "World";
$out2 = ob_get_contents();
ob_end_clean();
var_dump($out1, $out2);
?>
Yukarıdaki örneğin çıktısı:
string(6) "Hello " string(11) "Hello World"
(PHP 4 >= 4.3.0, PHP 5)
ob_get_flush — Çıktı tamponunu boşaltır, içeriğini bir dizge olarak döndürür ve çıktı tamponlamasını kapatır
ob_get_flush() işlevi, çıktı tamponunu boşaltır, içeriğini bir dizge olarak döndürür ve çıktı tamponlamasını kapatır.
Bilginize: Tampon içeriğini bir dizge olarak döndürmesi dışında ob_end_flush() işlevine benzer.
Çıktı tamponlaması etkin değilse FALSE aksi takdirde çıktı tamponunun içeriğini döndürür.
Örnek 1 - ob_get_flush() örneği
<?php
// output_buffering=On
print_r(ob_list_handlers());
// tamponu bir dosyaya kaydedelim
$buffer = ob_get_flush();
file_put_contents('buffer.txt', $buffer);
print_r(ob_list_handlers());
?>
Yukarıdaki örneğin çıktısı:
Array
(
[0] => default output handler
)
Array
(
)
(PHP 4 >= 4.0.2, PHP 5)
ob_get_length — Çıktı tamponunundaki içeriğin uzunluğunu döndürür
Çıktı tamponunundaki içeriğin uzunluğunu döndürür.
Çıktı tamponu etkin değilse FALSE, aksi takdirde bayt cinsinden çıktı tamponunundaki içeriğin uzunluğunu döndürür.
Örnek 1 - ob_get_length() örneği
<?php
ob_start();
echo "Hello ";
$len1 = ob_get_length();
echo "World";
$len2 = ob_get_length();
ob_end_clean();
echo $len1 . ", ." . $len2;
?>
Yukarıdaki örneğin çıktısı:
6, 11
(PHP 4 >= 4.2.0, PHP 5)
ob_get_level — Çıktı tamponlama mekanizmasının iç içelik seviyesini döndürür
Çıktı tamponlama mekanizmasının iç içelik seviyesini döndürür
Çıktı tamponlaması etkin değilse sıfır, aksi takdirde çıktı tamponlama eylemcilerinin iç içelik seviyesini döndürür.
(PHP 4 >= 4.2.0, PHP 5)
ob_get_status — Çıktı tamponlarının durumu ile döner
ob_get_status() işlevi, tam_durum değiştirgesinde TRUE belirtilmişse her seviyeden etkin çıktı tamponlarının tamamının durumunu, aksi takdirde üst seviye çıktı tamponunun durumunu döndürür.
TRUE her seviyeden etkin çıktı tamponlarının tamamının durumunu, FALSE ise veya belirtilmezse sadece üst seviye çıktı tamponunun durumunu döndürür.
tam_durum değiştirgesi belirtilmezse veya tam_durum = FALSE olduğunda aşağıdaki elemanlarla basit bir dizi döner:
Array
(
[level] => 2
[type] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
İşlev, tam_durum = TRUE değeriyle çağrılırsa, her ektin çıktı tamponu seviyesi için bir eleman içeren bir dizi döner. Çıktı seviyesi üst seviye dizinin anahtarı olarak kullanılır ve bu anahtarların değerleri de kendi etkin çıktı seviyelerine ilişkin durum bilgisi içeren birer dizi içerirler.
Array
(
[0] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
[1] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 0
[buffer_size] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
)
Tam çıktı ek olarak şu elemanları içerir:
(PHP 4 >= 4.0.4, PHP 5)
ob_gzhandler — Çıktı tamponunu gziplemek için ob_start geriçağırım işlevi
ob_gzhandler() işlevi, sıkıştırılmış sayfaları destekleyen tarayıcılara gziplenmiş veri gönderim oluşumuna yardımcı olmak için ob_start() işlevinde bir geriçağırım işlevi olarak belirtilmek üzere tasarlanmıştır. ob_gzhandler() asıl veriyi sıkıştırılmış olarak göndermeden önce tarayıcının kabul edeceği içerik kodlamasının türünü ("gzip", "deflate" veya hiçbiri) tespit edip tampon içeriğini buna uygun olarak kodlayıp çıktılar. Hangi sıkıştırma türünü kabul edeceğini doğru başlıkları göndererek tarayıcı belirlediğinden tüm tarayıcılar desteklenir. Eğer bir tarayıcı sıkıştırılmış sayfaları desteklemiyorsa işlev FALSE döndürecektir.
| Sürüm: | Açıklama |
|---|---|
| 4.0.5 | kip değiştirgesi eklendi. |
Örnek 1 - ob_gzhandler() örneği
<?php
ob_start("ob_gzhandler");
?>
<html>
<body>
<p>Bu sayfa sıkıştırılmış olabilir.</p>
</html>
<body>
Bilginize: ob_gzhandler() işlevi zlib eklentisini gerektirir.
Bilginize: ob_gzhandler() işlevini ve zlib.output_compression yönergesini birlikte kullanamazsınız. Ayrıca, zlib.output_compression yörengesinin ob_gzhandler() işlevine tercih edildiğini bilmenizde yarar var.
(PHP 4, PHP 5)
ob_implicit_flush — Örtük boşaltmayı açar/kapar
ob_implicit_flush() işlevi örtük tampon boşalmayı açar veya kapatır. Örtük boşaltma işlemi, her çıktı çağrısından sonra bir boşaltma işlemiyle sonuçlanır, dolayısıyla açıkça flush() çağrıları yapma gereği ortadan kalkar.
TRUE ise örtük boşaltma açılır FALSE ise kapatılır. TRUE öntanımlıdır.
Hiçbir değer dönmez.
(PHP 4 >= 4.3.0, PHP 5)
ob_list_handlers — Kullanımdaki çıktı eylemcileri listeler
Kullanımdaki çıktı eylemcileri listeler.
Kullanımdaki çıktı eylemcileri (varsa) içeren bir dizi döndürür. Eğer output_buffering etkinse veya ob_start() ile bir anonim işlev belirtilmişse ob_list_handlers() işlevi "default output handler" (öntanımlı çıktı eylemcisi) dizgesini döndürür.
Örnek 1 - ob_list_handlers() işlevi
<?php
// output_buffering=On
print_r(ob_list_handlers());
ob_end_flush();
ob_start("ob_gzhandler");
print_r(ob_list_handlers());
ob_end_flush();
// anonim işlev
ob_start(create_function('$string', 'return $string;'));
print_r(ob_list_handlers());
ob_end_flush();
?>
Yukarıdaki örneğin çıktısı:
Array
(
[0] => default output handler
)
Array
(
[0] => ob_gzhandler
)
Array
(
[0] => default output handler
)
(PHP 4, PHP 5)
ob_start — Çıktı tamponlamasını başlatır
Bu işlev çıktı tamponlamasını ektin kılar. Çıktı tamponlaması etkinken betikten (başlıklar dışında) hiçbir çıktı gönderilmez ve çıktı dahili bir tamponda saklanır.
Bu dahili tamponun içeriği ob_get_contents() işleviyle bir dizge değişkenine kopyalanabilir. Dahili tamponda birikenleri çıktılamak için ob_end_flush() işlevini kullanın. Çıktılamak istemiyorsanız, ob_end_clean() işlevi ile tampon içeriğini sessiz sedasız silebilirsiniz.
Bazı HTTP sunucuları (Apache gibi) geriçağırım işlevini çağırırken betiğin çalışma dizinini değiştirir. Geriçağırım işlevinde chdir(dirname($_SERVER['SCRIPT_FILENAME'])) gibi bir çağrıyla betiğin bulunduğu dizine dönebilirsiniz.
Çıktı tamponlaması bir yığıt gibi çalışabilir, bir ob_start() etkinken başka bir ob_start() çağrısı yapabilirsiniz. Yalnız aynı sayıda ob_end_flush() çağrısı yapmayı unutmayın. Eğer çok sayıda çıktı geriçağırım işlevi etkinse, her biri iç içelik sırası gözetilerek çıktıyı süzerler.
Bu değiştirge ile isteğe bağlı bir çıktı eylemcisi işlev belirtilebilir. Bu işlev değiştirge olarak bir dizge almalı ve bir dizge döndürmelidir. Bu işlev, çıktı tamponu boşaltılırken (gönderim), tampon temizlenirken (ob_flush(), ob_clean() ve benzeri bir işlevle) veya isteğin sonunda çıktı tamponu kullanıcının tarayıcısına boşaltılırken çağrılacaktır. İşlev çağrıldığında çıktı tamponunu değiştirge olarak alması ve sonuçta tarayıcıya gönderilmek üzere yeni bir çıktı tamponu döndürmesi beklenir. Eğer bu değiştirge ile belirtilen işlev çağrılabilir değilse ob_start() FALSE döndürür.
Eğer geriçağırıcı iki değiştirgeli ise ikinci değiştirge PHP_OUTPUT_HANDLER_START, PHP_OUTPUT_HANDLER_CONT ve PHP_OUTPUT_HANDLER_END değerlerinden oluşan bir bit alanı ile doldurulur.
çıktı_geriçağırıcı FALSE döndürdüğü takdirde özgün çıktı tarayıcıya gönderilir.
çıktı_geriçağırıcı , değiştirgesine bir NULL değer aktarılarak atlanabilir.
ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() ve ob_start() bir geriçağırım işlevi olarak belirtilemez. Bunlardan biri belirtilirse, davranışın nasıl olacağı belirsizdir. Bir tamponun içeriğini silmek isterseniz geriçağrıcıdan "" (boş dizge) döndürmelisiniz. Bir geriçağırım işlevinden, çıktı tamponlama işlevlerini kullanarak print_r($ifade, true) veya highlight_file($dosyaismi, true) gibi işlevleri çağıramazsınız.
Bilginize: PHP 4.0.4'ten itibaren, sıkıştırılmış sayfaları destekleyen tarayıcılara gziplenmiş veri göndermek için ob_gzhandler() işlevi kullanılabilmektedir. ob_gzhandler() işlevi tarayıcının kabul edeceği içerik kodlamasının türünü tespit ettikten sonra buna uygun çıktı döndürür.
İsteğe bağlı parça_boyu belirtildiği takdirde, parça_boyu nu aşan veya tamponun tam dolmasına sebep olan bir çıktılama çağrısından sonra tampon boşaltılır. Öntanımlı 0 değerinin anlamı işlevin sadece tamponun sonuna gelindiğinde çağrılacağı anlamına gelirken, özel 1 değeri parça_boyu değerinin 4096 olacağı anlamına gelir.
İsteğe bağlı sil değiştirgesinde FALSE belirtilirse, betik sonlanana kadar tampon boşaltılmaz.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
| Sürüm: | Açıklama |
|---|---|
| 4.3.2 | çıktı_geriçağırıcı çalıştırılamadığı zaman işlevin FALSE döndürmesi sağlandı. |
| 4.2.0 | sil değiştirgesi eklendi. |
Örnek 1 - Kullanıcı tanımlı geriçağırım işlevi örneği
<?php
function geriçağırım($tampon)
{
// elmaları armutlarla değiştirelim
return (str_replace("elmalar", "armutlar", $tampon));
}
ob_start("geriçağırım");
?>
<html>
<body>
<p>Bizden elmalarla armutların karşılaştırılması isteniyor.</p>
</body>
</html>
<?php
ob_end_flush();
?>
Yukarıdaki örneğin çıktısı:
<html> <body> <p>Bizden armutlarla armutların karşılaştırılması isteniyor.</p> </body> </html>
(PHP 4 >= 4.3.0, PHP 5)
output_add_rewrite_var — URL yeniden yazım değerlerini ekler
Bu işlev URL yeniden yazım mekanizmasına yeni bir isim/değer çifti ekler. İsim ve değer URL'lere (GET değiştirgesi olarak) ve formlara (gizli girdi alanı olarak), session.use_trans_sid ile şeffaf URL yeniden yazımı etkinleştirilmiş gibi oturum ID'sinin eklendiği tarzda eklenir. Bu yolla mutlak URL'lerin (http://example.com/.. gibi) yeniden yazılmayacağına lütfen dikkat ediniz.
Bu işlevin davranışı url_rewriter.tags php.ini yönergesi ile denetlenir.
Bilginize: Bu işlevin çağrılması örtük olarak çıktı tamponlamasını henüz başlamamışsa başlatır.
Değişkenin ismi.
Değişkenin değeri.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - output_add_rewrite_var() örneği
<?php
output_add_rewrite_var('var', 'value');
// bazı bağlar
echo '<a href="file.php">bağlantı</a>
<a href="http://example.com">diğer bağlantı</a>';
// bir form
echo '<form action="script.php" method="post">
<input type="text" name="var2" />
</form>';
print_r(ob_list_handlers());
?>
Yukarıdaki örneğin çıktısı:
<a href="file.php?var=value">bağlantı</a>
<a href="http://example.com">diğer bağlantı</a>
<form action="script.php" method="post">
<input type="hidden" name="var" value="value" />
<input type="text" name="var2" />
</form>
Array
(
[0] => URL-Rewriter
)
(PHP 4 >= 4.3.0, PHP 5)
output_reset_rewrite_vars — URL yeniden yazma değerlerini sıfırlar
Bu işlev URL yeniden yazım mekanizmasını sıfırlar ve output_add_rewrite_var() işleviyle veya (session_start() işleviyle session.use_trans_sid tanımlanmışsa) oturum mekanizmasıyla evvelce atanmış olan tüm yeniden yazım çiftlerini siler.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 - output_reset_rewrite_vars() örneği
<?php
session_start();
output_add_rewrite_var('var', 'value');
echo '<a href="file.php">bağlantı</a>';
ob_flush();
output_reset_rewrite_vars();
echo '<a href="file.php">bağlantı</a>';
?>
Yukarıdaki örneğin çıktısı:
<a href="file.php?PHPSESSID=xxx&var=value">bağlantı</a> <a href="file.php">bağlantı</a>
The runkit extension provides means to modify constants, user-defined functions, and user-defined classes. It also provides for custom superglobal variables and embeddable sub-interpreters via sandboxing.
This package is meant as a feature added replacement for the » classkit package. When compiled with the --enable-runkit=classkit option to ./configure, it will export classkit compatible function definitions and constants.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
Modifying Constants, Functions, Classes, and Methods works with all releases of PHP 4 and PHP 5. No special requirements are necessary.
Custom Superglobals are only available in PHP 4.2.0 or later.
Sandboxing requires PHP 5.1.0 or later, or PHP 5.0.0 with a special TSRM patch applied. Regardless of which version of PHP is in use it must be compiled with the --enable-maintainer-zts option. See the README file in the runkit package for additional information.
Bu » PECL eklentisi PHP ile gelmez.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/runkit.
Bu PECL eklentisi için bir DLL mevcut değildir. Ayrıca, Windows üzerinde kurulum bölümüne de bakınız.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| Name | Default | Changeable | Changelog |
|---|---|---|---|
| runkit.superglobal | "" | PHP_INI_PERDIR | |
| runkit.internal_override | "0" | PHP_INI_SYSTEM |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Örnek 1 Custom Superglobals with runkit.superglobal=_FOO,_BAR in php.ini
<?php
function show_values() {
echo "Foo is $_FOO\n";
echo "Bar is $_BAR\n";
echo "Baz is $_BAZ\n";
}
$_FOO = 'foo';
$_BAR = 'bar';
$_BAZ = 'baz';
/* Displays foo and bar, but not baz */
show_values();
?>
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
(PECL runkit >= 0.7.0)
Runkit_Sandbox — Runkit Sandbox Class -- PHP Virtual Machine
Instantiating the Runkit_Sandbox class creates a new thread with its own scope and program stack. Using a set of options passed to the constructor, this environment may be restricted to a subset of what the primary interpreter can do and provide a safer environment for executing user supplied code.
Bilginize: Sandbox support (required for runkit_lint(), runkit_lint_file(), and the Runkit_Sandbox class) is only available as of PHP 5.1.0 or specially patched versions of PHP 5.0, and requires that thread safety be enabled. See the README file included in the runkit package for more information.
options is an associative array containing any combination of the special ini options listed below.
If the outer script which is instantiating the Runkit_Sandbox class is configured with safe_mode = off, then safe_mode may be turned on for the sandbox environment. This setting can not be used to disable safe_mode when it's already enabled in the outer script.
If the outer script which is instantiating the Runkit_Sandbox class is configured with safe_mode_gid = on, then safe_mode_gid may be turned off for the sandbox environment. This setting can not be used to enable safe_mode_gid when it's already disabled in the outer script.
If the outer script which is instantiating the Runkit_Sandbox class is configured with a safe_mode_include_dir, then a new safe_mode_include_dir may be set for sandbox environments below the currently defined value. safe_mode_include_dir may also be cleared to indicate that the bypass feature is disabled. If safe_mode_include_dir was blank in the outer script, but safe_mode was not enabled, then any arbitrary safe_mode_include_dir may be set while turning safe_mode on.
open_basedir may be set to any path below the current setting of open_basedir. If open_basedir is not set within the global scope, then it is assumed to be the root directory and may be set to any location.
Like safe_mode , this setting can only be made more restrictive, in this case by setting it to FALSE when it is previously set to TRUE
Comma separated list of functions to disable within the sandbox sub-interpreter. This list need not contain the names of the currently disabled functions, they will remain disabled whether listed here or not.
Comma separated list of classes to disable within the sandbox sub-interpreter. This list need not contain the names of the currently disabled classes, they will remain disabled whether listed here or not.
Comma separated list of variables to be treated as superglobals within the sandbox sub-interpreter. These variables will be used in addition to any variables defined internally or through the global runkit.superglobal setting.
Ini option runkit.internal_override may be disabled (but not re-enabled) within sandboxes.
Örnek 1 Instantiating a restricted sandbox
<?php
$options = array(
'safe_mode'=>true,
'open_basedir'=>'/var/www/users/jdoe/',
'allow_url_fopen'=>'false',
'disable_functions'=>'exec,shell_exec,passthru,system',
'disable_classes'=>'myAppClass');
$sandbox = new Runkit_Sandbox($options);
/* Non-protected ini settings may set normally */
$sandbox->ini_set('html_errors',true);
?>
All variables in the global scope of the sandbox environment are accessible as properties of the sandbox object. The first thing to note is that because of the way memory between these two threads is managed, object and resource variables can not currently be exchanged between interpreters. Additionally, all arrays are deep copied and any references will be lost. This also means that references between interpreters are not possible.
Örnek 2 Working with variables in a sandbox
<?php
$sandbox = new Runkit_Sandbox();
$sandbox->foo = 'bar';
$sandbox->eval('echo "$foo\n"; $bar = $foo . "baz";');
echo "{$sandbox->bar}\n";
if (isset($sandbox->foo)) unset($sandbox->foo);
$sandbox->eval('var_dump(isset($foo));');
?>
Yukarıdaki örneğin çıktısı:
bar barbaz bool(false)
Any function defined within the sandbox may be called as a method on the sandbox object. This also includes a few pseudo-function language constructs: eval(), include(), include_once(), require(), require_once(), echo(), print(), die(), and exit().
Örnek 3 Calling sandbox functions
<?php
$sandbox = new Runkit_Sandbox();
echo $sandbox->str_replace('a','f','abc');
?>
Yukarıdaki örneğin çıktısı:
fbc
When passing arguments to a sandbox function, the arguments are taken from the outer instance of PHP. If you wish to pass arguments from the sandbox's scope, be sure to access them as properties of the sandbox object as illustrated above.
Örnek 4 Passing arguments to sandbox functions
<?php
$sandbox = new Runkit_Sandbox();
$foo = 'bar';
$sandbox->foo = 'baz';
echo $sandbox->str_replace('a',$foo,'a');
echo $sandbox->str_replace('a',$sandbox->foo,'a');
?>
Yukarıdaki örneğin çıktısı:
bar baz
As of runkit version 0.5, certain Sandbox settings may be modified on the fly using ArrayAccess syntax. Some settings, such as active are read-only and meant to provide status information. Other settings, such as output_handler may be set and read much like a normal array offset. Future settings may be write-only, however no such settings currently exist.
| Setting | Type | Purpose | Default |
|---|---|---|---|
| active | Boolean (Read Only) | TRUE if the Sandbox is still in a usable state, FALSE if the request is in bailout due to a call to die(), exit(), or because of a fatal error condition. | TRUE (Initial) |
| output_handler | Callback | When set to a valid callback, all output generated by the Sandbox instance will be processed through the named function. Sandbox output handlers follow the same calling conventions as the system-wide output handler. | None |
| parent_access | Boolean | May the sandbox use instances of the Runkit_Sandbox_Parent class? Must be enabled for other Runkit_Sandbox_Parent related settings to work. | FALSE |
| parent_read | Boolean | May the sandbox read variables in its parent's context? | FALSE |
| parent_write | Boolean | May the sandbox modify variables in its parent's context? | FALSE |
| parent_eval | Boolean | May the sandbox evaluate arbitrary code in its parent's context? DANGEROUS | FALSE |
| parent_include | Boolean | May the sandbox include php code files in its parent's context? DANGEROUS | FALSE |
| parent_echo | Boolean | May the sandbox echo data in its parent's context effectively bypassing its own output_handler? | FALSE |
| parent_call | Boolean | May the sandbox call functions in its parent's context? | FALSE |
| parent_die | Boolean | May the sandbox kill its own parent? (And thus itself) | FALSE |
| parent_scope | Integer | What scope will parental property access look at? 0 == Global scope, 1 == Calling scope, 2 == Scope preceeding calling scope, 3 == The scope before that, etc..., etc... | 0 (Global) |
| parent_scope | String | When parent_scope is set to a string value, it refers to a named array variable in the global scope. If the named variable does not exist at the time of access it will be created as an empty array. If the variable exists but it not an array, a dummy array will be created containing a reference to the named global variable. |
(PECL runkit >= 0.7.0)
Runkit_Sandbox_Parent — Runkit Anti-Sandbox Class
Instantiating the Runkit_Sandbox_Parent class from within a sandbox environment created from the Runkit_Sandbox class provides some (controlled) means for a sandbox child to access its parent.
Bilginize: Sandbox support (required for runkit_lint(), runkit_lint_file(), and the Runkit_Sandbox class) is only available as of PHP 5.1.0 or specially patched versions of PHP 5.0, and requires that thread safety be enabled. See the README file included in the runkit package for more information.
In order for any of the Runkit_Sandbox_Parent features to function. Support must be enabled on a per-sandbox basis by enabling the parent_access flag from the parent's context.
Örnek 1 Working with variables in a sandbox
<?php
$sandbox = new Runkit_Sandbox();
$sandbox['parent_access'] = true;
?>
Just as with sandbox variable access, a sandbox parent's variables may be read from and written to as properties of the Runkit_Sandbox_Parent class. Read access to parental variables may be enabled with the parent_read setting (in addition to the base parent_access setting). Write access, in turn, is enabled through the parent_write setting.
Unlike sandbox child variable access, the variable scope is not limited to globals only. By setting the parent_scope setting to an appropriate integer value, other scopes in the active call stack may be inspected instead. A value of 0 (Default) will direct variable access at the global scope. 1 will point variable access at whatever variable scope was active at the time the current block of sandbox code was executed. Higher values progress back through the functions that called the functions that led to the sandbox executing code that tried to access its own parent's variables.
Örnek 2 Accessing parental variables
<?php
$php = new Runkit_Sandbox();
$php['parent_access'] = true;
$php['parent_read'] = true;
$test = "Global";
$php->eval('$PARENT = new Runkit_Sandbox_Parent;');
$php['parent_scope'] = 0;
one();
$php['parent_scope'] = 1;
one();
$php['parent_scope'] = 2;
one();
$php['parent_scope'] = 3;
one();
$php['parent_scope'] = 4;
one();
$php['parent_scope'] = 5;
one();
function one() {
$test = "one()";
two();
}
function two() {
$test = "two()";
three();
}
function three() {
$test = "three()";
$GLOBALS['php']->eval('var_dump($PARENT->test);');
}
?>
Yukarıdaki örneğin çıktısı:
string(6) "Global" string(7) "three()" string(5) "two()" string(5) "one()" string(6) "Global" string(6) "Global"
Just as with sandbox access, a sandbox may access its parents functions providing that the proper settings have been enabled. Enabling parent_call will allow the sandbox to call all functions available to the parent scope. Language constructs are each controlled by their own setting: print() and echo() are enabled with parent_echo. die() and exit() are enabled with parent_die. eval() is enabled with parent_eval while include(), include_once(), require(), and require_once() are enabled through parent_include.
(PECL runkit >= 0.7.0)
runkit_class_adopt — Convert a base class to an inherited class, add ancestral methods when appropriate
Name of class to be adopted
Parent class which child class is extending
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 A runkit_class_adopt() example
<?php
class myParent {
function parentFunc() {
echo "Parent Function Output\n";
}
}
class myChild {
}
runkit_class_adopt('myChild','myParent');
myChild::parentFunc();
?>
Yukarıdaki örneğin çıktısı:
Parent Function Output
(PECL runkit >= 0.7.0)
runkit_class_emancipate — Convert an inherited class to a base class, removes any method whose scope is ancestral
Name of class to emancipate
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 A runkit_class_emancipate() example
<?php
class myParent {
function parentFunc () {
echo "Parent Function Output\n";
}
}
class myChild extends myParent {
}
myChild::parentFunc();
runkit_class_emancipate('myChild');
myChild::parentFunc();
?>
Yukarıdaki örneğin çıktısı:
Parent Function Output Fatal error: Call to undefined function: parentFunc() in example.php on line 12
(PECL runkit >= 0.7.0)
runkit_constant_add — Similar to define(), but allows defining in class definitions as well
Name of constant to declare. Either a string to indicate a global constant, or classname::constname to indicate a class constant.
NULL, Bool, Long, Double, String, or Resource value to store in the new constant.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_constant_redefine — Redefine an already defined constant
Constant to redefine. Either string indicating global constant, or classname::constname indicating class constant.
New value to assign to constant.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_constant_remove — Remove/Delete an already defined constant
Name of constant to remove. Either a string indicating a global constant, or classname::constname indicating a class constant.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_function_add — Add a new function, similar to create_function()
Name of function to be created
Comma separated argument list
Code making up the function
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 A runkit_function_add() example
<?php
runkit_function_add('testme','$a,$b','echo "The value of a is $a\n"; echo "The value of b is $b\n";');
testme(1,2);
?>
Yukarıdaki örneğin çıktısı:
The value of a is 1 The value of b is 2
(PECL runkit >= 0.7.0)
runkit_function_copy — Copy a function to a new function name
Name of existing function
Name of new function to copy definition to
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 A runkit_function_copy() example
<?php
function original() {
echo "In a function\n";
}
runkit_function_copy('original','duplicate');
original();
duplicate();
?>
Yukarıdaki örneğin çıktısı:
In a function In a function
(PECL runkit >= 0.7.0)
runkit_function_redefine — Replace a function definition with a new implementation
Bilginize: By default, only userspace functions may be removed, renamed, or modified. In order to override internal functions, you must enable the runkit.internal_override setting in php.ini.
Name of function to redefine
New list of arguments to be accepted by function
New code implementation
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 A runkit_function_redefine() example
<?php
function testme() {
echo "Original Testme Implementation\n";
}
testme();
runkit_function_redefine('testme','','echo "New Testme Implementation\n";');
testme();
?>
Yukarıdaki örneğin çıktısı:
Original Testme Implementation New Testme Implementation
(PECL runkit >= 0.7.0)
runkit_function_remove — Remove a function definition
Bilginize: By default, only userspace functions may be removed, renamed, or modified. In order to override internal functions, you must enable the runkit.internal_override setting in php.ini.
Name of function to be deleted
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_function_rename — Change a function's name
Bilginize: By default, only userspace functions may be removed, renamed, or modified. In order to override internal functions, you must enable the runkit.internal_override setting in php.ini.
Current function name
New function name
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_import — Process a PHP file importing function and class definitions, overwriting where appropriate
Similar to include() however any code residing outside of a function or class is simply ignored. Additionally, depending on the value of flags , any functions or classes which already exist in the currently running environment will be automatically overwritten by their new definitions.
Filename to import function and class definitions from
Bitwise OR of the RUNKIT_IMPORT_* family of constants.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_lint_file — Check the PHP syntax of the specified file
The runkit_lint_file() function performs a syntax (lint) check on the specified filename testing for scripting errors. This is similar to using php -l from the commandline.
Bilginize: Sandbox support (required for runkit_lint(), runkit_lint_file(), and the Runkit_Sandbox class) is only available as of PHP 5.1.0 or specially patched versions of PHP 5.0, and requires that thread safety be enabled. See the README file included in the runkit package for more information.
File containing PHP Code to be lint checked
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_lint — Check the PHP syntax of the specified php code
The runkit_lint() function performs a syntax (lint) check on the specified php code testing for scripting errors. This is similar to using php -l from the command line except runkit_lint() accepts actual code rather than a filename.
Bilginize: Sandbox support (required for runkit_lint(), runkit_lint_file(), and the Runkit_Sandbox class) is only available as of PHP 5.1.0 or specially patched versions of PHP 5.0, and requires that thread safety be enabled. See the README file included in the runkit package for more information.
PHP Code to be lint checked
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL runkit >= 0.7.0)
runkit_method_add — Dynamically adds a new method to a given class
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
The class to which this method will be added
The name of the method to add
Comma-delimited list of arguments for the newly-created method
The code to be evaluated when methodname is called
The type of method to create, can be RUNKIT_ACC_PUBLIC, RUNKIT_ACC_PROTECTED or RUNKIT_ACC_PRIVATE
Bilginize: This parameter is only used as of PHP 5, because, prior to this, all methods were public.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 runkit_method_add() example
<?php
class Example {
function foo() {
echo "foo!\n";
}
}
// create an Example object
$e = new Example();
// Add a new public method
runkit_method_add(
'Example',
'add',
'$num1, $num2',
'return $num1 + $num2;',
RUNKIT_ACC_PUBLIC
);
// add 12 + 4
echo $e->add(12, 4);
?>
Yukarıdaki örneğin çıktısı:
16
(PECL runkit >= 0.7.0)
runkit_method_copy — Copies a method from class to another
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
Destination class for copied method
Destination method name
Source class of the method to copy
Name of the method to copy from the source class. If this parameter is omitted, the value of dMethod is assumed.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 runkit_method_copy() example
<?php
class Foo {
function example() {
return "foo!\n";
}
}
class Bar {
// initially, no methods
}
// copy the example() method from the Foo class to the Bar class, as baz()
runkit_method_copy('Bar', 'baz', 'Foo', 'example');
// output copied function
echo Bar::baz();
?>
Yukarıdaki örneğin çıktısı:
foo!
(PECL runkit >= 0.7.0)
runkit_method_redefine — Dynamically changes the code of the given method
Bilginize: Bu işlev çalışmakta olan yöntemi değiştirmekte kullanılamaz.
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
The class in which to redefine the method
The name of the method to redefine
Comma-delimited list of arguments for the redefined method
The new code to be evaluated when methodname is called
The redefined method can be RUNKIT_ACC_PUBLIC, RUNKIT_ACC_PROTECTED or RUNKIT_ACC_PRIVATE
Bilginize: This parameter is only used as of PHP 5, because, prior to this, all methods were public.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 runkit_method_redefine() example
<?php
class Example {
function foo() {
return "foo!\n";
}
}
// create an Example object
$e = new Example();
// output Example::foo() (before redefine)
echo "Before: " . $e->foo();
// Redefine the 'foo' method
runkit_method_redefine(
'Example',
'foo',
'',
'return "bar!\n";',
RUNKIT_ACC_PUBLIC
);
// output Example::foo() (after redefine)
echo "After: " . $e->foo();
?>
Yukarıdaki örneğin çıktısı:
Before: foo! After: bar!
(PECL runkit >= 0.7.0)
runkit_method_remove — Dynamically removes the given method
Bilginize: Bu işlev çalışmakta olan yöntemi değiştirmekte kullanılamaz.
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
The class in which to remove the method
The name of the method to remove
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 runkit_method_remove() example
<?php
class Example {
function foo() {
return "foo!\n";
}
function bar() {
return "bar!\n";
}
}
// Remove the 'foo' method
runkit_method_remove(
'Example',
'foo'
);
echo implode(' ', get_class_methods('Example'));
?>
Yukarıdaki örneğin çıktısı:
bar
(PECL runkit >= 0.7.0)
runkit_method_rename — Dynamically changes the name of the given method
Bilginize: Bu işlev çalışmakta olan yöntemi değiştirmekte kullanılamaz.
Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.
The class in which to rename the method
The name of the method to rename
The new name to give to the renamed method
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 runkit_method_rename() example
<?php
class Example {
function foo() {
return "foo!\n";
}
}
// Rename the 'foo' method to 'bar'
runkit_method_rename(
'Example',
'foo',
'bar'
);
// output renamed function
echo Example::bar();
?>
Yukarıdaki örneğin çıktısı:
foo!
(PECL runkit >= 0.8.0)
runkit_return_value_used — Determines if the current functions return value will be used
Returns TRUE if the function's return value is used by the calling scope, otherwise FALSE
Örnek 1 runkit_return_value_used() example
<?php
function foo() {
var_dump(runkit_return_value_used());
}
foo();
$f = foo();
?>
Yukarıdaki örneğin çıktısı:
bool(false) bool(true)
(PECL runkit >= 0.7.0)
runkit_sandbox_output_handler — Specify a function to capture and/or process output from a runkit sandbox
Ordinarily, anything output (such as with echo() or print()) will be output as though it were printed from the parent's scope. Using runkit_sandbox_output_handler() however, output generated by the sandbox (including errors), can be captured by a function outside of the sandbox.
Bilginize: Sandbox support (required for runkit_lint(), runkit_lint_file(), and the Runkit_Sandbox class) is only available as of PHP 5.1.0 or specially patched versions of PHP 5.0, and requires that thread safety be enabled. See the README file included in the runkit package for more information.
Bilginize: Deprecated
As of runkit version 0.5, this function is deprecated and is scheduled to be removed from the package prior to a 1.0 release. The output handler for a given Runkit_Sandbox instance may be read/set using the array offset syntax shown on the Runkit_Sandbox class definition page.
Object instance of Runkit_Sandbox class on which to set output handling.
Name of a function which expects one parameter. Output generated by sandbox will be passed to this callback. Anything returned by the callback will be displayed normally. If this parameter is not passed then output handling will not be changed. If a non-truth value is passed, output handling will be disabled and will revert to direct display.
Returns the name of the previously defined output handler callback, or FALSE if no handler was previously defined.
Örnek 1 Feeding output to a variable
<?php
function capture_output($str) {
$GLOBALS['sandbox_output'] .= $str;
return '';
}
$sandbox_output = '';
$php = new Runkit_Sandbox();
runkit_sandbox_output_handler($php, 'capture_output');
$php->echo("Hello\n");
$php->eval('var_dump("Excuse me");');
$php->die("I lost myself.");
unset($php);
echo "Sandbox Complete\n\n";
echo $sandbox_output;
?>
Yukarıdaki örneğin çıktısı:
Sandbox Complete Hello string(9) "Excuse me" I lost myself.
(PECL runkit >= 0.7.0)
runkit_superglobals — Return numerically indexed array of registered superglobals
Returns a numerically indexed array of the currently registered superglobals. i.e. _GET, _POST, _REQUEST, _COOKIE, _SESSION, _SERVER, _ENV, _FILES
The scream extension gives the possibility to disable the silencing error control operator so all errors are being reported. This feature is controlled by an ini setting.
PHP version 5.2.0 or greater.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/scream
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişlik Yeri | Changelog |
|---|---|---|---|
| scream.enabled | Off | PHP_INI_ALL |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Whether or not to enable scream.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
This example demonstrates how scream affects the behaviour of PHP's error handler.
Örnek 1 Enabling and disabling scream at runtime
<?php
// Make sure errors will be shown
ini_set('display_errors', true);
error_reporting(E_ALL);
// Disable scream - this is the default and produce an error
ini_set('scream.enabled', false);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/not-existing-file', 'r');
// Now enable scream and try again
ini_set('scream.enabled', true);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/another-not-existing-file', 'r');
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Opening http://example.com/not-existing-file Opening http://example.com/not-existing-file Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14
Bilginize: Usually one would set this in the php.ini configuration file instead of changing the code.
Windows Cache Extension for PHP is a PHP accelerator that is used to increase the speed of PHP applications running on Windows and Windows Server. Once the Windows Cache Extension for PHP is enabled and loaded by the PHP engine, PHP applications can take advantage of the functionality without any code modifications.
The Windows Cache Extension includes 3 different types of caches. The following describes the purpose of each cache type and the benefits it provides.
PHP Opcode Cache - PHP is a script processing engine, which reads an input stream of data that contains text and/or PHP instructions and produces another stream of data, most commonly in the HTML format. This means that on a web server the PHP engine reads, parses, compiles and executes a PHP script each time that it is requested by a Web client. The reading, parsing and compilation operations put additional load on the web server's CPU and file system and thus affect the overall performance of a PHP web application. The PHP bytecode (opcode) cache is used to store the compiled script bytecode in shared memory so that it can be re-used by PHP engine for subsequent executions of the same script.
File Cache - Even with the PHP bytecode cache enabled, the PHP engine has to accesses the script files on a file system. When PHP scripts are stored on a remote UNC file share, the file operations introduce a significant performance overhead. The Windows Cache Extension for PHP includes a file cache that is used to store the content of the PHP script files in shared memory, which reduces the amount of file system operations performed by PHP engine.
Relative File Path Cache - PHP scripts very often include or operate with files by using relative file paths. Every relative file path has to be converted to an absolute file path by the PHP engine. When a PHP application uses many PHP files and accesses them by relative paths, the operation of resolving relative paths to absolute paths may negatively impact the application's performance. The Windows Cache Extension for PHP provides a Relative File Path cache, which is used to store the mappings between relative and absolute file paths, thereby reducing the number of relative path resolutions that the PHP engine has to perform.
The extension is currently supported only on the following configurations:
Windows OS:
PHP:
Bilginize: The WinCache Extension can only be used when IIS is configured to run PHP via FastCGI.
Bu » PECL eklentisi PHP ile gelmez.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/wincache.
There are two packages for this extension: one package is for PHP versions 5.2.X, and the other package is for PHP 5.3.X. Select the package that is appropriate for the PHP version being used.
To install and enable the extension, follow these steps:
Unpack the package into some temporary location.
Copy the php_wincache.dll file into the PHP extensions folder. Typically this folder is called "ext" and it is located in the same folder with all PHP binary files. For example: C:\Program Files\PHP\ext.
Using a text editor, open the php.ini file, which is usually located in the same folder where all PHP binary files are. For example: C:\Program Files\PHP\php.ini.
Add the following line at the end of the php.ini file: extension = php_wincache.dll.
Save and close the php.ini file.
Recycle the IIS Application Pools for PHP to pick up the configuration changes. To check that the extension has been enabled, create a file called phpinfo.php with a PHP code that calls phpinfo function.
Save the phpinfo.php file in the root folder of a IIS web site that uses PHP, then open a browser and make a request to http://localhost/phpinfo.php. Search within the returned web page for a section called wincache. If the extension is enabled, then the phpinfo output will list the configuration settings provided by the WinCache.
Bilginize: Do not forget to remove phpinfo.php file from the web site's root folder after verifying that extension has been enabled.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
The following table lists and explains the configuration settings provided by the WinCache extension:
| Name | Default | Minimum | Maximum | Changeable | Changelog |
|---|---|---|---|---|---|
| wincache.fcenabled | "1" | "0" | "1" | PHP_INI_ALL | Available since WinCache 1.0.0 |
| wincache.fcenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.fcachesize | "24" | "5" | "85" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.maxfilesize | "256" | "10" | "2048" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ocenabled | "1" | "0" | "1" | PHP_INI_ALL | Available since WinCache 1.0.0 |
| wincache.ocenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ocachesize | "96" | "15" | "255" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.filecount | "4096" | "1024" | "16384" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.chkinterval | "30" | "0" | "300" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ttlmax | "1200" | "0" | "7200" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.enablecli | 0 | 0 | 1 | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ignorelist | NULL | NULL | NULL | PHP_INI_ALL | Available since WinCache 1.0.0 |
| wincache.namesalt | NULL | NULL | NULL | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Defines a list of files that should not be cached by the extension. The files list is specified by using file names only, separated by the pipe symbol - "|".
Örnek 1 wincache.ignorelist example
wincache.ignorelist = "index.php|misc.php|admin.php"
The installation package for WinCache includes a PHP script, wincache.php, that can be used to obtain cache information and statistics.
If the WinCache extension was installed via the Microsoft Web Platform Installer, then this script is located in %SystemDrive%\Program Files\IIS\Windows Cache for PHP\. On a 64-bit version of the Windows Server operating system, the script is located in %SystemDrive%\Program Files (x86)\IIS\Windows Cache for PHP. If the extension was installed manually, then the wincache.php will be located in the same folder from which the content of the installation package was extracted.
To use wincache.php, copy it into a root folder of a Web site or into any subfolder. To protect the script, open it in any text editor and replace the values for USERNAME and PASSWORD constants. If any other IIS authentication is enabled on the server, then follow the instructions in the comments:
Örnek 1 Authentication configuration for wincache.php
/**
* ======================== CONFIGURATION SETTINGS ==============================
* If you do not want to use authentication for this page, set USE_AUTHENTICATION to 0.
* If you use authentication then replace the default password.
*/
define('USE_AUTHENTICATION', 1);
define('USERNAME', 'wincache');
define('PASSWORD', 'wincache');
/**
* The Basic PHP authentication will work only when IIS is configured to support
* Anonymous Authentication' and nothing else. If IIS is configured to support/use
* any other kind of authentication like Basic/Negotiate/Digest etc, this will not work.
* In that case use the array below to define the names of users in your
* domain/network/workgroup which you want to grant access to.
*/
$user_allowed = array('DOMAIN\user1', 'DOMAIN\user2', 'DOMAIN\user3');
/**
* If the array contains string 'all', then all the users authenticated by IIS
* will have access to the page. Uncomment the below line and comment above line
* to grant access to all users who gets authenticated by IIS.
*/
/* $user_allowed = array('all'); */
/** ===================== END OF CONFIGURATION SETTINGS ========================== */
Bilginize: Always protect the wincache.php script by using either the built-in authentication or the server's authentication mechanism. Leaving this script unprotected may compromise the security of your web application and web server.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Bu eklentinin tanımlanmış sabitleri yoktur.
(PECL wincache >= 1.0.0)
wincache_fcache_fileinfo — Retrieves information about files cached in the file cache
Retrieves information about file cache content and its usage.
Array of meta data about file cache başarısızlık durumunda FALSE döner
The array returned by this function contains the following elements:
file_entries - an array that contains the information about all the cached files:
Örnek 1 A wincache_fcache_fileinfo() example
<pre>
<?php
print_r(wincache_fcache_fileinfo());
?>
</pre>
Yukarıdaki örneğin çıktısı:
Array
( [total_cache_uptime] => 3234
[total_file_count] => 5
[total_hit_count] => 0
[total_miss_count] => 1
[file_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 1
[use_time] => 0
[last_check] => 1
[hit_count] => 1
[file_size] => 2435
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_fcache_meminfo — Retrieves information about file cache memory usage
Retrieves information about memory usage by file cache.
Array of meta data about file cache memory usage başarısızlık durumunda FALSE döner
The array returned by this function contains the following elements:
Örnek 1 A wincache_fcache_meminfo() example
<pre>
<?php
print_r(wincache_fcache_meminfo());
?>
</pre>
Yukarıdaki örneğin çıktısı:
Array
(
[memory_total] => 134217728
[memory_free] => 131339120
[num_used_blks] => 361
[num_free_blks] => 3
[memory_overhead] => 5856
)
(PECL wincache >= 1.0.0)
wincache_ocache_fileinfo — Retrieves information about files cached in the opcode cache
Retrieves information about opcode cache content and its usage.
Array of meta data about opcode cache başarısızlık durumunda FALSE döner
The array returned by this function contains the following elements:
file_entries - an array that contains the information about all the cached files:
Örnek 1 A wincache_ocache_fileinfo() example
<pre>
<?php
print_r(wincache_ocache_fileinfo());
?>
</pre>
Yukarıdaki örneğin çıktısı:
Array
(
[total_cache_uptime] => 17357
[total_file_count] => 121
[total_hit_count] => 36562
[total_miss_count] => 201
[file_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 17356
[use_time] => 7
[last_check] => 10
[hit_count] => 454
[function_count] => 0
[class_count] => 1
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_ocache_meminfo — Retrieves information about opcode cache memory usage
Retrieves information about memory usage by opcode cache.
Array of meta data about opcode cache memory usage başarısızlık durumunda FALSE döner
The array returned by this function contains the following elements:
Örnek 1 A wincache_ocache_meminfo() example
<pre>
<?php
print_r(wincache_ocache_meminfo());
?>
</pre>
Yukarıdaki örneğin çıktısı:
Array
(
[memory_total] => 134217728
[memory_free] => 112106972
[num_used_blks] => 15469
[num_free_blks] => 4
[memory_overhead] => 247600
)
(PECL wincache >= 1.0.0)
wincache_refresh_if_changed — Refreshes the cache entries for the cached files
Refreshes the cache entries for the files, whose names were passed in the input argument. If no argument is specified then refreshes all the entries in the cache.
An array of file names for files that need to be refreshed. An absolute or relative file paths can be used.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
WinCache performs regular checks on the cached files to ensure that if any file has changed then the corresponding entry in the cache is updated. By default this check is performed every 30 seconds. If, for example, a PHP script updates another PHP script where the application's configuration settings are stored, then it may happen that after the configuration settings have been saved to a file, the application is still using old settings for some time until the cache is refreshed. In those cases it may be preferrable to refresh the cache right after the file has been changed. The following example shows how this can be done.
Örnek 1 A wincache_refresh_if_changed() example
<?php
$filename = 'C:\inetpub\wwwroot\config.php';
$handle = fopen($filename, 'w+');
if ($handle === FALSE) die('Failed to open file '.$filename.' for writing');
fwrite($handle, '<?php $setting=something; ?>');
fclose($handle);
wincache_refresh_if_changed(array($filename));
?>
(PECL wincache >= 1.0.0)
wincache_rplist_fileinfo — Retrieves information about relative file path cache
Retrieves information about cached mappings between relative file paths and corresponding absolute file paths.
Array of meta data about the relative file path cache başarısızlık durumunda FALSE döner
The array returned by this function contains the following elements:
rplist_entries - an array that contains the information about all the cached relative file paths:
Örnek 1 A wincache_rplist_fileinfo() example
<pre>
<?php
print_r(wincache_rplist_fileinfo());
?>
</pre>
Yukarıdaki örneğin çıktısı:
Array
(
[total_file_count] => 5
[rplist_entries] => Array
(
[1] => Array
(
[relative_path] => checkcache.php
[subkey_data] => c:\inetpub\wwwroot|c:\inetpub\wwwroot\checkcache.php
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_rplist_meminfo — Retrieves information about memory usage by the relative file path cache
Retrieves information about memory usage by relative file path cache.
Array of meta data that describes memory usage by relative file path cache. başarısızlık durumunda FALSE döner
The array returned by this function contains the following elements:
Örnek 1 A wincache_rplist_meminfo() example
<pre>
<?php
print_r(wincache_rplist_meminfo());
?>
</pre>
Yukarıdaki örneğin çıktısı:
Array
(
[memory_total] => 9437184
[memory_free] => 9416744
[num_used_blks] => 23
[num_free_blks] => 1
[memory_overhead] => 416
)
Building WinCache extension will require:
For completing first two steps, follow the step-by-step guide for how to » build PHP on Windows.
For getting the WinCache source code follow the instructions described in Downloading PECL extensions.
The following steps describe how to compile and build WinCache on Windows OS:
Open a command prompt which is used to build PHP
Go to the root folder where PHP sources are present
Run the command:
cscript.exe win32\build\buildconf.js
Run the command:
configure.bat --help
The output will contain a new flag --enable-wincache.
Run the command:
configure.js [all options used to build PHP] --enable-wincache
--enable-wincache is the only extra option which is required to ensure that WinCache extension gets built properly. This option will build WinCache and will statically link it with PHP dll. To build WinCache extension as a stand-alone DLL use the option --enable-wincache=shared.
Run the command:
nmake
The following steps describe how to verify that WinCache has been built correctly:
Go to the folder where the PHP binaries are built
Run the command:
php.exe -n -d extension=php_wincache.dll -re wincache
If WinCache has been built properly, the output of this command will list the INI directives and functions supported by WinCache.
These functions let you read and manipulate ID3 tags. ID3 tags are used in MP3 files to store title of the song, as well as information about the artist, album, genre, year and track number.
Since version 0.2 it is also possible to extract text frames from ID3 v2.2+ tags.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
id3 is part of PECL and can be installed using the PEAR installer. To compile PHP with id3 support, download the sourcecode, put it in php-src/ext/id3 and compile PHP using --enable-id3.
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Most of the id3 functions either let you specify or return a tag version. In order to specify the version please use on of these constants.
(PECL id3 >= 0.2)
id3_get_frame_long_name — Get the long name of an ID3v2 frame
id3_get_frame_long_name() returns the long name for an ID3v2 frame.
An ID3v2 frame
Returns the frame long name or FALSE on errors.
Örnek 1 id3_get_frame_long_name() example
<?php
$longName = id3_get_frame_long_name("TOLY");
echo $longName;
?>
Yukarıdaki örneğin çıktısı:
Original lyricist(s)/text writer(s)
(PECL id3 >= 0.2)
id3_get_frame_short_name — Get the short name of an ID3v2 frame
id3_get_frame_short_name() returns the short name for an ID3v2 frame.
An ID3v2 frame
Returns the frame short name or FALSE on errors.
The values returned by id3_get_frame_short_name() are used in the array returned by id3_get_tag().
Örnek 1 id3_get_frame_short_name() example
<?php
$shortName = id3_get_frame_short_name("TOLY");
echo $shortName;
?>
Yukarıdaki örneğin çıktısı:
originalLyricist
(PECL id3 >= 0.1)
id3_get_genre_id — Get the id for a genre
id3_get_genre_id() returns the id for a genre.
An integer ranging from 0 to 147
The genre id or FALSE on errors.
Örnek 1 id3_get_genre_id() example
<?php
$id = id3_get_genre_id("Alternative");
echo $id;
?>
Yukarıdaki örneğin çıktısı:
20
(PECL id3 >= 0.1)
id3_get_genre_list — Get all possible genre values
id3_get_genre_list() returns an array containing all possible genres that may be stored in an ID3 tag. This list has been created by Eric Kemp and later extended by WinAmp.
This function is useful to provide you users a list of genres from which they may choose one. When updating the ID3 tag you will always have to specify the genre as an integer ranging from 0 to 147.
Returns an array containing all possible genres that may be stored in an ID3 tag.
Örnek 1 id3_get_genre_list() example
<?php
$genres = id3_get_genre_list();
print_r($genres);
?>
Yukarıdaki örneğin çıktısı:
Array
(
[0] => Blues
[1] => Classic Rock
[2] => Country
[3] => Dance
[4] => Disco
[5] => Funk
[6] => Grunge
[7] => Hip-Hop
[8] => Jazz
[9] => Metal
[10] => New Age
[11] => Oldies
[12] => Other
[13] => Pop
[14] => R&B
[15] => Rap
[16] => Reggae
[17] => Rock
[18] => Techno
[19] => Industrial
[20] => Alternative
[21] => Ska
[22] => Death Metal
[23] => Pranks
[24] => Soundtrack
[25] => Euro-Techno
[26] => Ambient
[27] => Trip-Hop
[28] => Vocal
[29] => Jazz+Funk
[30] => Fusion
[31] => Trance
[32] => Classical
[33] => Instrumental
[34] => Acid
[35] => House
[36] => Game
[37] => Sound Clip
[38] => Gospel
[39] => Noise
[40] => Alternative Rock
[41] => Bass
[42] => Soul
[43] => Punk
[44] => Space
[45] => Meditative
[46] => Instrumental Pop
[47] => Instrumental Rock
[48] => Ethnic
[49] => Gothic
[50] => Darkwave
[51] => Techno-Industrial
[52] => Electronic
[53] => Pop-Folk
[54] => Eurodance
[55] => Dream
[56] => Southern Rock
[57] => Comedy
[58] => Cult
[59] => Gangsta
[60] => Top 40
[61] => Christian Rap
[62] => Pop/Funk
[63] => Jungle
[64] => Native US
[65] => Cabaret
[66] => New Wave
[67] => Psychadelic
[68] => Rave
[69] => Showtunes
[70] => Trailer
[71] => Lo-Fi
[72] => Tribal
[73] => Acid Punk
[74] => Acid Jazz
[75] => Polka
[76] => Retro
[77] => Musical
[78] => Rock & Roll
[79] => Hard Rock
[80] => Folk
[81] => Folk-Rock
[82] => National Folk
[83] => Swing
[84] => Fast Fusion
[85] => Bebob
[86] => Latin
[87] => Revival
[88] => Celtic
[89] => Bluegrass
[90] => Avantgarde
[91] => Gothic Rock
[92] => Progressive Rock
[93] => Psychedelic Rock
[94] => Symphonic Rock
[95] => Slow Rock
[96] => Big Band
[97] => Chorus
[98] => Easy Listening
[99] => Acoustic
[100] => Humour
[101] => Speech
[102] => Chanson
[103] => Opera
[104] => Chamber Music
[105] => Sonata
[106] => Symphony
[107] => Booty Bass
[108] => Primus
[109] => Porn Groove
[110] => Satire
[111] => Slow Jam
[112] => Club
[113] => Tango
[114] => Samba
[115] => Folklore
[116] => Ballad
[117] => Power Ballad
[118] => Rhytmic Soul
[119] => Freestyle
[120] => Duet
[121] => Punk Rock
[122] => Drum Solo
[123] => Acapella
[124] => Euro-House
[125] => Dance Hall
[126] => Goa
[127] => Drum & Bass
[128] => Club-House
[129] => Hardcore
[130] => Terror
[131] => Indie
[132] => BritPop
[133] => Negerpunk
[134] => Polsk Punk
[135] => Beat
[136] => Christian Gangsta
[137] => Heavy Metal
[138] => Black Metal
[139] => Crossover
[140] => Contemporary C
[141] => Christian Rock
[142] => Merengue
[143] => Salsa
[144] => Thrash Metal
[145] => Anime
[146] => JPop
[147] => SynthPop
)
(PECL id3 >= 0.1)
id3_get_genre_name — Get the name for a genre id
id3_get_genre_name() returns the name for a genre id.
An integer ranging from 0 to 147
Returns the name as a string.
Örnek 1 id3_get_genre_name() example
<?php
$genre = id3_get_genre_name(20);
echo $genre;
?>
Yukarıdaki örneğin çıktısı:
Alternative
(PECL id3 >= 0.1)
id3_get_tag — Get all information stored in an ID3 tag
id3_get_tag() is used to get all information stored in the id3 tag of the specified file.
The path to the MP3 file
Instead of a filename you may also pass a valid stream resource
Allows you to specify the version of the tag as MP3 files may contain both, version 1.x and version 2.x tags
Since version 0.2 id3_get_tag() also supports ID3 tags of version 2.2, 2.3 and 2.4. To extract information from these tags, pass one of the constants ID3_V2_2, ID3_V2_3 or ID3_V2_4 as the second parameter. ID3 v2.x tags can contain a lot more information about the MP3 file than ID3 v1.x tags.
Returns an associative array with various keys like: title, artist, ..
The key genre will contain an integer between 0 and 147. You may use id3_get_genre_name() to convert it to a human readable string.
Örnek 1 id3_get_tag() example
<?php
$tag = id3_get_tag( "path/to/example.mp3" );
print_r($tag);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[title] => DN-38416
[artist] => Re:\Legion
[album] => Reflections
[year] => 2004
[genre] => 19
)
Örnek 2 id3_get_tag() example
<?php
$tag = id3_get_tag( "path/to/example2.mp3", ID3_V2_3 );
print_r($tag);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[copyright] => Dirty Mac
[originalArtist] => Dirty Mac
[composer] => Marcus Götze
[artist] => Dirty Mac
[title] => Little Big Man
[album] => Demo-Tape
[track] => 5/12
[genre] => (17)Rock
[year] => 2001
)
(PECL id3 >= 0.1)
id3_get_version — Get version of an ID3 tag
id3_get_version() retrieves the version(s) of the ID3 tag(s) in the MP3 file.
If a file contains an ID3 v1.1 tag, it always contains a 1.0 tag, as version 1.1 is just an extension of 1.0.
The path to the MP3 file
Instead of a filename you may also pass a valid stream resource
Returns the version number of the ID3 tag of the file. As a tag can contain ID3 v1.x and v2.x tags, the return value of this function should be bitwise compared with the predefined constants ID3_V1_0, ID3_V1_1 and ID3_V2.
Örnek 1 id3_get_version() example
<?php
$version = id3_get_version( "path/to/example.mp3" );
if ($version & ID3_V1_0) {
echo "Contains a 1.x tag\n";
}
if ($version & ID3_V1_1) {
echo "Contains a 1.1 tag\n";
}
if ($version & ID3_V2) {
echo "Contains a 2.x tag\n";
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Contains a 1.x tag Contains a 1.1 tag
(PECL id3 >= 0.1)
id3_remove_tag — Remove an existing ID3 tag
id3_remove_tag() is used to remove the information stored of an ID3 tag.
The path to the MP3 file
Instead of a filename you may also pass a valid stream resource
Allows you to specify the version of the tag as MP3 files may contain both, version 1.x and version 2.x tags.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 id3_remove_tag() example
<?php
$result = id3_remove_tag( "path/to/example.mp3", ID3_V1_0 );
if ($result === true) {
echo "Tag succesfully removed\n";
}
?>
If the file is writable and contained a 1.0 tag, this will output:
Tag succesfully removed
Bilginize: Currently id3_remove_tag() only supports version 1.0 and 1.1. If you choose to remove a 1.0 tag and the file contains a 1.1 tag, this tag will be removed, as v1.1 is only an extension of 1.0.
(PECL id3 >= 0.1)
id3_set_tag — Update information stored in an ID3 tag
id3_set_tag() is used to change the information stored of an ID3 tag. If no tag has been present, it will be added to the file.
The path to the MP3 file
Instead of a filename you may also pass a valid stream resource
An associative array of tag keys and values
The following keys may be used in the associative array:
| key | possible value | available in version |
|---|---|---|
| title | string with maximum of 30 characters | v1.0, v1.1 |
| artist | string with maximum of 30 characters | v1.0, v1.1 |
| album | string with maximum of 30 characters | v1.0, v1.1 |
| year | 4 digits | v1.0, v1.1 |
| genre | integer value between 0 and 147 | v1.0, v1.1 |
| comment | string with maximum of 30 characters (28 in v1.1) | v1.0, v1.1 |
| track | integer between 0 and 255 | v1.1 |
Allows you to specify the version of the tag as MP3 files may contain both, version 1.x and version 2.x tags
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 id3_set_tag() example
<?php
$data = array(
"title" => "Re:Start",
"artist" => "Re:\Legion",
"comment" => "A nice track"
);
$result = id3_set_tag( "path/to/example.mp3", $data, ID3_V1_0 );
if ($result === true) {
echo "Tag succesfully updated\n";
}
?>
If the file is writable, this will output:
Tag succesfully updated
Bilginize: Currently id3_remove_tag() only supports version 1.0 and 1.1.
KTaglib is an object oriented binding to the taglib library from the KDE project used in projects like Amarok to read and write ID3 and Ogg tags. The library also provides access to audio information. The bindings are designed usually follow the underlying C++ API, but were changed whenever there is a more PHP-like way.
Bilginize: At the moment ktaglib is able to read and write ID3v1 and ID3v2 tags.
If you want to build ktaglib you need at least taglib 1.5 installed. To obtain the taglib see the » taglib project page. Windows DLL's are build static against taglib, therefore there is no need to have taglib installed.
KTaglib support in PHP is not enabled by default. You will need to configure PHP --with-ktaglib[=DIR]
Bilginize: KTaglib is part of PECL.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
KTaglib uses class constants. Most of the constants are mappings to the according Taglib enums and constants.
Represents an MPEG file. MPEG files can have ID3v1, ID3v2 tags and audio properties.
(0.0.1)
KTaglib_MPEG_File::__construct — Opens a new file
Opens a new MPEG file.
The file to read
Örnek 1 Opens a new MP3 file and read the title
<?php
$mpeg = new KTaglib_MPEG_File('example.mp3');
echo $mpeg->getID3v1Tag()->getTitle();
?>
(0.0.1)
KTaglib_MPEG_File::getAudioProperties — Returns an object that provides access to the audio properties
Returns an object that provides access to the audio properties of the mpeg file.
Returns an KTaglib_MPEG_AudioProperties object or false.
(0.0.1)
KTaglib_MPEG_File::getID3v1Tag — Returns an object representing an ID3v1 tag
Returns an object that represents an ID3v1 tag, which can be used to get information about the ID3v1 tag.
Returns an KTaglib_MPEG_ID3v1Tag object or false if there is no ID3v1 tag.
(0.0.1)
KTaglib_MPEG_File::getID3v2Tag — Returns a ID3v2 object
Returns a ID3v2 object for the mpeg file. If no ID3v2 Tag is present, an KTaglib_TagNotFoundException is thrown.
Returns the KTaglib_ID3v2_Tag object of the MPEG file or false if there is no ID3v2 tag
Represents the audio properties of a MPEG file, like length, bitrate or samplerate.
(0.0.1)
KTaglib_MPEG_AudioProperties::getBitrate — Returns the bitrate of the MPEG file
Returns the bitrate of the MPEG file
Returns the bitrate as an integer
(0.0.1)
KTaglib_MPEG_AudioProperties::getChannels — Returns the amount of channels of a MPEG file
Returns the amount of channels of the MPEG file
Returns the channel count as an integer
(0.0.1)
KTaglib_MPEG_AudioProperties::getLayer — Returns the layer of a MPEG file
Returns the layer of the MPEG file (usually 3 for MP3).
Returns the layer as an integer
(0.0.1)
KTaglib_MPEG_AudioProperties::getLength — Returns the length of a MPEG file
Returns the length of the MPEG file
Returns the length as an integer
(0.0.1)
KTaglib_MPEG_AudioProperties::getSampleBitrate — Returns the sample bitrate of a MPEG file
Returns the sample bitrate of the MPEG file
Returns the sample bitrate as an integer
(0.0.1)
KTaglib_MPEG_AudioProperties::getVersion — Returns the version of a MPEG file
Returns the version of the MPEG file header. The possible versions are defined in Tag_MPEG_Header (Version1, Version2, Version2.5).
Returns the version
(0.0.1)
KTaglib_MPEG_AudioProperties::isCopyrighted — Returns the length of a MPEG file
Returns true if the MPEG file is copyrighted
Returns true if the MPEG file is copyrighted
(0.0.1)
KTaglib_MPEG_AudioProperties::isOriginal — Returns the length of a MPEG file
Returns true if the file is marked as the original file
Returns true if the file is marked as the original file
(0.0.1)
KTaglib_MPEG_AudioProperties::isProtectionEnabled — Returns the length of a MPEG file
Returns true if protection mechanism (like DRM) are enabled for this file
Returns true if protection mechanism (like DRM) are enabled for this file
Base class for ID3v1 or ID3v2 tags
(0.0.1)
KTaglib_Tag::getAlbum — Returns the title string from a ID3 tag
Returns the album string of an ID3 tag. This method is implemented in ID3v1 and ID3v2 tags.
Returns the album string
(0.0.1)
KTaglib_Tag::getArtist — Returns the artist string from a ID3 tag
Returns the artist string of an ID3 tag. This method is implemented in ID3v1 and ID3v2 tags.
Returns the artist string
(0.0.1)
KTaglib_Tag::getComment — Returns the comment from a ID3 tag
Returns the comment of an ID3 tag. This method is implemented in ID3v1 and ID3v2 tags.
Returns the comment string
(0.0.1)
KTaglib_Tag::getGenre — Returns the genre from a ID3 tag
Returns the genre of an ID3 tag. This method is implemented in ID3v1 and ID3v2 tags.
Returns the genre string
(0.0.1)
KTaglib_Tag::getTitle — Returns the title string from a ID3 tag
Returns the title string of an ID3 tag. This method is implemented in ID3v1 and ID3v2 tags.
Returns the title string
(0.0.1)
KTaglib_Tag::getTrack — Returns the track number from a ID3 tag
Returns the track number of an ID3 tag. This method is implemented in ID3v1 and ID3v2 tags.
Returns the track number as an integer
(0.0.1)
KTaglib_Tag::getYear — Returns the year from a ID3 tag
Returns the year of an ID3 tag. This method is implemented in ID3v1 and ID3v2 tags.
Returns the year as an integer
(0.0.1)
KTaglib_Tag::isEmpty — Returns true if the tag is empty
Returns true if the tag exists, but is empty. This method is implemented in ID3v1 and ID3v2 tags.
Returns true if the tag is empty, otherwise false.
Represents and ID3v2 tag. It provides a list of ID3v2 frames and can be used to add and remove additional frames.
(0.0.1)
KTaglib_ID3v2_Tag::addFrame — Add a frame to the ID3v2 tag
Adds a frame to the ID3v2 tag. The frame must be a valid KTagLib_ID3v2_Frame object. To save the tag, the save function needs to be invoked.
Returns true on success, otherwise false.
(0.0.1)
KTaglib_ID3v2_Tag::getFrameList — Returns an array of ID3v2 frames, associated with the ID3v2 tag
Returns an array of ID3v2 frames, associated with the ID3v2 tag.
Return an array of KTaglib_ID3v2_Frame objects
The base class for ID3v2 frames. ID3v2 tags are separated in various specialized frames. Some frames can exists multiple times.
(0.0.1)
KTaglib_ID3v2_Frame::getSize — Returns the size of the frame in bytes
Returns the size of the frame in bytes. Please refer to id3.org to see what ID3v2 frames are and how they are defined.
Returns the size of the frame in bytes
(0.0.1)
KTaglib_ID3v2_Frame::__toString — Returns a string representation of the frame
Returns a string representation of the frame. This might be just the frame id, but might contain more information. Please see the ktaglib documentation for more information
Returns a string representation of the frame.
Represents an ID3v2 frame that can hold a picture.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::getDescription — Returns a description for the picture in a picture frame
Returns the attached description for a picture frame in an ID3v2.x frame.
Returns a description for the picture in a picture frame
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getMimeType — Returns the mime type of the picture
Returns the mime type of the image represented by the attached picture frame.
Please notice that this method might return different types. While ID3v2.2 have a mime type that doesn't start with "image/", ID3v2.3 and v2.4 usually start with "image/". Therefore the method might return "image/png" for IDv2.3 frames and just "PNG" for ID3v2.2 frames.
Notice that even the frame is an attached picture, the mime type might not be set and therefore an empty string might be returned.
Returns the mime type of the image represented by the attached picture frame.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getType — Returns the type of the image
Returns the type of the image.
The ID3v2 specification allows an AttachedPictureFrame to set the type of an image. This can be e.g. FrontCover or FileIcon. Please refer to the KTagLib_ID3v2_AttachedPictureFrame class description for a list of available types.
Returns the integer representation of the type.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::savePicture — Saves the picture to a file
Saves the attached picture to the given filename.
Returns true on success, otherwise false
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setMimeType — Set's the mime type of the picture
Sets the mime type of the image. This should in most cases be "image/png" or "image/jpeg".
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::setPicture — Sets the frame picture to the given image
Sets the picture to the give image. The image is loaded from the given filename. Please note that the picture is not saved unless you call the save method of the corresponding file object.
Returns true on success, otherwise false
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setType — Set the type of the image
Sets the type of the image. This can be e.g. FrontCover or FileIcon. Please refer to the KTaglib_ID3v2_AttachedPictureFrame class description for a list of available types and their constant mappings.
The OGG/Vorbis file format, as defined by » http://www.vorbis.com/, is a scheme for compressing audio streams by multiple factors with a minimum of quality loss. This extension adds Ogg Vorbis support to PHP's URL Wrappers. When used in read mode, compressed OGG/Vorbis data is expanded to raw PCM audio in one of six PCM encoding formats listed below.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/oggvorbis
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
| Constant | Definition |
|---|---|
| OGGVORBIS_PCM_U8 | Unsigned 8-bit PCM. |
| OGGVORBIS_PCM_S8 | Signed 8-bit PCM. |
| OGGVORBIS_PCM_U16_LE | Unsigned 16-bit PCM. Little Endian byte order. |
| OGGVORBIS_PCM_U16_BE | Unsigned 16-bit PCM. Big Endian byte order. |
| OGGVORBIS_PCM_S16_LE | Signed 16-bit PCM. Little Endian byte order. |
| OGGVORBIS_PCM_S16_BE | Signed 16-bit PCM. Big Endian byte order. |
| Option | Definition | Relevance | Default |
|---|---|---|---|
| pcm_mode | PCM byte encoding used. See constants below. | Read / Write | OGGVORBIS_PCM_S16_LE |
| rate | PCM Sampling rate. Measured in Hz. | Write only | 44100 |
| bitrate | Vorbis Average Bitrate Encoding / Variable Bitrate Encoding. Measured in bps (ABR) or Quality level (VBR: 0.0 to 1.0). 128000 ABR is rough equal to 0.4 VBR. | Write only | 128000 |
| channels | Number of PCM channels. 1 == Mono, 2 == Stereo. | Write only | 2 |
| serialno | Serial Number of stream within file. Must be unique within file. Because of the potential to select a duplicate serial number within a chained file, make efforts to manually assign unique numbers when encoding. | Write only | Random |
| comments | Associative array of file comments. Will be translated to strtoupper($name) . "=$value". Note: This context option is not available in oggvorbis-0.1 | Write only | array('ENCODER' => 'PHP/OggVorbis, http://pear.php.net/oggvorbis') |
Örnek 1 Reading an OGG/Vorbis file
<?php
dl("oggvorbis.so");
/* By default, ogg:// will decode to Signed 16-bit Little Endian */
$fp = fopen('ogg://myaudio.ogg', 'r');
/* Collect some information about the file. */
$metadata = stream_get_meta_data($fp);
/* Inspect the first song (usually the only song,
but OGG/Vorbis files may be chained) */
$songdata = $metadata['wrapper_data'][0];
echo "OGG/Vorbis file encoded by: {$songdata['vendor']}\n.";
echo " {$songdata['channels']} channels of {$songdata['rate']}Hz sampling encoded at {$songdata['bitrate_nominal']}bps.\n";
foreach($songdata['comments'] as $comment) {
echo " $comment\n";
}
while ($audio_data = fread($fp, 8192)) {
/* Do something with the PCM audio we're extracting from the OGG.
Copying to /dev/dsp is a good target on linux systems,
just remember to setup the device for your sampling mode first. */
}
fclose($fp);
?>
Örnek 2 Encode an audio file to OGG/Vorbis
<?php
dl('oggvorbis.so');
$context = stream_context_create(array('ogg'=>array(
'pcm_mode' => OGGVORBIS_PCM_S8, /* Signed 8bit audio */
'rate' => 44100, /* 44kHz CD quality */
'bitrate' => 0.5, /* Midquality VBR */
'channels' => 1, /* Mono */
'serialno' => 12345))); /* Unique within our stream */
/* Open file for appending. This will "chain" a second OGG stream at the end of the first. */
$ogg = fopen('ogg://mysong.ogg', 'a', false, $context);
$pcm = fopen('mysample.pcm', 'r');
/* Compress the raw PCM audio from mysample.pcm into mysong.ogg */
stream_copy_to_stream($pcm, $ogg);
fclose($pcm);
fclose($ogg);
?>
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu » PECL eklentisi PHP ile gelmez.
Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/openal.
Bu PECL eklentisi için bir DLL mevcut değildir. Ayrıca, Windows üzerinde kurulum bölümüne de bakınız.
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
This extension defines four resource types: Open AL(Device) - Returned by openal_device_open(), Open AL(Context) - Returned by openal_context_create(), Open AL(Buffer) - Returned by openal_buffer_create(), and Open AL(Source) - Returned by openal_source_create().
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
(PECL openal >= 0.1.0)
openal_buffer_create — Generate OpenAL buffer
Returns an Open AL(Buffer) resource on success or FALSE on failure.
(PECL openal >= 0.1.0)
openal_buffer_data — Load a buffer with data
An Open AL(Buffer) resource (previously created by openal_buffer_create()).
Format of data , one of: AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 ve AL_FORMAT_STEREO16
Block of binary audio data in the format and freq specified.
Frequency of data given in Hz.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_buffer_destroy — Destroys an OpenAL buffer
An Open AL(Buffer) resource (previously created by openal_buffer_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_buffer_get — Retrieve an OpenAL buffer property
An Open AL(Buffer) resource (previously created by openal_buffer_create()).
Specific property, one of: AL_FREQUENCY, AL_BITS, AL_CHANNELS ve AL_SIZE.
Returns an integer value appropriate to the property requested başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_buffer_loadwav — Load a .wav file into a buffer
An Open AL(Buffer) resource (previously created by openal_buffer_create()).
Path to .wav file on local file system.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_context_create — Create an audio processing context
An Open AL(Device) resource (previously created by openal_device_open()).
Returns an Open AL(Context) resource on success or FALSE on failure.
(PECL openal >= 0.1.0)
openal_context_current — Make the specified context current
An Open AL(Context) resource (previously created by openal_context_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_context_destroy — Destroys a context
An Open AL(Context) resource (previously created by openal_context_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_context_process — Process the specified context
An Open AL(Context) resource (previously created by openal_context_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_context_suspend — Suspend the specified context
An Open AL(Context) resource (previously created by openal_context_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_device_close — Close an OpenAL device
An Open AL(Device) resource (previously created by openal_device_open()) to be closed.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_device_open — Initialize the OpenAL audio layer
Open an audio device optionally specified by device_desc . If device_desc is not specified the first available audio device will be used.
Returns an Open AL(Device) resource on success or FALSE on failure.
(PECL openal >= 0.1.0)
openal_listener_get — Retrieve a listener property
Property to retrieve, one of: AL_GAIN (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)) ve AL_ORIENTATION (array(float,float,float)).
Returns a float or array of floats (as appropriate) başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_listener_set — Set a listener property
Property to set, one of: AL_GAIN (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)) ve AL_ORIENTATION (array(float,float,float)).
Value to set, either float, or an array of floats as appropriate.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_source_create — Generate a source resource
Returns an Open AL(Source) resource on success or FALSE on failure.
(PECL openal >= 0.1.0)
openal_source_destroy — Destroy a source resource
An Open AL(Source) resource (previously created by openal_source_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_source_get — Retrieve an OpenAL source property
An Open AL(Source) resource (previously created by openal_source_create()).
Property to get, one of: AL_SOURCE_RELATIVE (int), AL_SOURCE_STATE (int), AL_PITCH (float), AL_GAIN (float), AL_MIN_GAIN (float), AL_MAX_GAIN (float), AL_MAX_DISTANCE (float), AL_ROLLOFF_FACTOR (float), AL_CONE_OUTER_GAIN (float), AL_CONE_INNER_ANGLE (float), AL_CONE_OUTER_ANGLE (float), AL_REFERENCE_DISTANCE (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)), AL_DIRECTION (array(float,float,float)).
Returns the type associated with the property being retrieved başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_source_pause — Pause the source
An Open AL(Source) resource (previously created by openal_source_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_source_play — Start playing the source
An Open AL(Source) resource (previously created by openal_source_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_source_rewind — Rewind the source
An Open AL(Source) resource (previously created by openal_source_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_source_set — Set source property
An Open AL(Source) resource (previously created by openal_source_create()).
Property to set, one of: AL_BUFFER (OpenAL(Source)), AL_LOOPING (bool), AL_SOURCE_RELATIVE (int), AL_SOURCE_STATE (int), AL_PITCH (float), AL_GAIN (float), AL_MIN_GAIN (float), AL_MAX_GAIN (float), AL_MAX_DISTANCE (float), AL_ROLLOFF_FACTOR (float), AL_CONE_OUTER_GAIN (float), AL_CONE_INNER_ANGLE (float), AL_CONE_OUTER_ANGLE (float), AL_REFERENCE_DISTANCE (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)), AL_DIRECTION (array(float,float,float)).
Value to assign to specified property . Refer to the description of property for a description of the value(s) expected.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_source_stop — Stop playing the source
An Open AL(Source) resource (previously created by openal_source_create()).
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL openal >= 0.1.0)
openal_stream — Begin streaming on a source
An Open AL(Source) resource (previously created by openal_source_create()).
Format of data , one of: AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 ve AL_FORMAT_STEREO16
Frequency of data to stream given in Hz.
Returns a stream resource on success başarısızlık durumunda FALSE döner.
These package allows you to access Kerberos V administration servers. You can create, modify, and delete Kerberos V principals and policies.
More information about Kerberos can be found at » http://web.mit.edu/kerberos/www/.
Documentation for Kerberos and KADM5 can be found at » http://web.mit.edu/kerberos/www/krb5-1.2/krb5-1.2.8/doc/admin_toc.html.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
These functions allow you to access Kerberos administration servers. In order to have these functions available, you must compile PHP with KADM5 support by using the --with-kadm5 configurable option. If you use this option without specifying the path to KADM5, PHP will use the built-in KADM5 client libraries. Users who run other applications that use KADM5 (for example, running PHP 4 and PHP 5 as concurrent apache modules, or auth-kadm5) should always specify the path to KADM5: --with-kadm5=/path/to/kadm5. This will force PHP to use the client libraries installed by KADM5, avoiding any conflicts.
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
The functions kadm5_create_principal(), kadm5_modify_principal(), and kadm5_modify_principal() allow to specify special attributes using a bitfield. The symbols are defined below:
| constant |
|---|
| KRB5_KDB_DISALLOW_POSTDATED |
| KRB5_KDB_DISALLOW_FORWARDABLE |
| KRB5_KDB_DISALLOW_TGT_BASED |
| KRB5_KDB_DISALLOW_RENEWABLE |
| KRB5_KDB_DISALLOW_PROXIABLE |
| KRB5_KDB_DISALLOW_DUP_SKEY |
| KRB5_KDB_DISALLOW_ALL_TIX |
| KRB5_KDB_REQUIRES_PRE_AUTH |
| KRB5_KDB_REQUIRES_HW_AUTH |
| KRB5_KDB_REQUIRES_PWCHANGE |
| KRB5_KDB_DISALLOW_SVR |
| KRB5_KDB_PWCHANGE_SERVER |
| KRB5_KDB_SUPPORT_DESMD5 |
| KRB5_KDB_NEW_PRINC |
The functions kadm5_create_principal(), kadm5_modify_principal(), and kadm5_get_principal() allow to specify or return principal's options as an associative array. The keys for the associative array are defined as string constants below:
| constant | funcdef | description |
|---|---|---|
| KADM5_PRINCIPAL | long | The expire time of the princial as a Kerberos timestamp. |
| KADM5_PRINC_EXPIRE_TIME | long | The expire time of the princial as a Kerberos timestamp. |
| KADM5_LAST_PW_CHANGE | long | The time this principal's password was last changed. |
| KADM5_PW_EXPIRATION | long | The expire time of the principal's current password, as a Kerberos timestamp. |
| KADM5_MAX_LIFE | long | The maximum lifetime of any Kerberos ticket issued to this principal. |
| KADM5_MAX_RLIFE | long | The maximum renewable lifetime of any Kerberos ticket issued to or for this principal. |
| KADM5_MOD_NAME | string | The name of the Kerberos principal that most recently modified this principal. |
| KADM5_MOD_TIME | long | The time this principal was last modified, as a Kerberos timestamp. |
| KADM5_KVNO | long | The version of the principal's current key. |
| KADM5_POLICY | string | The name of the policy controlling this principal. |
| KADM5_CLEARPOLICY | long | Standard procedure is to assign the 'default' policy to new principals. KADM5_CLEARPOLICY suppresses this behaviour. |
| KADM5_LAST_SUCCESS | long | The KDC time of the last successfull AS_REQ. |
| KADM5_LAST_FAILED | long | The KDC time of the last failed AS_REQ. |
| KADM5_FAIL_AUTH_COUNT | long | The number of consecutive failed AS_REQs. |
| KADM5_RANDKEY | long | Generates a random password for the principal. The parameter password will be ignored. |
| KADM5_ATTRIBUTES | long | A bitfield of attributes for use by the KDC. |
This simple example shows how to connect, query, print resulting principals and disconnect from a KADM5 database.
Örnek 1 KADM5 extension overview example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
$principals = kadm5_get_principals($handle);
for( $i=0; $i<count($principals); $i++)
print "$principals[$i]<br>\n";
print "<h1>get_policies</h1>\n";
$policies = kadm5_get_policies($handle);
for( $i=0; $i<count($policies); $i++)
print "$policies[$i]<br>\n";
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
$keys = array_keys($options);
for( $i=0; $i<count($keys); $i++) {
$value = $options[$keys[$i]];
print "$keys[$i]: $value<br>\n";
}
$options = array(KADM5_PRINC_EXPIRE_TIME => 0);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_chpass_principal — Changes the principal's password
kadm5_chpass_principal() sets the new password password for the principal .
A KADM5 handle.
The principal.
The new password.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 Example of changing principal's password
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_chpass_principal($handle, "burbach@GONICUS.LOCAL", "newpassword");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_create_principal — Creates a kerberos principal with the given parameters
Creates a principal with the given password .
A KADM5 handle.
The principal.
If password is omitted or is NULL, a random key will be generated.
It is possible to specify several optional parameters within the array options . Allowed are the following options: KADM5_PRINC_EXPIRE_TIME, KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES, KADM5_MAX_LIFE, KADM5_KVNO, KADM5_POLICY, KADM5_CLEARPOLICY, KADM5_MAX_RLIFE.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 Example of principal's creation
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_delete_principal — Deletes a kerberos principal
Removes the principal from the Kerberos database.
A KADM5 handle.
The removed principal.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 kadm5_delete_principal() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_delete_principal($handle, "burbach@GONICUS.LOCAL");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_destroy — Closes the connection to the admin server and releases all related resources
Closes the connection to the admin server and releases all related resources.
A KADM5 handle.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL kadm5 >= 0.2.3)
kadm5_flush — Flush all changes to the Kerberos database
Flush all changes to the Kerberos database, leaving the connection to the Kerberos admin server open.
A KADM5 handle.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL kadm5 >= 0.2.3)
kadm5_get_policies — Gets all policies from the Kerberos database
Gets an array containing the policies's names.
A KADM5 handle.
Returns array of policies on success başarısızlık durumunda FALSE döner.
Örnek 1 kadm5_get_policies() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_policies</h1>\n";
foreach (kadm5_get_policies($handle) as $policy) {
echo "$policy<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principal — Gets the principal's entries from the Kerberos database
Gets the principal's entries from the Kerberos database.
A KADM5 handle.
The principal.
Returns array of options containing the following keys: KADM5_PRINCIPAL, KADM5_PRINC_EXPIRE_TIME, KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES, KADM5_MAX_LIFE, KADM5_MOD_NAME, KADM5_MOD_TIME, KADM5_KVNO, KADM5_POLICY, KADM5_MAX_RLIFE, KADM5_LAST_SUCCESS, KADM5_LAST_FAILED, KADM5_FAIL_AUTH_COUNT on success başarısızlık durumunda FALSE döner.
Örnek 1 kadm5_get_principal() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
foreach ($options as $key => $value) {
echo "$key: $value<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principals — Gets all principals from the Kerberos database
kadm5_get_principals() returns an array containing the principals's names.
A KADM5 handle.
Returns array of principals on success başarısızlık durumunda FALSE döner.
Örnek 1 kadm5_get_principals() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
foreach (kadm5_get_principals($handle) as $principal) {
echo "$principal<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_init_with_password — Opens a connection to the KADM5 library
Opens a connection with the KADM5 library using the principal and the given password to obtain initial credentials from the admin_server .
The server.
Defines the authentication domain for the connection.
The principal.
If password is omitted or is NULL, a random key will be generated.
Returns a KADM5 handle on success başarısızlık durumunda FALSE döner.
Örnek 1 KADM5 initialization example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
Bilginize: Connection should be closed after use with kadm5_destroy().
(PECL kadm5 >= 0.2.3)
kadm5_modify_principal — Modifies a kerberos principal with the given parameters
Modifies a principal according to the given options .
A KADM5 handle.
The principal.
It is possible to specify several optional parameters within the array options . Allowed are the following options: KADM5_PRINC_EXPIRE_TIME, KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES, KADM5_MAX_LIFE, KADM5_KVNO, KADM5_POLICY, KADM5_CLEARPOLICY, KADM5_MAX_RLIFE. KADM5_FAIL_AUTH_COUNT.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 Example of modifying principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH;
$options = array(KADM5_PRINC_EXPIRE_TIME => 3451234,
KADM5_POLICY => "gonicus",
KADM5_ATTRIBUTES => $attributes);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
This package is based on the libradius (Remote Authentication Dial In User Service) of FreeBSD. It allows clients to perform authentication and accounting by means of network requests to remote servers.
This PECL extension adds full support for Radius Authentication (» RFC 2865) and Radius Accounting (» RFC 2866). This package is available for Unix (tested on FreeBSD and Linux) and for Windows.
Bilginize: An exact description for libradius can be found » here. A detailed description of the configuration file can be found » here.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Howto install the package?
or if you would like to have it as .so:
For Windows I recommend to use the php_radius.dll from » http://snaps.php.net/. Bu PECL eklentisi için bir DLL mevcut değildir. Ayrıca, Windows üzerinde kurulum bölümüne de bakınız.
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
Type of Service, one of:
Framed Protocol, one of:
Compression, one of:
NAS port type, one of:
Accounting status type, one of:
Accounting authentic, one of:
Accounting terminate cause, one of:
Microsoft specific vendor attributes (» RFC 2548), one of:
Howto start?
Take also a look at the examples in this package.
The package contains an example php script. This script demonstrates howto authenticate with radius using PAP or CHAP (md5). If you authenticate with Microsoft Radius servers then its not possible to use CHAP (md5). If you would like to authenticate with Microsoft Servers you have to use MS-CHAPv1 or MS-CHAPv2, but its more complicated, because you need md4, sha1 and des to generate the right data. The enclosed examples demonstrate all authentication-methods, including MS-CHAPv1 and MS-CHAPv2. To get the MS-CHAP to work you need the mcrypt and the mhash extension, starting with version 1.2 of the package, the mcrypt extension is no longer needed.
If you have comments, bugfixes, enhancements or want to help to develop this you can send me a mail at » mbretter@php.net.
(PECL radius >= 1.1.0)
radius_acct_open — Creates a Radius handle for accounting
Returns a handle on success, FALSE on error. This function only fails if insufficient memory is available.
Örnek 1 radius_acct_open() example
<?php
$res = radius_acct_open ()
or die ("Could not create handle");
print("Handle successfully created");
?>
(PECL radius >= 1.1.0)
radius_add_server — Adds a server
radius_add_server() may be called multiple times, and it may be used together with radius_config(). At most 10 servers may be specified. When multiple servers are given, they are tried in round-robin fashion until a valid response is received, or until each server's max_tries limit has been reached.
The hostname parameter specifies the server host, either as a fully qualified domain name or as a dotted-quad IP address in text form.
The port
specifies the UDP port to contact on
the server. If port is given as 0, the library looks up the
radius/udp
or
radacct/udp
service in the
network services database, and uses the port found there. If no entry
is found, the library uses the standard Radius ports, 1812 for
authentication and 1813 for accounting.
The shared secret for the server host is passed to the secret parameter. The Radius protocol ignores all but the leading 128 bytes of the shared secret.
The timeout for receiving replies from the server is passed to the timeout parameter, in units of seconds.
The maximum number of repeated requests to make before giving up is passed into the max_tries .
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 radius_add_server() example
<?php
if (!radius_add_server($res, 'radius.example.com', 1812, 'testing123', 3, 3)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br>";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_auth_open — Creates a Radius handle for authentication
Returns a handle on success, FALSE on error. This function only fails if insufficient memory is available.
Örnek 1 radius_auth_open() example
<?php
$radh = radius_auth_open()
or die ("Could not create handle");
echo "Handle successfully created";
?>
(PECL radius >= 1.1.0)
radius_close — Frees all ressources
It is not needed to call this function because php frees all resources at the end of each request.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL radius >= 1.1.0)
radius_config — Causes the library to read the given configuration file
Before issuing any Radius requests, the library must be made aware of the servers it can contact. The easiest way to configure the library is to call radius_config(). radius_config() causes the library to read a configuration file whose format is described in » radius.conf.
The pathname of the configuration file is passed as the file argument to radius_config(). The library can also be configured programmatically by calls to radius_add_server().
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL radius >= 1.1.0)
radius_create_request — Create accounting or authentication request
A Radius request consists of a code specifying the kind of request, and zero or more attributes which provide additional information. To begin constructing a new request, call radius_create_request().
Bilginize: Attention: You must call this function, before you can put any attribute!
Type is RADIUS_ACCESS_REQUEST or RADIUS_ACCOUNTING_REQUEST.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 radius_create_request() example
<?php
if (!radius_create_request($res, RADIUS_ACCESS_REQUEST)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_cvt_addr — Converts raw data to IP-Address
Örnek 1 radius_cvt_addr() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_IP_ADDRESS:
$ip = radius_cvt_addr($data);
echo "IP: $ip<br>\n";
break;
case RADIUS_FRAMED_IP_NETMASK:
$mask = radius_cvt_addr($data);
echo "MASK: $mask<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_int — Converts raw data to integer
Örnek 1 radius_cvt_int() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_MTU:
$mtu = radius_cvt_int($data);
echo "MTU: $mtu<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_string — Converts raw data to string
Örnek 1 radius_cvt_string() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FILTER_ID:
$id = radius_cvt_string($data);
echo "Filter ID: $id<br>\n";
break;
}
}
?>
(PECL radius >= 1.2.0)
radius_demangle_mppe_key — Derives mppe-keys from mangled data
When using MPPE with MS-CHAPv2, the send- and recv-keys are mangled (see » RFC 2548), however this function is useless, because I don't think that there is or will be a PPTP-MPPE implementation in PHP.
Returns the demangled string, or FALSE on error.
(PECL radius >= 1.2.0)
radius_demangle — Demangles data
Some data (Passwords, MS-CHAPv1 MPPE-Keys) is mangled for security reasons, and must be demangled before you can use them.
Returns the demangled string, or FALSE on error.
(PECL radius >= 1.1.0)
radius_get_attr — Extracts an attribute
Like Radius requests, each response may contain zero or more attributes. After a response has been received successfully by radius_send_request(), its attributes can be extracted one by one using radius_get_attr(). Each time radius_get_attr() is called, it gets the next attribute from the current response.
Returns an associative array containing the attribute-type and the data, or error number <= 0.
Örnek 1 radius_get_attr() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Got Attr:%d %d Bytes %s\n", $attr, strlen($data), bin2hex($data));
}
?>
(PECL radius >= 1.1.0)
radius_get_vendor_attr — Extracts a vendor specific attribute
If radius_get_attr() returns RADIUS_VENDOR_SPECIFIC, radius_get_vendor_attr() may be called to determine the vendor.
Returns an associative array containing the attribute-type, vendor and the data, or FALSE on error.
Örnek 1 radius_get_vendor_attr() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Got Attr:%d %d Bytes %s\n", $attr, strlen($data), bin2hex($data));
if ($attr == RADIUS_VENDOR_SPECIFIC) {
$resv = radius_get_vendor_attr($data);
if (is_array($resv)) {
$vendor = $resv['vendor'];
$attrv = $resv['attr'];
$datav = $resv['data'];
printf("Got Vendor Attr:%d %d Bytes %s\n", $attrv, strlen($datav), bin2hex($datav));
}
}
}
?>
(PECL radius >= 1.1.0)
radius_put_addr — Attaches an IP-Address attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL radius >= 1.1.0)
radius_put_attr — Attaches a binary attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 radius_put_attr() example
<?php
mt_srand(time());
$chall = mt_rand();
$chapval = md5(pack('Ca*',1 , 'sepp' . $chall));
$pass = pack('CH*', 1, $chapval);
if (!radius_put_attr($res, RADIUS_CHAP_PASSWORD, $pass)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_int — Attaches an integer attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 radius_put_int() example
<?php
if (!radius_put_int($res, RAD_FRAMED_PROTOCOL, RAD_PPP)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_string — Attaches a string attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 radius_put_string() example
<?php
if (!radius_put_string($res, RADIUS_USER_NAME, 'billy')) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_addr — Attaches a vendor specific IP-Address attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL radius >= 1.1.0)
radius_put_vendor_attr — Attaches a vendor specific binary attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Örnek 1 radius_put_vendor_attr() example
<?php
if (!radius_put_vendor_attr($res, RADIUS_VENDOR_MICROSOFT, RAD_MICROSOFT_MS_CHAP_CHALLENGE, $challenge)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_int — Attaches a vendor specific integer attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL radius >= 1.1.0)
radius_put_vendor_string — Attaches a vendor specific string attribute
Bu işlev hala belgelendirilmemiştir; sadece değiştirge listesi mevcuttur.
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
(PECL radius >= 1.1.0)
radius_request_authenticator — Returns the request authenticator
The request authenticator is needed for demangling mangled data like passwords and encryption-keys.
Returns the request authenticator as string, or FALSE on error.
(PECL radius >= 1.1.0)
radius_send_request — Sends the request and waites for a reply
After the Radius request has been constructed, it is sent by radius_send_request().
The radius_send_request() function sends the request and waits for a valid reply, retrying the defined servers in round-robin fashion as necessary.
If a valid response is received, radius_send_request() returns the Radius code which specifies the type of the response. This will typically be RADIUS_ACCESS_ACCEPT, RADIUS_ACCESS_REJECT, or RADIUS_ACCESS_CHALLENGE. If no valid response is received, radius_send_request() returns FALSE.
(PECL radius >= 1.1.0)
radius_server_secret — Returns the shared secret
The shared secret is needed as salt for demangling mangled data like passwords and encryption-keys.
Returns the server's shared secret as string, or FALSE on error.
(PECL radius >= 1.1.0)
radius_strerror — Returns an error message
If Radius-functions fail then they record an error message. This error message can be retrieved with this function.
Returns error messages as string from failed radius functions.
Takvim eklentisi farklı takvim biçimleri arasında dönüşüm işlemlerini basitleştirmek için işlevler sunar. Ara biçim veya standart olarak Jülyen Gün Sayısını alır. Jülyen Gün Sayısı M.Ö. 1 Ocak 4713 tarihinden başlayarak geçen günlerin sayısıdır. Takvim biçimleri arasında dönüşüm yapmak için önce Jülyen Gün Sayısını bulmalı ve sonra bu bilgiyi istediğiniz takvim bilgisine dönüştürmelisiniz. Jülyen Gün Sayısı, Jülyen takviminden çok farklıdır! Jülyen Gün Sayısı hakkında daha fazla bilgi için » http://www.hermetic.ch/cal_stud/jdn.htm adresini ziyaret edebilirsiniz. Takvim biçimleri hakkında ise » http://www.fourmilab.ch/documents/calendar/ adresinden yararlanabilirsiniz. Bu adresten yapılan alıntılar tırnak işaretleri içerisinde gösterilmiştir.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
İşlevlerin çalışabilmesi için, PHP'yi --enable-calendar seçeneği ile derlemelisiniz.
PHP'nin Windows sürümünde bu eklenti yerleşik olarak gelmektedir. Bu işlevleri Windows'ta kullanmak için herhangi bir eklenti kurmanıza gerek yoktur.
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
Aşağıdaki sabitler, PHP 4.3.0 ve sonraki sürümlerde geçerlidir:
Aşağıdaki sabitler, PHP 5.0.0 ve sonraki sürümlerde geçerlidir:
(PHP 4 >= 4.1.0, PHP 5)
cal_days_in_month — Seçilen takvime ve yıla göre istenen aydaki gün sayısını geri döndürür
İşlev seçilen takvim , yil ve ay değiştirgelerine göre gün sayısını geri döndürecektir.
Hesaplama yapılacak takvim
Seçilen takvimdeki ay
Seçilen takvimdeki yıl
Değiştirge olarak verilen takvimde, seçilen aydaki gün sayısı
Örnek 1 cal_days_in_month() örneği
<?php
$num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
echo "2003 yılı Ağustos ayında $num gün vardır";
?>
(PHP 4 >= 4.1.0, PHP 5)
cal_from_jd — Jülyen Gün Sayısını, istenen takvim biçimine çevirir
cal_from_jd() işlevi jg değiştirgesi ile verilen Jülyen Gün Sayısını takvim değiştirgesi ile verilen takvim gününe çevirir. Desteklenen takvim değerleri CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH ve CAL_FRENCH'dir.
Tamsayı olarak Jülyen Gün Sayısı
İstenen takvim
Ay, gün, yıl, haftanın günü, gün ve ayın kısa ve uzun isimleri, "ay/gün/yıl" biçiminde tarih dizgesi öğelerini içeren dizi değişken döner.
Örnek 1 cal_from_jd() örneği
<?php
$today = unixtojd(mktime(0, 0, 0, 8, 16, 2003));
print_r(cal_from_jd($today, CAL_GREGORIAN));
?>
Yukarıdaki örneğin çıktısı:
Array
(
[date] => 8/16/2003
[month] => 8
[day] => 16
[year] => 2003
[dow] => 6
[abbrevdayname] => Sat
[dayname] => Saturday
[abbrevmonth] => Aug
[monthname] => August
)
(PHP 4 >= 4.1.0, PHP 5)
cal_info — Değiştirge olarak verilen takvim hakkında bilgi döner
cal_info() işlevi, verilmiş takvim değiştirgesine ait bilgiler içeren dizi değişken döner.
Dizi değişken şu öğeleri içerir; calname, calsymbol, month, abbrevmonth ve maxdaysinmonth. takvim değiştirgesi olarak:
Eğer takvim değeri verilmez ise, desteklenen bütün takvimler hakkında bilgi içeren dizi dönecektir.
Bilgi verilecek takvim. Eğer belirtilmezse, bütün takvimler hakkında bilgi döner.
| Sürüm: | Açıklama |
|---|---|
| 5.0'dan beri | takvim değiştirgesi seçimlik olmuştur ve ihmal edilirse, öntanımlı olarak "bütün takvimler" hakkında bilgi döner. |
Örnek 1 cal_info() örneği
<?php
$info = cal_info(0);
print_r($info);
?>
Yukarıdaki örneğin çıktısı:
Array
(
[months] => Array
(
[1] => January
[2] => February
[3] => March
[4] => April
[5] => May
[6] => June
[7] => July
[8] => August
[9] => September
[10] => October
[11] => November
[12] => December
)
[abbrevmonths] => Array
(
[1] => Jan
[2] => Feb
[3] => Mar
[4] => Apr
[5] => May
[6] => Jun
[7] => Jul
[8] => Aug
[9] => Sep
[10] => Oct
[11] => Nov
[12] => Dec
)
[maxdaysinmonth] => 31
[calname] => Gregorian
[calsymbol] => CAL_GREGORIAN
)
(PHP 4 >= 4.1.0, PHP 5)
cal_to_jd — Desteklenen bir takvimden Jülyen Gün Sayısına dönüşüm yapar
cal_to_jd() işlevi calendar değiştirgesine göre Jülyen Gün Sayısını hesaplar. Desteklenen takvim türleri CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH ve CAL_FRENCH'dir.
Dönüşüm yapılacak takvim CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH veya CAL_FRENCH değerlerinden biri olabilir.
Sayı olarak ay değeri, geçerli olan değer aralığı takvim değiştirgesine bağlıdır
Sayı olarak gün değeri, gerçerli olan değer aralığı takvim değiştirgesine bağlıdır
Sayı olarak yıl değeri, geçerli olan değer aralığı takvim değiştirgesine bağlıdır
Jülyen Gün Sayısı.
(PHP 4, PHP 5)
easter_date — Verilen yıl için paskalya gece yarısının unix zaman damgasını döner
Verilen yıl için paskalya gece yarısının unix zaman damgasını döner.
Bu işlev, yıl unix zaman damgasının geçerli olduğu aralık dışında (1970'den önce 2037'den sonra) verilirse bir uyarı üretir.
Paskalya günü, ilk olarak M.S. 325 yılında İznik Konseyi tarafından, İlk dolunaydan veya Bahar ılımından (ekinoks) sonraki ilk pazar günü olarak tanımlanmıştır. Ilımın daima 21 Mart tarihine rastladığı varsayılır ve hesaplama dolunayın ve sonraki pazar gününün hesaplanmasına indirgenir. Kullanılan algoritma Dionysius Exiguus tarafından 532 yılında tanıtıldı. Jülyen takvimi döneminde (1753'den önceki yıllar) ayın evrelerini takip etmek için basit 19 yıllık çevrim kullanıldı. Gregoryen takvimi döneminde (1753'den sonraki yıllar - Clavius ve Lilius tarafından hazırlandı ve XIII Papa Gregory tarafından Ekim 1582'de tanıtıldı, Eylül 1752'de Britanya ve kolonilerine yayıldı) çevrimin daha doğru olması için 2 düzeltme değişkeni eklendi.
(Simon Kershaw tarafından yazılan C programı temel alınmıştır, <webmaster at ely.anglican dot org>)
1970-2037 aralığındaki değerlerden biri.
Unix zaman damgası olarak paskalya günü.
| Sürüm: | Açıklama |
|---|---|
| 4.3.0 sürümünden beri | yil değiştirgesi seçime bağlıdır, ihmal edilirse, öntanımlı olarak yerel zamanda, içinde bulunulan yıla eşittir. |
Örnek 1 easter_date() örneği
<?php
echo date("M-d-Y", easter_date(1999)); // Apr-04-1999
echo date("M-d-Y", easter_date(2000)); // Apr-23-2000
echo date("M-d-Y", easter_date(2001)); // Apr-15-2001
?>
(PHP 4, PHP 5)
easter_days — Verilen yıl için Paskalya zamanına, 21 Marttan sonraki kalan gün sayısını verir.
Verilen yıl için Paskalya zamanına, 21 Marttan sonraki kalan gün sayısını verir. Yıl belirtilmezse öntanımlı olarak içinde bulunulan yıl alınır.
Bu işlev Unix zaman damgasının dışına düşen yıllarda (1970'den önce, 2037'den sonra), Paskalya gününü hesaplamak için easter_date() işlevi yerine kullanılabilir.
Paskalya günü, ilk olarak M.S. 325 yılında İznik Konseyi tarafından, İlk dolunaydan veya Bahar ılımından (ekinoks) sonraki ilk pazar günü olarak tanımlanmıştır. Ilımın daima 21 Mart tarihine rastladığı varsayılır ve hesaplama dolunayın ve sonraki pazar gününün hesaplanmasına indirgenir. Kullanılan algoritma Dionysius Exiguus tarafından 532 yılında tanıtıldı. Jülyen takvimi döneminde (1753'den önceki yıllar) ayın evrelerini takip etmek için basit 19 yıllık çevrim kullanıldı. Gregoryen takvimi döneminde (1753'den sonraki yıllar - Clavius ve Lilius tarafından hazırlandı ve XIII Papa Gregory tarafından Ekim 1582'de tanıtıldı, Eylül 1752'de Britanya ve kolonilerine yayıldı) çevrimin daha doğru olması için 2 düzeltme değişkeni eklendi.
(Simon Kershaw tarafından yazılan C programı temel alınmıştır, <webmaster at ely.anglican dot org>)
Pozitif sayı olarak yıl
CAL_EASTER_ROMAN sabiti verildiği zaman 1582 - 1752 yılları için Gregoryen takvimi temel alınarak hesaplama yapar. Diğer sabitler için takvim sabitleri adresine bakınız.
Verilen yil değiştirgesi için Paskalya zamanına, 21 Marttan sonraki kalan gün sayısını verir.
| Sürüm: | Açıklama |
|---|---|
| 4.3.0 sürümünden beri | yil değiştirgesi seçimliktir, ihmal edilirse yerel zamana göre içinde bulunulan yıla eşittir. |
| 4.3.0 sürümünden beri | yontem değiştirgesi eklenmiştir. |
Örnek 1 easter_days() örneği
<?php
echo easter_days(1999); // 14, i.e. April 4
echo easter_days(1492); // 32, i.e. April 22
echo easter_days(1913); // 2, i.e. March 23
?>
(PHP 4, PHP 5)
FrenchToJD — Fransız İhtilali takvim tarihini, Jülyen Gün Sayısına çevirir
Fransız Cumhuriyet Takvim tarihini, Jülyen Gün Sayısına çevirir.
Bu işlev, sadece 1'den 14'e kadar olan yılları çevirir (Gregoryen tarihleri 22 Eylül 1792'den 22 Eylül 1806'ya kadar). Bu aralık takvimin kullanımda olduğu zamanlardan daha geniş bir dönemi kapsar.
1'den (Vendémiaire için), 13'e (her yılın sonundaki 5-6 gün için) kadar sayı olarak ay değeri
1'den 30'a kadar sayı olarak gün değeri
1 ile 14 arasında yıl değeri.
Tamsayı olarak, verilmiş Fransız İhtilali Tarihine karşılık gelen Jülyen Gün Sayısı.
(PHP 4, PHP 5)
GregorianToJD — Gregoryen tarihini, Jülyen Gün Sayısına çevirir
Gregoryen Takvimi için geçerli olan aralık M.Ö. 4714 ile M.S. 9999 arasıdır
Bu işlev M.Ö. 4714'e kadar olan tarihleri işleyebilse de, bu tip bir kullanım anlamlı değildir. Gregoryen takvimi 15 Ekim 1582'ye (Jülyen takvimine göre 5 Ekim 1582) kadar kullanılmamıştır. Hatta bazı ülkeler bu tarihten daha sonra kullanmaya başlamıştır, örneğin; İngiliz krallığı 1752, SSCB 1918 ve Yunanistan 1923'de geçmiştir. Birçok Avrupa ülkesi Gregoryen takviminden önce Jülyen takvimini kullanmıştır.
1'den (Ocak), 12'ye (Aralık) kadar ay değeri
1 ile 31 arasında gün değeri
-4714 ile 9999 arasında yıl değeri
Gregoryen tarihine karşılık tamsayı olarak Jülyen Gün Sayısı.
Örnek 1 Takvim işlevleri örneği
<?php
$jd = GregorianToJD(10, 11, 1970);
echo "$jd\n";
$gregorian = JDToGregorian($jd);
echo "$gregorian\n";
?>
(PHP 4, PHP 5)
JDDayOfWeek — Haftanın gününü verir
Haftanın gününü verir. Değiştirge olarak verilen yöntem'e göre dizge veya tamsayı geri döner.
Tamsayı olarak Jülyen Gün Sayısı
| Yöntem | Anlamı |
|---|---|
| 0 (Öntanımlı) | Tamsayı olarak gün sayısını döner (0=Pazar, 1=Pazartesi, v.b.) |
| 1 | Haftanın gününün dizge karşılığını döner (İngilizce-Gregoryen) |
| 2 | Günün kısaltılmış değerini döner (İngilizce-Gregoryen) |
Dizge ya da tamsayı olarak, hafta gününün gregoryen değeri.
(PHP 4, PHP 5)
JDMonthName — Ay adını geri döner
Ay adını dizge olarak döndürür. takvim Jülyen Gün Sayısının hangi takvim ve ay adına çevrileceğini belirler.
| Yöntem | Anlamı | Değerleri |
|---|---|---|
| 0 | Gregoryen - kısaltılmış | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 1 | Gregoryen | January, February, March, April, May, June, July, August, September, October, November, December |
| 2 | Jülyen - kısaltılmış | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 3 | Jülyen | January, February, March, April, May, June, July, August, September, October, November, December |
| 4 | Yahudi | Tishri, Heshvan, Kislev, Tevet, Shevat, AdarI, AdarII, Nisan, Iyyar, Sivan, Tammuz, Av, Elul |
| 5 | Fransız İhtilali | Vendemiaire, Brumaire, Frimaire, Nivose, Pluviose, Ventose, Germinal, Floreal, Prairial, Messidor, Thermidor, Fructidor, Extra |
Üzerinde işlem yapılacak Jülyen Günü
Ay adının alınacağı takvim
Verilen Jülyen Günü ve takvim değiştirgesine göre ay adı.
(PHP 4, PHP 5)
JDToFrench — Jülyen gün sayısını, Fransız İhtilali takvimine çevirir
Jülyen gün sayısını, Fransız İhtilali takvimine çevirir.
Tamsayı olarak Jülyen Gün Sayısı
"ay/gün/yıl" biçiminde, dizge olarak Fransız İhtilal takvim tarihi
(PHP 4, PHP 5)
JDToGregorian — Jülyen Gün Sayısını, Gregoryen tarihine çevirir
Jülyen Gün Sayısını, "ay/gün/yıl" biçimindeki Gregoryen tarih dizgesine çevirir.
Tamsayı olarak, Jülyen Gün Sayısı
"ay/gün/yıl" biçiminde, Gregoryen tarih dizgesi
(PHP 4, PHP 5)
jdtojewish — Jülyen Gün Sayısını, Yahudi takvimine çevirir
Jülyen Gün Sayısını, Yahudi takvimine çevirir.
Tamsayı olarak Jülyen Gün Sayısı
ibrani değiştirgesi TRUE olarak ayarlanırsa, bicim değiştirgesi, İbranice çıktıyı biçimlendirmek için kullanılır.
Geçerli sabitler şunlardır: CAL_JEWISH_ADD_ALAFIM_GERESH, CAL_JEWISH_ADD_ALAFIM, CAL_JEWISH_ADD_GERESHAYIM.
Dizge olarak, "ay/gün/yıl" biçiminde Yahudi takvimi tarihi
| Sürüm: | Açıklama |
|---|---|
| 5.0.0 | bicim değiştirgesi eklenmiştir. |
| 4.3.0 | ibrani değiştirgesi eklenmiştir. |
Örnek 1 jdtojewish() örneği
<?php
echo jdtojewish(gregoriantojd(10, 8, 2002), true,
CAL_JEWISH_ADD_GERESHAYIM + CAL_JEWISH_ADD_ALAFIM +
CAL_JEWISH_ADD_ALAFIM_GERESH);
?>
(PHP 4, PHP 5)
JDToJulian — Jülyen Gün Sayısını, Jülyen takvim tarihine çevirir
Jülyen Gün Sayısını, "ay/gün/yıl" biçiminde Jülyen takvim tarihine çevirir.
Tamsayı olarak Jülyen Gün Sayısı
"ay/gün/yıl" biçiminde dizge olarak Jülyen takvimi tarihi
(PHP 4, PHP 5)
jdtounix — Jülyen Gün Sayısını, Unix zaman damgasına çevirir
İşlev julyengunu 'ne karşılık gelen Unix zaman damgasını ya da verilen julyengunu Unix zaman damgası aralığında (1970 ve 2037 Gregoryen yılları arası veya 2440588 <= julyengunu <= 2465342 ) değilse FALSE değerini döner. İşlevden dönen zaman damgası, GMT'ye göre değil, yerel zamana göredir.
2440588 ve 2465342 aralığında Jülyen Gün Sayısı.
Jülyen Gün Sayısına, karşılık gelen Unix zaman damgası.
(PHP 4, PHP 5)
JewishToJD — Yahudi takvimindeki bir tarihi, Jülyen Gün Sayısına çevirir
İşlev, 1. yıldan (M.Ö. 3761) itibaren bütün tarihleri çevirebilse de, bu tip kullanım anlamlı değildir. Yahudi takvimi birkaç bin yıldan beri kullanımdadır, bununla birlikte ilk dönemlerinde bir ayın başlangıcı belirlemek için herhangi bir yol yoktu. Yeni bir ay, ilk hilal gözlendiğinde başlıyordu.
1 ile 13 aralığında sayı olarak ay
1 ile 30 aralığında sayı olarak gün
1 ile 9999 aralığında sayı olarak yıl
Yahudi tarihine karşılık gelen Jülyen Gün Sayısı.
(PHP 4, PHP 5)
JulianToJD — Jülyen takvimindeki tarihi, Jülyen Gün Sayısına çevirir
Jülyen takviminin geçerli olduğu aralık M.Ö. 4713 ile M.S. 9999'dur.
İşlev, M.Ö. 4713 yılına kadar tarihler için dönüşüm yapabilse de, böyle kullanımlar anlamlı değildir. Takvim M.Ö. 46 yılında başlamıştır fakat M.S. 8 ve belki de 4. yüzyılın sonlarına kadar yaygın hale gelmemiştir. Ayrıca, yılın başlangıcı bir kültürden diğerine değişiyordu, hepsi Ocak ayını ilk ay olarak kabul etmemişti.
Şimdi dünya genelinde kullanılan takvim sistemin Gregoryen olduğunu unutmayın, gregoriantojd() işlevi tarihleri Jülyen Gün Sayısına çevirmek için kullanılabilir.
1 (Ocak) ile 12 (Aralık) aralığında sayı olarak ay
1 ile 31 aralığında sayı olarak gün
-4713 ile 9999 aralığında sayı olarak yıl değeri
Verilen Jülyen tarihine karşılık gelen Jülyen Gün Sayısı.
(PHP 4, PHP 5)
unixtojd — Unix zaman damgasını, Jülyen Gün Sayısına çevirir
Verilen Unix zamandamgasi (1.1.1970'den başlayarak geçen saniye sayısı) için Jülyen Gün Sayısını döndürür, eğer zamandamgasi verilmez ise içinde bulunulan gün için Jülyen Gün Sayısını verir.
Çevrilecek unix zaman damgası.
Tamsayı olarak, Jülyen Gün Sayısı.
Bu işlevler PHP betiğinizin çalıştığı sunucunun tarih ve saati üzerinde işlem yaparlar. Tarih ve saati farklı biçemlerde göstermek için bu işlevleri kullanabilirsiniz.
Her tarih bileşeni (örneğin, yıl) dahili olarak 64 bitlik bir sayı olarak saklanır, dolayısıyla hayali tarihler (negatif yıllar dahil) desteklenmez.
Bilginize: Bu işlevlerin sunucunuzun yerel zaman ayarlarına bağlı olarak işlem yaptığını lütfen aklınızdan çıkarmayın. Yaz saati uygulamasına dikkat edin. Örneğin, süre ekleme işlemi için $date += 7*24*60*60 değil $date = strtotime('+7 days', $date) kullanın. Ayrıca, bu işlevlerin artık yılları hesaba kattığını unutmayın.
Bilginize: Bu işlevlerde kullanılabilecek zaman dilimlerini Desteklenen Zaman Dilimlerinin Listesi bölümünde bulabilirsiniz.
Bu eklentiyi derlemek için harici kütüphanelere gerek yoktur.
Bu işlevleri kullanmak için hiçbir şey kurmaya gerek yoktur; PHP çekirdeğinin parçasıdırlar.
Bilginize: Güncel zaman dilimi veritabanının yüklenmesi
Zaman dilimi veritabanın güncel sürümü, PECL'nin » zaman dilimi veritabanı olarak yüklenebilir.
Bilginize: PHP 5.1.x sürümlerinde Deneysel DateTime Desteği
Her ne kadar DateTime sınıfı (ve ilgili işlevleri) PHP 5.2.0 sürümünden itibaren kullanılabilir olsalar da, PHP 5.1.x sürümlerinde deneysel desteği eklemek için yapılandırma ya da derlemede sırasında CFLAGS=-DEXPERIMENTAL_DATE_SUPPORT=1 seçeneği kullanılabilir.
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Varsayılan | Değişiklik yeri | Sürüm bilgisi |
|---|---|---|---|
| date.default_latitude | "31.7667" | PHP_INI_ALL | PHP 5.0.0 sürümünden beri kullanılabilir. |
| date.default_longitude | "35.2333" | PHP_INI_ALL | PHP 5.0.0 sürümünden beri kullanılabilir. |
| date.sunrise_zenith | "90.583333" | PHP_INI_ALL | PHP 5.0.0 sürümünden beri kullanılabilir. |
| date.sunset_zenith | "90.583333" | PHP_INI_ALL | PHP 5.0.0 sürümünden beri kullanılabilir. |
| date.timezone | "" | PHP_INI_ALL | PHP 5.1.0 sürümünden beri kullanılabilir. |
PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
Varsayılan enlem.
Varsayılan boylam.
Varsayılan gün doğumu başucu noktası.
Varsayılan gün batımı başucu noktası.
Eğer TZ ortam değişkeni ayarlanmamışsa tüm tarih/saat işlevleri için varsayılan zaman dilimi kullanılır. Öncelik sıralaması date_default_timezone_get() işlevinin sayfasında tanımlanmıştır. Desteklenen zaman dilimleri için Desteklenen Zaman Dilimlerinin Listesi sayfasına bakın.
Bilginize: İlk dört yapılandırma seçeneği halen sadece date_sunrise() ile date_sunset() işlevlerinde kullanılmaktadır.
Bu eklentinin tanımlı hiçbir özkaynak türü yoktur.
DATE_ sabitleri PHP 5.1.1 sürümünden itibaren tanımlanmıştır ve standart tarih gösterimi için tarih biçimlendirme işlevleriyle kullanılabilirler. (date() işlevi gibi).
Aşağıdaki sabitler PHP 5.1.2 sürümünden itibaren mevcutturlar ve date_sunrise() ile date_sunset() işlevleri tarafından biçim belirtmek için döndürülürler.
Burada, date_default_timezone_set() gibi işlevler tarafından kullanılmak üzere PHP tarafından desteklenen zaman dilimlerinin tamamı listelenmiştir.
Bilginize: Zaman dilimi veritabanının en son sürümü PECL'nin » timezonedb paketinden kurulabilir.
Bilginize: Bu liste zaman dilimi veritabanının şu sürümüne dayanır: 2009.19.
| Africa/Abidjan | Africa/Accra | Africa/Addis_Ababa | Africa/Algiers | Africa/Asmara |
| Africa/Asmera | Africa/Bamako | Africa/Bangui | Africa/Banjul | Africa/Bissau |
| Africa/Blantyre | Africa/Brazzaville | Africa/Bujumbura | Africa/Cairo | Africa/Casablanca |
| Africa/Ceuta | Africa/Conakry | Africa/Dakar | Africa/Dar_es_Salaam | Africa/Djibouti |
| Africa/Douala | Africa/El_Aaiun | Africa/Freetown | Africa/Gaborone | Africa/Harare |
| Africa/Johannesburg | Africa/Kampala | Africa/Khartoum | Africa/Kigali | Africa/Kinshasa |
| Africa/Lagos | Africa/Libreville | Africa/Lome | Africa/Luanda | Africa/Lubumbashi |
| Africa/Lusaka | Africa/Malabo | Africa/Maputo | Africa/Maseru | Africa/Mbabane |
| Africa/Mogadishu | Africa/Monrovia | Africa/Nairobi | Africa/Ndjamena | Africa/Niamey |
| Africa/Nouakchott | Africa/Ouagadougou | Africa/Porto-Novo | Africa/Sao_Tome | Africa/Timbuktu |
| Africa/Tripoli | Africa/Tunis | Africa/Windhoek |
| America/Adak | America/Anchorage | America/Anguilla | America/Antigua | America/Araguaina |
| America/Argentina/Buenos_Aires | America/Argentina/Catamarca | America/Argentina/ComodRivadavia | America/Argentina/Cordoba | America/Argentina/Jujuy |
| America/Argentina/La_Rioja | America/Argentina/Mendoza | America/Argentina/Rio_Gallegos | America/Argentina/Salta | America/Argentina/San_Juan |
| America/Argentina/San_Luis | America/Argentina/Tucuman | America/Argentina/Ushuaia | America/Aruba | America/Asuncion |
| America/Atikokan | America/Atka | America/Bahia | America/Barbados | America/Belem |
| America/Belize | America/Blanc-Sablon | America/Boa_Vista | America/Bogota | America/Boise |
| America/Buenos_Aires | America/Cambridge_Bay | America/Campo_Grande | America/Cancun | America/Caracas |
| America/Catamarca | America/Cayenne | America/Cayman | America/Chicago | America/Chihuahua |
| America/Coral_Harbour | America/Cordoba | America/Costa_Rica | America/Cuiaba | America/Curacao |
| America/Danmarkshavn | America/Dawson | America/Dawson_Creek | America/Denver | America/Detroit |
| America/Dominica | America/Edmonton | America/Eirunepe | America/El_Salvador | America/Ensenada |
| America/Fort_Wayne | America/Fortaleza | America/Glace_Bay | America/Godthab | America/Goose_Bay |
| America/Grand_Turk | America/Grenada | America/Guadeloupe | America/Guatemala | America/Guayaquil |
| America/Guyana | America/Halifax | America/Havana | America/Hermosillo | America/Indiana/Indianapolis |
| America/Indiana/Knox | America/Indiana/Marengo | America/Indiana/Petersburg | America/Indiana/Tell_City | America/Indiana/Vevay |
| America/Indiana/Vincennes | America/Indiana/Winamac | America/Indianapolis | America/Inuvik | America/Iqaluit |
| America/Jamaica | America/Jujuy | America/Juneau | America/Kentucky/Louisville | America/Kentucky/Monticello |
| America/Knox_IN | America/La_Paz | America/Lima | America/Los_Angeles | America/Louisville |
| America/Maceio | America/Managua | America/Manaus | America/Marigot | America/Martinique |
| America/Mazatlan | America/Mendoza | America/Menominee | America/Merida | America/Mexico_City |
| America/Miquelon | America/Moncton | America/Monterrey | America/Montevideo | America/Montreal |
| America/Montserrat | America/Nassau | America/New_York | America/Nipigon | America/Nome |
| America/Noronha | America/North_Dakota/Center | America/North_Dakota/New_Salem | America/Panama | America/Pangnirtung |
| America/Paramaribo | America/Phoenix | America/Port-au-Prince | America/Port_of_Spain | America/Porto_Acre |
| America/Porto_Velho | America/Puerto_Rico | America/Rainy_River | America/Rankin_Inlet | America/Recife |
| America/Regina | America/Resolute | America/Rio_Branco | America/Rosario | America/Santarem |
| America/Santiago | America/Santo_Domingo | America/Sao_Paulo | America/Scoresbysund | America/Shiprock |
| America/St_Barthelemy | America/St_Johns | America/St_Kitts | America/St_Lucia | America/St_Thomas |
| America/St_Vincent | America/Swift_Current | America/Tegucigalpa | America/Thule | America/Thunder_Bay |
| America/Tijuana | America/Toronto | America/Tortola | America/Vancouver | America/Virgin |
| America/Whitehorse | America/Winnipeg | America/Yakutat | America/Yellowknife |
| Antarctica/Casey | Antarctica/Davis | Antarctica/DumontDUrville | Antarctica/Mawson | Antarctica/McMurdo |
| Antarctica/Palmer | Antarctica/Rothera | Antarctica/South_Pole | Antarctica/Syowa | Antarctica/Vostok |
| Arctic/Longyearbyen |
| Asia/Aden | Asia/Almaty | Asia/Amman | Asia/Anadyr | Asia/Aqtau |
| Asia/Aqtobe | Asia/Ashgabat | Asia/Ashkhabad | Asia/Baghdad | Asia/Bahrain |
| Asia/Baku | Asia/Bangkok | Asia/Beirut | Asia/Bishkek | Asia/Brunei |
| Asia/Calcutta | Asia/Choibalsan | Asia/Chongqing | Asia/Chungking | Asia/Colombo |
| Asia/Dacca | Asia/Damascus | Asia/Dhaka | Asia/Dili | Asia/Dubai |
| Asia/Dushanbe | Asia/Gaza | Asia/Harbin | Asia/Ho_Chi_Minh | Asia/Hong_Kong |
| Asia/Hovd | Asia/Irkutsk | Asia/Istanbul | Asia/Jakarta | Asia/Jayapura |
| Asia/Jerusalem | Asia/Kabul | Asia/Kamchatka | Asia/Karachi | Asia/Kashgar |
| Asia/Kathmandu | Asia/Katmandu | Asia/Kolkata | Asia/Krasnoyarsk | Asia/Kuala_Lumpur |
| Asia/Kuching | Asia/Kuwait | Asia/Macao | Asia/Macau | Asia/Magadan |
| Asia/Makassar | Asia/Manila | Asia/Muscat | Asia/Nicosia | Asia/Novokuznetsk |
| Asia/Novosibirsk | Asia/Omsk | Asia/Oral | Asia/Phnom_Penh | Asia/Pontianak |
| Asia/Pyongyang | Asia/Qatar | Asia/Qyzylorda | Asia/Rangoon | Asia/Riyadh |
| Asia/Saigon | Asia/Sakhalin | Asia/Samarkand | Asia/Seoul | Asia/Shanghai |
| Asia/Singapore | Asia/Taipei | Asia/Tashkent | Asia/Tbilisi | Asia/Tehran |
| Asia/Tel_Aviv | Asia/Thimbu | Asia/Thimphu | Asia/Tokyo | Asia/Ujung_Pandang |
| Asia/Ulaanbaatar | Asia/Ulan_Bator | Asia/Urumqi | Asia/Vientiane | Asia/Vladivostok |
| Asia/Yakutsk | Asia/Yekaterinburg | Asia/Yerevan |
| Atlantic/Azores | Atlantic/Bermuda | Atlantic/Canary | Atlantic/Cape_Verde | Atlantic/Faeroe |
| Atlantic/Faroe | Atlantic/Jan_Mayen | Atlantic/Madeira | Atlantic/Reykjavik | Atlantic/South_Georgia |
| Atlantic/St_Helena | Atlantic/Stanley |
| Australia/ACT | Australia/Adelaide | Australia/Brisbane | Australia/Broken_Hill | Australia/Canberra |
| Australia/Currie | Australia/Darwin | Australia/Eucla | Australia/Hobart | Australia/LHI |
| Australia/Lindeman | Australia/Lord_Howe | Australia/Melbourne | Australia/North | Australia/NSW |
| Australia/Perth | Australia/Queensland | Australia/South | Australia/Sydney | Australia/Tasmania |
| Australia/Victoria | Australia/West | Australia/Yancowinna |
| Europe/Amsterdam | Europe/Andorra | Europe/Athens | Europe/Belfast | Europe/Belgrade |
| Europe/Berlin | Europe/Bratislava | Europe/Brussels | Europe/Bucharest | Europe/Budapest |
| Europe/Chisinau | Europe/Copenhagen | Europe/Dublin | Europe/Gibraltar | Europe/Guernsey |
| Europe/Helsinki | Europe/Isle_of_Man | Europe/Istanbul | Europe/Jersey | Europe/Kaliningrad |
| Europe/Kiev | Europe/Lisbon | Europe/Ljubljana | Europe/London | Europe/Luxembourg |
| Europe/Madrid | Europe/Malta | Europe/Mariehamn | Europe/Minsk | Europe/Monaco |
| Europe/Moscow | Europe/Nicosia | Europe/Oslo | Europe/Paris | Europe/Podgorica |
| Europe/Prague | Europe/Riga | Europe/Rome | Europe/Samara | Europe/San_Marino |
| Europe/Sarajevo | Europe/Simferopol | Europe/Skopje | Europe/Sofia | Europe/Stockholm |
| Europe/Tallinn | Europe/Tirane | Europe/Tiraspol | Europe/Uzhgorod | Europe/Vaduz |
| Europe/Vatican | Europe/Vienna | Europe/Vilnius | Europe/Volgograd | Europe/Warsaw |
| Europe/Zagreb | Europe/Zaporozhye | Europe/Zurich |
| Indian/Antananarivo | Indian/Chagos | Indian/Christmas | Indian/Cocos | Indian/Comoro |
| Indian/Kerguelen | Indian/Mahe | Indian/Maldives | Indian/Mauritius | Indian/Mayotte |
| Indian/Reunion |
| Pacific/Apia | Pacific/Auckland | Pacific/Chatham | Pacific/Easter | Pacific/Efate |
| Pacific/Enderbury | Pacific/Fakaofo | Pacific/Fiji | Pacific/Funafuti | Pacific/Galapagos |
| Pacific/Gambier | Pacific/Guadalcanal | Pacific/Guam | Pacific/Honolulu | Pacific/Johnston |
| Pacific/Kiritimati | Pacific/Kosrae | Pacific/Kwajalein | Pacific/Majuro | Pacific/Marquesas |
| Pacific/Midway | Pacific/Nauru | Pacific/Niue | Pacific/Norfolk | Pacific/Noumea |
| Pacific/Pago_Pago | Pacific/Palau | Pacific/Pitcairn | Pacific/Ponape | Pacific/Port_Moresby |
| Pacific/Rarotonga | Pacific/Saipan | Pacific/Samoa | Pacific/Tahiti | Pacific/Tarawa |
| Pacific/Tongatapu | Pacific/Truk | Pacific/Wake | Pacific/Wallis | Pacific/Yap |
| Brazil/Acre | Brazil/DeNoronha | Brazil/East | Brazil/West | Canada/Atlantic |
| Canada/Central | Canada/East-Saskatchewan | Canada/Eastern | Canada/Mountain | Canada/Newfoundland |
| Canada/Pacific | Canada/Saskatchewan | Canada/Yukon | CET | Chile/Continental |
| Chile/EasterIsland | CST6CDT | Cuba | EET | Egypt |
| Eire | EST | EST5EDT | Etc/GMT | Etc/GMT+0 |
| Etc/GMT+1 | Etc/GMT+10 | Etc/GMT+11 | Etc/GMT+12 | Etc/GMT+2 |
| Etc/GMT+3 | Etc/GMT+4 | Etc/GMT+5 | Etc/GMT+6 | Etc/GMT+7 |
| Etc/GMT+8 | Etc/GMT+9 | Etc/GMT-0 | Etc/GMT-1 | Etc/GMT-10 |
| Etc/GMT-11 | Etc/GMT-12 | Etc/GMT-13 | Etc/GMT-14 | Etc/GMT-2 |
| Etc/GMT-3 | Etc/GMT-4 | Etc/GMT-5 | Etc/GMT-6 | Etc/GMT-7 |
| Etc/GMT-8 | Etc/GMT-9 | Etc/GMT0 | Etc/Greenwich | Etc/UCT |
| Etc/Universal | Etc/UTC | Etc/Zulu | Factory | GB |
| GB-Eire | GMT | GMT+0 | GMT-0 | GMT0 |
| Greenwich | Hongkong | HST | Iceland | Iran |
| Israel | Jamaica | Japan | Kwajalein | Libya |
| MET | Mexico/BajaNorte | Mexico/BajaSur | Mexico/General | MST |
| MST7MDT | Navajo | NZ | NZ-CHAT | Poland |
| Portugal | PRC | PST8PDT | ROC | ROK |
| Singapore | Turkey | UCT | Universal | US/Alaska |
| US/Aleutian | US/Arizona | US/Central | US/East-Indiana | US/Eastern |
| US/Hawaii | US/Indiana-Starke | US/Michigan | US/Mountain | US/Pacific |
| US/Pacific-New | US/Samoa | UTC | W-SU | WET |
| Zulu |
Lütfen burada listelenen zaman dilimlerini (UTC dışında) kullanmayın. Sadece geriye uyumluluk için varlar.
Tarih ve saat gösterimi.
(PHP 5 >= 5.3.0)
DateTime::add — Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object
Adds the specified DateInterval object to the specified DateTime object.
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
A DateInterval object
Returns the modified DateTime.
Örnek 1 date_add() example
<?php
$date = new DateTime("18-July-2008 16:30:30");
echo $date->format("d-m-Y H:i:s").'<br />';
date_add($date, new DateInterval("P5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days';
date_add($date, new DateInterval("P5M"));
echo '<br />'.$date->format("d-m-Y").' : 5 Months';
date_add($date, new DateInterval("P5Y"));
echo '<br />'.$date->format("d-m-Y").' : 5 Years';
date_add($date, new DateInterval("P5Y5M5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days, 5 Months, 5 Years';
date_add($date, new DateInterval("P5YT5H"));
echo '<br />'.$date->format("d-m-Y H:i:s").' : 5 Years, 5 Hours';
?>
(PHP 5 >= 5.2.0)
DateTime::__construct — Returns new DateTime object
Returns new DateTime object.
Emits Exception in case of an error.
Örnek 1 DateTime::__construct() example
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 14:52:10');
echo $datetime->format(DATE_ATOM);
?>
(PHP 5 >= 5.3.0)
DateTime::createFromFormat — Returns new DateTime object formatted according to the specified format
Returns new DateTime object formatted according to the specified format.
Format accepted by date().
If format does not contain the character ! then portions of the date/time value specified in format but not specified in time will be set to the current system time.
If format contains the character !, then portions of the generated time specified to the left-hand side of the ! in format will be set to corresponding values from the Unix epoch.
If the first character of format is !, then all portions of the date/time value generated which are not specified in time will be initialized to corresponding values from the Unix epoch.
The Unix epoch is 1970-01-01 00:00:00 UTC.
String representing the time.
Time zone.
Returns new DateTime instance başarısızlık durumunda FALSE döner.
Örnek 1 Using ! to reset default date/time values
<?php
echo "Current system date and time: " . date('Y-m-d H:i:s') . "\n";
$format = 'Y-m-d';
$dt = DateTime::createFromFormat($format, '2009-02-03');
echo "Format: $format; " . $dt->date . "\n";
$format = 'Y-m-d H:i:s';
$dt = DateTime::createFromFormat($format, '2009-02-03 15:16:17');
echo "Format: $format; " . $dt->date . "\n";
$format = 'Y-m-!d H:i:s';
$dt = DateTime::createFromFormat($format, '2009-02-03 15:16:17');
echo "Format: $format; " . $dt->date . "\n";
$format = '!Y-m-d';
$dt = DateTime::createFromFormat($format, '2009-02-03');
echo "Format: $format; " . $dt->date . "\n";
?>
The above example will output something like the following (taking into account the current system time):
Current system date and time: 2009-09-13 01:04:03 Format: Y-m-d; 2009-02-03 01:04:03 Format: Y-m-d H:i:s; 2009-02-03 15:16:17 Format: Y-m-!d H:i:s; 1970-01-03 15:16:17 Format: !Y-m-d; 2009-02-03 00:00:00
(PHP 5 >= 5.3.0)
DateTime::diff — Returns the difference between two DateTime objects
Returns the difference between two DateTime objects.
The date to compare to.
Whether to return absolute difference.
The difference between two dates.
(PHP 5 >= 5.2.0)
DateTime::format — Returns date formatted according to given format
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
Format accepted by date().
Returns formatted date on success başarısızlık durumunda FALSE döner.
Örnek 1 Displaying the date and time using the procedural form
<?php
date_default_timezone_set('Europe/London');
$datetime = date_create('2008-08-03 14:52:10');
echo date_format($datetime, 'jS, F Y') . "\n";
echo date_format($datetime, DATE_ATOM);
?>
Örnek 2 Displaying the date and time using the object oriented form
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 14:52:10');
echo $datetime->format('jS, F Y') . "\n";
echo $datetime->format(DATE_ATOM);
?>
?>
Yukarıdaki örneğin çıktısı:
3rd, August 2008 2008-08-03T14:52:10+01:00
(PHP 5 >= 5.3.0)
DateTime::getLastErrors — Returns the warnings and errors
Returns the warnings and errors found while parsing a date/time string.
Bu işlevin değiştirgesi yoktur.
Returns array containing info about warnings and errors.
Örnek 1 DateTime::getLastErrors() example
<?php
$date = date_create('asdfasdf');
print_r(DateTime::getLastErrors());
?>
Yukarıdaki örneğin çıktısı:
Array
(
[warning_count] => 1
[warnings] => Array
(
[6] => Double timezone specification
)
[error_count] => 1
[errors] => Array
(
[0] => The timezone could not be found in the database
)
)
(PHP 5 >= 5.2.0)
DateTime::getOffset — Returns the timezone offset
Returns offset in seconds with respect to daylight saving time on success başarısızlık durumunda FALSE döner.
Örnek 1 Comparing offsets between Summer and Winter
<?php
date_default_timezone_set('Europe/London');
$winter = new DateTime('2008-12-25 14:25:41');
$summer = new DateTime('2008-07-14 14:25:41');
echo $winter->getOffset(); // Winter offset: 0
echo $summer->getOffset(); // Summer offset: 3600 = 1 hour
?>
(PHP 5 >= 5.3.0)
DateTime::getTimestamp — Gets the Unix timestamp
Gets the Unix timestamp.
Bu işlevin değiştirgesi yoktur.
Returns Unix timestamp representing the date.
(PHP 5 >= 5.2.0)
DateTime::getTimezone — Return time zone relative to given DateTime
Returns DateTimeZone object on success başarısızlık durumunda FALSE döner.
Örnek 1 Setting and getting DateTimeZone objects
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->getTimezone()->getName() . "\n";
$datetime = new DateTime('2008-08-03 12:35:23');
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->getTimezone()->getName();
?>
Yukarıdaki örneğin çıktısı:
Europe/London America/Los_Angeles
(PHP 5 >= 5.2.0)
DateTime::modify — Alters the timestamp
Alter the timestamp of a DateTime object by incrementing or decrementing in a format accepted by strtotime().
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
String in a relative format accepted by strtotime().
Returns the modified DateTime.
Örnek 1 A date_modify() example
<?php
$date = new DateTime("2006-12-12");
$date->modify("+1 day");
echo $date->format("Y-m-d");
?>
Yukarıdaki örneğin çıktısı:
2006-12-13
(PHP 5 >= 5.2.0)
DateTime::__set_state — The __set_state handler
Initialization array.
Returns a new instance of a DateTime object.
(PHP 5 >= 5.2.0)
DateTime::setDate — Sets the date
Resets the current date of the DateTime object to a different date.
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
Year of the date.
Month of the date.
Day of the date.
Returns the modified DateTime.
Örnek 1 Object oriented example usage
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 14:52:10');
$datetime->setDate(2008, 10, 12);
echo $datetime->format(DATE_RFC2822);
?>
Örnek 2 Procedural example usage
<?php
date_default_timezone_set('Europe/London');
$datetime = date_create('2008-08-03 14:52:10');
date_date_set($datetime, 2008, 10, 12);
echo date_format($datetime, DATE_RFC2822);
?>
Yukarıdaki örneğin çıktısı:
Sun, 12 Oct 2008 14:52:10 +0100
(PHP 5 >= 5.2.0)
DateTime::setISODate — Sets the ISO date
Set a date according to the ISO 8601 standard - using weeks and day offsets rather than specific dates.
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
Year of the date.
Week of the date.
Offset from the first day of the week.
Returns the modified DateTime.
Örnek 1 Finding the date from a week number and day offset
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime();
// Offset from start of week 2 (7) = 5
$datetime->setISODate(2008, 2, 5); // Day 5 of week 2 of 2008 is the 11th of January.
// Offset from start of week 2 (7) = 10
$datetime->setISODate(2008, 2, 10); // Day 10 of week 2 of 2008 is the 16th of January.
?>
Örnek 2 Finding the month a week is in
<?php
date_default_timezone_set('Europe/London');
$datetime = date_create();
date_isodate_set($datetime, 2008, 6); // Week 6 of 2008 is in February.
?>
(PHP 5 >= 5.2.0)
DateTime::setTime — Sets the time
Resets the current time of the DateTime object to a different time.
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
Hour of the time.
Minute of the time.
Second of the time.
Returns the modified DateTime.
Örnek 1 Changing the time of a DateTime object
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->format('Y-m-d H:i:s') . "\n";
$datetime->setTime(14, 55, 24);
echo $datetime->format('Y-m-d H:i:s') . "\n";
// Warning: Does not increment the hour!
// This is because the hour has been set (14) - see date_modify()
$datetime->setTime($datetime->format('H'), $datetime->format('n') + 6);
echo $datetime->format('Y-m-d H:i:s') . "\n";
// *Does* increment the day, because the day has not been set
$datetime->setTime($datetime->format('H') + 12, $datetime->format('n'));
echo $datetime->format('Y-m-d H:i:s') . "\n";
?>
Yukarıdaki örneğin çıktısı:
2008-08-03 12:35:23 2008-08-03 14:55:24 2008-08-03 14:14:00 2008-08-04 02:08:00
(PHP 5 >= 5.3.0)
DateTime::setTimestamp — Sets the date and time based on an Unix timestamp
Sets the date and time based on an Unix timestamp.
Unix timestamp representing the date.
Returns the modified DateTime.
(PHP 5 >= 5.2.0)
DateTime::setTimezone — Sets the time zone for the DateTime object
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
Desired time zone.
Returns the modified DateTime.
Örnek 1 Setting and getting DateTimeZone objects
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->getTimezone()->getName() . "\n";
$datetime = new DateTime('2008-08-03 12:35:23');
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->getTimezone()->getName();
?>
Yukarıdaki örneğin çıktısı:
Europe/London America/Los_Angeles
(PHP 5 >= 5.3.0)
DateTime::sub — Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object
Subtracts the specified DateInterval object from the specified DateTime object.
Sadece yordamsal biçem: date_create() işlevinden dönen bir DateTime nesnesi.
A DateInterval object
Returns the modified DateTime.
Örnek 1 date_sub() example
<?php
$date = new DateTime("18-July-2008 16:30:30");
echo $date->format("d-m-Y H:i:s").'<br />';
date_sub($date, new DateInterval("P5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days';
date_sub($date, new DateInterval("P5M"));
echo '<br />'.$date->format("d-m-Y").' : 5 Months';
date_sub($date, new DateInterval("P5Y"));
echo '<br />'.$date->format("d-m-Y").' : 5 Years';
date_sub($date, new DateInterval("P5Y5M5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days, 5 Months, 5 Years';
date_sub($date, new DateInterval("P5YT5H"));
echo '<br />'.$date->format("d-m-Y H:i:s").' : 5 Years, 5 Hours';
?>
(PHP 5 >= 5.2.0)
DateTime::__wakeup — The __wakeup handler
Bu işlevin değiştirgesi yoktur.
Initializes a DateTime object.
Zaman dilimi gösterimi.
Afrika zaman dilimleri.
Amerika zaman dilimleri.
Antarktika zaman dilimleri.
Kuzey Kutup Dairesi zaman dilimleri.
Asya zaman dilimleri.
Atlantik zaman dilimleri.
Avustralya zaman dilimleri.
Avrupa zaman dilimleri.
Hindistan zaman dilimleri.
Pasifik zaman dilimleri.
UTC zaman dilimleri.
Tüm zaman dilimleri.
Geriye uyumluluk dahil tüm zaman dilimleri.
Ülkelere göre zaman dilimleri.
(PHP 5 >= 5.2.0)
DateTimeZone::__construct — Yeni bir DateTimeZone nesnesi oluşturur
Yeni bir DateTimeZone nesnesi oluşturur.
Başarılı olduğunda yeni bir DateTimeZone nesnesi döndürür.
Eğer zaman dilimi geçerli bir zaman dilimi değilse bu işlev bir Exception istisnası oluşturur.
Örnek 1 - DateTimeZone örneklenirken hataların yakalanması
<?php
// Yakalanan istisna nesneleriyle hata işlenmesine örnek
$zamandilimleri = array('Europe/Istanbul', 'Mars/Phobos', 'Jupiter/Europa');
foreach ($zamandilimleri as $zd) {
try {
$mars = new DateTimeZone($zd);
} catch(Exception $e) {
echo $e->getMessage() . '<br />';
}
}
?>
Yukarıdaki örneğin çıktısı:
DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Mars/Phobos) DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Jupiter/Europa)
(PHP 5 >= 5.3.0)
DateTimeZone::getLocation — Zaman dilimi konum bilgisini döndürür
Zaman dilimi için konum bilgisini; ülke kodu, enlem/boylam değerlerini ve yorumları döndürür.
Bu işlevin değiştirgesi yoktur.
Zaman dilimi hakkında konum bilgisini içeren bir dizi.
Örnek 1 - DateTimeZone::getLocation() örneği
<?php
$tz = new DateTimeZone("Europe/Prague");
print_r($tz->getLocation());
?>
Yukarıdaki örneğin çıktısı:
Array
(
[country_code] => CZ
[latitude] => 50.08333
[longitude] => 14.43333
[comments] =>
)
(PHP 5 >= 5.2.0)
DateTimeZone::getName — Zaman diliminin adını döndürür
Zaman diliminin adını döndürür.
Bu işlevin değiştirgesi yoktur.
Tanımlı zaman dilimlerinden biri.
(PHP 5 >= 5.2.0)
DateTimeZone::getOffset — Returns the timezone offset from GMT
This function returns the offset to GMT for the date/time specified in the datetime parameter. The GMT offset is calculated with the timezone information contained in the DateTimeZone object being used.
Sadece yordamsal biçem: timezone_open() işlevinden dönen bir DateTimeZone nesnesi.
DateTime that contains the date/time to compute the offset from.
Returns time zone offset in seconds on success başarısızlık durumunda FALSE döner.
Örnek 1 DateTimeZone::getOffset() examples
<?php
// Create two timezone objects, one for Taipei (Taiwan) and one for
// Tokyo (Japan)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");
// Create two DateTime objects that will contain the same Unix timestamp, but
// have different timezones attached to them.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);
// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei
// object, but using the timezone rules as defined for Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);
// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST).
var_dump($timeOffset);
?>
(PHP 5 >= 5.2.0)
DateTimeZone::getTransitions — Returns all transitions for the timezone
Sadece yordamsal biçem: timezone_open() işlevinden dönen bir DateTimeZone nesnesi.
Begin timestamp.
End timestamp.
Returns numerically indexed array containing associative array with all transitions on success başarısızlık durumunda FALSE döner.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | The optional timestamp_begin and timestamp_end were added. |
Örnek 1 A timezone_transitions_get() example
<?php
$timezone = new DateTimeZone("CET");
print_r(reset($timezone->getTransitions()));
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[ts] => -1693706400
[time] => 1916-04-30T22:00:00+0000
[offset] => 7200
[isdst] => 1
[abbr] => CEST
)
(PHP 5 >= 5.2.0)
DateTimeZone::listAbbreviations — Returns associative array containing dst, offset and the timezone name
Returns array on success başarısızlık durumunda FALSE döner.
Örnek 1 A timezone_abbreviations_list() example
<?php
$timezone_abbreviations = DateTimeZone::listAbbreviations();
print_r($timezone_abbreviations["acst"]);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[0] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Porto_Acre
)
[1] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Eirunepe
)
[2] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Rio_Branco
)
[3] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => Brazil/Acre
)
)
(PHP 5 >= 5.2.0)
DateTimeZone::listIdentifiers — Returns numerically index array with all timezone identifiers
One of DateTimeZone class constants.
A two-letter ISO 3166-1 compatible country code.
Bilginize: This option is only used when what is set to DateTimeZone::PER_COUNTRY.
Returns array on success başarısızlık durumunda FALSE döner.
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | Added the optional what and country parameters. |
Örnek 1 A timezone_identifiers_list() example
<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
for ($i=0; $i < 5; $i++) {
echo "$timezone_identifiers[$i]\n";
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmera
Tarih aralığının gösterimi.
(PHP 5 >= 5.3.0)
DateInterval::__construct — Yeni bir DateInterval nesnesi oluşturur
Yeni bir DateInterval nesnesi oluşturur.
Dizge türünde zaman aralığı belirtimi.
Zaman aralığını ("period") belirtmek için biçem P harfiyle başlar, ardından süreyi belirten bir tamsayı değer gelir. Süre zaman bileşenleri içeriyorsa bunların önüne T harfi getirilir..
| Belirteç | Açıklama |
|---|---|
| Y | Yıl |
| M | Ay |
| D | Gün |
| W | Hafta. Gün sayısına dönüştürmek için D harfiyle birlikte belirtilebilir. |
| H | Saat |
| M | Dakika |
| S | saniye |
Burada bazı basit örneklere yer verilmiştir. İki gün: P2D. İki saniye: PT2S. Altı yıl, 5 dakika: P6YT5M.
Bilginize: Birimler belirtilirken en büyük ölçekli birim solda en küçük ölçekli birim sağda kalacak şekilde veri girilir. Dolayısıyla, örneğin, aylar yıllardan sonra, günlerden önce yer alır. Bur yıl dört gün P4D1Y değil P1Y4D olarak ifade edilir.
Belirtim bir tarih saat olarak da gösterilebilir. Örneğin, bir yıl dört gün P0001-00-04T00:00:00 olarak gösterilebilir. Fakat bu biçemde belirtilen değerler birime tanınan azami değeri aşmamalıdır (örneğin 25 saat geçersizdir).
Bu biçemler » ISO 8601 süre belirtimine dayanır.
<?php
$interval = new DateInterval('P2Y4DT6H8M');
print_r($interval);
?>
Yukarıdaki örneğin çıktısı:
DateInterval Object
(
[y] => 2
[m] => 0
[d] => 4
[h] => 6
[i] => 8
[s] => 0
[invert] => 0
[days] => 0
)
(PHP 5 >= 5.3.0)
DateInterval::createFromDateString — Dizgenin göreli kısımlarından bir DateInterval nesnesi döndürür
Normal tarih ayrıştırcısı kullanır ve dizgenin göreli kısımlarından bir DateInterval nesnesi oluşturur.
Tarihe göreli kısımlar.
Başarılıysa yeni bir DateInterval nesnesi döndürür.
(PHP 5 >= 5.3.0)
DateInterval::format — Zaman aralığını biçimler
Zaman aralığını biçimlendirir.
| Karakter | Açıklama | Örnek değerler |
|---|---|---|
| Y | Başına 0 getirilerek iki haneli yıl | 01, 03 |
| y | 0 ile öncelenmeksizin yıl | 1, 3 |
| M | Başına 0 getirilerek iki haneli ay | 01, 03, 12 |
| m | 0 ile öncelenmeksizin ay | 01, 03, 12 |
| D | Başına 0 getirilerek iki haneli ayın günü | 01, 03, 31 |
| d | 0 ile öncelenmeksizin ayın günü | 1, 3, 31 |
| a | Toplam gün sayısı | 4, 18, 8123 |
| H | Başına 0 getirilerek iki haneli saat | 01, 03, 23 |
| h | 0 ile öncelenmeksizin saat | 1, 3, 23 |
| I | Başına 0 getirilerek iki haneli dakika | 01, 03, 59 |
| i | 0 ile öncelenmeksizin dakika | 1, 3, 59 |
| S | Başına 0 getirilerek iki haneli saniye | 01, 03, 57 |
| s | 0 ile öncelenmeksizin saniye | 1, 3, 57 |
| R | Negatifse "-", pozitifse "+" imi | -, + |
| r | Negatifse "-", pozitifse boş dizge | -, |
| % | % iminin kendisi | % |
Bilginize: Biçem belirteçlerinin doğru çalışması için % imi ile öncelenmeleri gerekir.
Biçimlendirilmiş zaman aralığını bir dizge olarak döndürür.
Dönemselliğin gösterimi.
DatePeriod::__construct() yönteminde kullanılan başlangıç tarihi dışlanır.
(PHP 5 >= 5.3.0)
DatePeriod::__construct — Yeni bir DatePeriod nesnesi oluşturur
Yeni bir DatePeriod nesnesi oluşturur.
Tarih başlangıcı.
Aralık.
Tekrar sayısı.
Tarih bitişi.
ISO aralığını içeren dizge.
DatePeriod::EXCLUDE_START_DATE sabiti olabilir.
(PHP 4, PHP 5)
checkdate — Miladi tarihi doğrular
Verilen değiştirgelerle şekillenen tarihin geçerliliğini sınar. Her değiştirge doğru tanımlanmışsa, tarih geçerli sayılır.
Ay 1 ve 12 arasında olmalıdır.
Gün, verilen ay 'ın gün sayıları içerisinde olmalıdır. Artık yıl lar dikkate alınacaktır.
Yıl 1 ve 32767 arasında olmalıdır.
Verilen tarih geçerli ise TRUE değeriyle, değilse FALSE değeriyle döner.
Örnek 1 - checkdate() örneği
<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>
Yukarıdaki örneğin çıktısı:
bool(true) bool(false)
(PHP 5 >= 5.3.0)
date_create_from_format — DateTime::createFromFormat işlevinin takma adıdır
Bu işlev DateTime::createFromFormat işlevinin takma adıdır.
(PHP 5 >= 5.2.0)
date_create — Yeni bir DateTime nesnesi döndürür
strtotime() tarafından kabul edilen dizge biçimlerinden biri.
Zaman dilimi.
Başarılı olduğunda DateTime nesnesiyle, başarısız olduğunda FALSE değeriyle döner.
Örnek 1 - date_create() örneği
<?php
date_default_timezone_set('Europe/Istanbul');
$datetime = date_create('2008-08-03 14:52:10');
echo date_format($datetime, DATE_ATOM);
?>
Yukarıdaki örneğin çıktısı:
2008-08-03T14:52:10+03:00
(PHP 5 >= 5.1.0)
date_default_timezone_get — Betik içerisindeki tüm tarih/zaman işlevleri tarafından kullanılan öntanımlı zaman dilimini getirir
Bu işlev tercih sırasına göre öntanımlı zaman dilimini şöyle döndürür:
date_default_timezone_set() işlevi kullanılarak atanan zaman dilimiyle (eğer varsa).
TZ ortam değişkenindeki değerle (boş değilse).
date.timezone ini yönergesindeki değerle (ayarlanmışsa).
Ev sahibi işletim sistemini sorgulayarak (işletim sistemi destekliyor ve izin veriyorsa).
Eğer yukarıdakilerin hiçbirisi başarılı değilse, date_default_timezone_get işlevi öntanımlı UTC zaman dilimini döndürecektir.
string türünde geri döner.
Örnek 1 - Öntanımlı zaman diliminin getirilmesi
<?php
date_default_timezone_set('Europe/Istanbul');
if (date_default_timezone_get()) {
echo 'date_default_timezone_set: '. date_default_timezone_get() .'<br />';
}
if (ini_get('date.timezone')) {
echo 'date.timezone: ' . ini_get('date.timezone');
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
date_default_timezone_set: Europe/Istanbul date.timezone: Europe/Istanbul
Örnek 2 - Zaman diliminin kısaltmasının getirilmesi
<?php
date_default_timezone_set('Europa/Istanbul');
echo date_default_timezone_get() . ' => ' . date('e') . ' => ' . date('T');
?>
Yukarıdaki örneğin çıktısı:
Europe/Istanbul => Europe/Istanbul => EET
(PHP 5 >= 5.1.0)
date_default_timezone_set — Betik içerisindeki tüm tarih/zaman işlevleri tarafından kullanılan öntanımlı zaman dilimini ayarlar
date_default_timezone_set() işlevi, tüm tarih/zaman işlevleri tarafından kullanılan öntanımlı zaman dilimini ayarlar.
Bilginize: PHP 5.1.0 sürümünden beri (tarih/zaman işlevleri yeniden yazıldığından beri), bir tarih/zaman işlevinin her çağrılışında, eğer zaman dilimi geçerli değilse bir E_NOTICE, eğer sistem ayarları ya da TZ ortam değişkeni kullanılıyorsa bir E_WARNING iletisi üretilmektedir.
Öntanımlı zaman dilimini ayarlamak için, bu işlevi betiğinizde kullanmak yerine, INI ayarlarındaki date.timezone yönergesini de kullanabilirsiniz.
Zaman dilimi belirteci, UTC ya da Europe/Istanbul gibi bir değer olabilir. Geçerli belirteçlerin listesi Desteklenen Zaman Dilimlerinin Listesi bölümünde bulunmaktadır.
Bu işlev zamandilimi_belirteci geçersizse FALSE, aksi takdirde TRUE döndürür.
Örnek 1 - Öntanımlı zaman dilimini almak
<?php
date_default_timezone_set('Europa/Istanbul');
$betik_zd = date_default_timezone_get();
if (strcmp($betik_zd, ini_get('date.timezone'))){
echo 'Betik zaman dilimi ini dosyasında belirtilenden farklı.';
} else {
echo 'Betik zaman dilimi ini dosyasında belirtilenle aynı.';
}
?>
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | Artık E_STRICT yerine E_WARNING oluşuyor. |
| 5.1.2 | İşlev, zamandilimi_belirteci değiştirgesini kullanmaya başladı. |
(PHP 5 >= 5.3.0)
date_get_last_errors — DateTime::getLastErrors işlevinin takma adıdır
Bu işlev, DateTime::getLastErrors işlevinin takma adıdır.
(PHP 5 >= 5.3.0)
date_interval_create_from_date_string — DateInterval::createFromDateString işlevinin takma adıdır
Bu işlev, DateInterval::createFromDateString işlevinin takma adıdır.
(PHP 5 >= 5.3.0)
date_interval_format — DateInterval::format işlevinin takma adıdır
Bu işlev, DateInterval::format işlevinin takma adıdır.
(PHP 5 >= 5.3.0)
date_parse_from_format — Get info about given date
Returns associative array with detailed info about given date.
Returns associative array with detailed info about given date.
Örnek 1 date_parse_from_format() example
<?php
$date = "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
?>
Yukarıdaki örneğin çıktısı:
Array
(
[year] => 2009
[month] => 1
[day] => 6
[hour] => 13
[minute] => 0
[second] => 0
[fraction] =>
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] => 1
[zone_type] => 1
[zone] => -60
[is_dst] =>
)
(PHP 5 >= 5.2.0)
date_parse — Verilen tarih hakkındaki ayrıntılı bilgiyi ilişkisel dizi olarak döndürür
Başarılı olduğunda çözümlenen tarihin bilgilerini içeren diziyle, başarısız olduğunda FALSE değeriyle döner.
Tarih biçimi hatalı olduğu taktirde, dizinin 'errors' elemanı hata iletilerini içerecektir.
Örnek 1 - date_parse() örneği
<?php
print_r(date_parse("1923-11-29 20:30:00.0"));
?>
Yukarıdaki örneğin çıktısı:
Array
(
[year] => 1923
[month] => 11
[day] => 29
[hour] => 20
[minute] => 30
[second] => 0
[fraction] => 0
[warning_count] => 0
[warnings] => Array ()
[error_count] => 0
[errors] => Array ()
[is_localtime] =>
)
(PHP 5 >= 5.1.2)
date_sun_info — Güneşin doğuşu/batışı ve alacakaranlık başlangıcı/sonu hakkında bilgi içeren bir dizi döndürür
Zaman damgası.
Enlem derecesi.
Boylam derecesi.
Başarılı olduğunda diziyi, başarısız olduğunda FALSE değerini döndürür.
Örnek 1 - date_sun_info() örneği
<?php
$sun_info = date_sun_info(strtotime("2008-12-12"), 36.55, 32.03);
foreach ($sun_info as $key => $val) {
echo "$key: " . date("H:i:s", $val) . "\n";
}
?>
Yukarıdaki örneğin çıktısı:
sunrise: 06:54:58 sunset: 16:36:54 transit: 11:45:56 civil_twilight_begin: 06:26:20 civil_twilight_end: 17:05:32 nautical_twilight_begin: 05:54:03 nautical_twilight_end: 17:37:49 astronomical_twilight_begin: 05:22:39 astronomical_twilight_end: 18:09:14
(PHP 5)
date_sunrise — Belirtilen gün ve konum için şafak zamanını döndürür
date_sunrise() işlevi, verilen gün (zamandamgası ) ve konum için şafak zamanını döndürür.
Şafak zamanı öğrenilecek günün zamandamgası .
| sabit | açıklama | örnek |
|---|---|---|
| SUNFUNCS_RET_STRING | Sonucu dizge olarak döndürür. | 16:46 |
| SUNFUNCS_RET_DOUBLE | Sonucu gerçek sayı olarak döndürür. | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | Sonucu tamsayı (zaman damgası) olarak döndürür. | 1095034606 |
Kuzey yarımküre öntanımlıdır. Güney yarımküre için negatif değer girin. Ayrıca bakınız: date.default_latitude
Doğu yarımküre öntanımlıdır. Batı yarımküre için negatif değer girin. Ayrıca bakınız: date.default_longitude
Öntanımlı: date.sunrise_zenith
Saat cinsinden belirtilir.
Başarılı olduğunda, biçim değiştirgesiyle belirlenen biçimde şafak zamanını, başarız olduğunda FALSE değerini döndürür.
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
Örnek 1 - date_sunrise() örneği
<?php
/* İstanbul, Türkiye için şafak hesabı
Enlem: 41.01 Kuzey
Boylam: 28.58 Doğu
Başucu ~= 90
saat farkı: +2 GMT
*/
echo date("D M d Y"). ', şafak: ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 41.01, 28.58, 90, 2);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Fri Dec 12 2008, şafak: 07:25
(PHP 5)
date_sunset — Verilen gün ve konum için günbatımı zamanını döndürür
date_sunset() işlevi, verilen gün (zamandamgası ) ve konum için günbatımı zamanını döndürür.
Günbatımı zamanı alınacak günün zamandamgası .
| sabit | açıklama | örnek |
|---|---|---|
| SUNFUNCS_RET_STRING | Sonucu dizge olarak döndürür. | 16:46 |
| SUNFUNCS_RET_DOUBLE | Sonucu gerçek sayı olarak döndürür. | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | Sonucu tamsayı (zaman damgası) olarak döndürür. | 1095034606 |
Kuzey yarımküre öntanımlıdır. Güney yarımküre için negatif değer girin. Ayrıca bakınız: date.default_latitude
Doğu yarımküre öntanımlıdır. Batı yarımküre için negatif değer girin. Ayrıca bakınız: date.default_longitude
Öntanımlı: date.sunset_zenith
Saat cinsinden belirtilir.
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
Başarılı olduğunda, biçim değiştirgesiyle belirlenen biçemde gün batımı zamanını, başarız olduğunda FALSE değerini döndürür.
Örnek 1 - date_sunset() örneği
<?php
/* İstanbul, Türkiye için günbatımı zamanı hesabı
Enlem: 41.01 Kuzey
Boylam: 28.58 Doğu
Başucu ~= 90
saat farkı: +2 GMT
*/
echo date("D M d Y"). ', günbatımı: ' .date_sunset(time(), SUNFUNCS_RET_STRING, 41.01, 28.58, 90, 2);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Thu Dec 11 2008, günbatımı: 16:33
(PHP 5 >= 5.3.0)
date_timestamp_get — DateTime::getTimestamp işlevinin takma adıdır
Bu işlev, DateTime::getTimestamp işlevinin takma adıdır.
(PHP 5 >= 5.3.0)
date_timestamp_set — DateTime::setTimestamp işlevinin takma adıdır
Bu işlev, DateTime::setTimestamp işlevinin takma adıdır.
(PHP 4, PHP 5)
date — Yerel tarihi/saati biçimlendirir
zaman_damgası değiştirgesi ile belirtilen zamanı ya da zaman damgası değiştirgesi kullanılmamışsa yerel zamanı, belirtilen biçime göre biçimlendirerek döndürür. Başka bir deyişle, zaman_damgası değiştirgesini belirtmek isteğe bağlıdır ve varsayılan değeri time() işlevinin değeridir.
Çıktılanan zamanın string türünden biçimi. Biçimlendirme seçenekleri için aşağıya bakınız. Ayrıca burada kullanılabilecek önceden tanımlanmış çeşitli tarih sabitleri vardır. Örneğin, DATE_RSS sabiti 'D, d M Y H:i:s' biçemini içerir.
| biçim karakteri | Açıklama | Örnek sonuç |
|---|---|---|
| Gün | --- | --- |
| d | Ay günlerinin sıfır dolgulu iki haneli gösterimi | 01'den 31'e |
| D | Ay günlerinin üç harfli metinsel gösterimi | Pzt'den Paz'a |
| j | Ay günlerinin sıfır dolgusuz gösterimi | 1'den 31'e |
| l (küçük 'L' harfi) | Hafta günlerinin tam metinsel gösterimi | Pazar'dan Cumartesi'ye |
| N | Hafta günlerinin ISO-8601 standardında sayısal gösterimi (PHP 5.1.0'da eklenmiştir) | 1'den (Pazartesi için) 7'ye (Pazar için) |
| S | Ay günleri için 2 karakterli İngilizce sıralama ekleri | st, nd, rd ya da th. j ile uyumlu çalışmaktadır. |
| w | Hafta günlerinin sayısal gösterimi | 0'dan (Pazar için) 6'ya (Cumartesi için) |
| z | Yılın günleri (0'dan başlar) | 0'dan 365'e |
| Hafta | --- | --- |
| W | ISO-8601 standartına göre yılın hafta numarası, hafta başlangıcı Pazartesi'dir (PHP 4.1.0 sürümüyle eklenmiştir) | Örneğin: 42 (Yılın 42'inci haftası) |
| Ay | --- | --- |
| F | Ayın tam metinsel gösterimi, Ocak ya da Mart gibi | January'den December'a |
| m | Ayın sıfır dolgulu sayısal gösterimi | 01'den 12'ye |
| M | Ayın üç karakterli, metinsel kısa gösterimi | Jan'dan Dec'e kadar |
| n | Ayın sıfır dolgusuz sayısal gösterimi | 1'den 12'ye kadar |
| t | Belirtilen ayın gün sayısı | 28'den 31'e |
| Yıl | --- | --- |
| L | Artık yıl olduğunda | Eğer artık yılsa 1, değilse 0. |
| o | ISO-8601 standardı yıl numarası. ISO hafta numaralarının (W) ait olduğu yılın gösterilmesi dışında Y ile aynı değere sahiptir. (PHP 5.1.0 sürümünde eklenmiştir) | Örnekler: 1999 ya da 2003 gibi |
| Y | Yılın 4 haneli sayısal, tam gösterimi | Örnekler: 1999 ya da 2003 gibi |
| y | Yılın iki haneli gösterimi | Örnekler: 99 ya da 03 gibi |
| Saat | --- | --- |
| a | Küçük harfli öğleden önce ve öğleden sonra | am ya da pm |
| A | Büyük harfli öğleden önce ve öğleden sonra | AM ya da PM |
| B | Swatch İnternet saati | 000'dan 999'a |
| g | Saatin, 12-saatlik sıfır dolgusuz gösterimi | 1'den 12'ye |
| G | Saatin, 24-saatlik sıfır dolgusuz gösterimi | 0'dan 23'e |
| h | Saatin, 12-saatlik sıfır dolgulu gösterimi | 01'den 12'ye |
| H | Saatin, 24-saatlik sıfır dolgulu gösterimi | 00'dan 23'e |
| i | Sıfır dolgulu dakika gösterimi | 00 ile 59 arasında |
| s | Sıfır dolgulu saniye gösterimi | 00 ile 59 arasında |
| u | Mikrosaniye (PHP 5.2.2 sürümüyle eklenmiştir) | Örneğin: 654321 |
| Zaman dilimi | --- | --- |
| e | Zaman dilimi belirteci (PHP 5.1.0 sürümüyle eklenmiştir) | Örnekler: UTC, GMT, Europe/Istanbul |
| I (büyük ı) | Yaz saati uygulaması var mı? | Varsa 1, yoksa 0. |
| O | Saat olarak Greenwich zamanı (GMT) farkı | Örneğin: +0200 |
| P | Saat ve dakika olarak Greenwich zamanı (GMT) farkı (PHP 5.1.3 sürümüyle eklenmiştir) | Örneğin: +02:00 |
| T | Zaman dilimi kısaltması | Örnekler: EST, EET gibi |
| Z | Saniye cinsinden saat farkı. UTC'nin batısı daima negatif, doğusu ise daima pozitif değerlidir. | -43200'den 50400'e |
| Tam Tarih/Saat | --- | --- |
| c | ISO 8601 standardı tarih (PHP 5'te' eklenmiştir) | 2004-02-12T15:19:21+00:00 |
| r | » RFC 2822 biçiminde tarih | Örneğin: Thu, 21 Dec 2000 16:01:07 +0200 |
| U | Unix Zaman Başlangıcından (1 Ocak 1970 00:00:00 GMT) itibaren geçen saniye sayısı | time() işlevine bakınız |
Biçim dizgesinde tanınmayan karakterler olduğu gibi yazdırılacaktır. Z biçimi gmdate() işleviyle kullanıldığında daima 0 değerini döndürür.
Bilginize: Bu işlev sadece integer türünde zaman damgalarını kabul etmektedir. u biçim karakteri sadece date_format() işlevinde, date_create() işleviyle kullanıcı tabanlı bir zaman damgası oluşturulduğunda kullanılabilir.
Seçimlik zaman_damgası değiştirgesi integer türünde bir Unix zaman damgası olup belirtilmediği takdirde yerel zaman kullanılır. Başka bir deyişle, time() işlevinden dönen değer öntanımlıdır.
Biçimlendirilmiş tarih dizgesi döndürür. Eğer zaman_damgası değiştirgesi için sayı olmayan bir değer girilirse; FALSE döndürülür ve E_WARNING seviyesinde bir hata çıktılanır.
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 | Zaman damgasının geçerlilik aralığı, genellikle Cum, 13 Ara 1901 20:45:54 GMT ile Per, 19 Oca 2038 03:14:07 GMT arasındadır. (Bu tarih değerleri aynı zamanda en küçük ve en büyük 32-bit işaretli tamsayıları temsil etmektedir.) Bununla birikte, PHP 5.1.0'den önce bu aralık bazı sistemlerde 01-01-1970 ile 19-01-2038 arasıyla sınırlıydı. (ör: Windows). |
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
| 5.1.1 | Standart tarih/zaman biçimleri için, biçim değiştirgesinde kullanılabilecek yararlı sabitler devreye girdi. |
Örnek 1 - date() örnekleri
<?php
// varsayılan zaman dilimini ayarla. PHP 5.1'den beri kullanılabilir.
date_default_timezone_set('UTC');
// Şöyle bir şey basar: Monday
echo date("l");
// Şöyle bir şey basar: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
// Şöyle bir şey basar: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
/* biçim değiştirgesi için sabit kullanımı*/
// Şöyle bir şey basar: Mon, 15 Aug 2005 15:12:46 UTC
echo date(DATE_RFC822);
// Şöyle bir şey basar: 2000-07-01T00:00:00+00:00
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>
Biçim dizgesinin içinde tanınan bir karakterin önüne bir tersbölü imi koyarak yorumlanmasını engelleyebilirsiniz. Eğer tersbölülü karakter zaten özel bir dizilimi ifade ediyorsa, bir tane daha tersbölü karakterine ihtiyacınız olacaktır.
Örnek 2 - date() işlevinde önceleme karakterleri
<?php
// Şöyle bir şey basar: Wednesday the 15th
echo date("l \\t\h\e jS");
?>
date() ve mktime() işlevleri birlikte, geçmiş ya da gelecek zamanın bulunmasında kullanılabilir.
Örnek 3 - date() ve mktime() örneği
<?php
$yarın = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$geçenay = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$gelecekyıl = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>
Bilginize: Bu kullanım, yaz saati uygulamasından dolayı, bir zaman damgasına basitçe saniye, gün ve ay ekleme veya çıkartma işlemlerinden daha güvenilirdir.
Bazı date() işlevi biçimlendirme örnekleri. Diğer öncelenen karakterlerin, geçerli bir özel anlama sahip olabileceklerinden istenmeyen sonuçlara neden olacağını ve gelecekteki PHP sürümlerinde kullanılmak üzere tahsis edilebileceklerini dikkate alın. Önceleme yaparken \n gibi özel karakterlerin oluşmasını önlemek için dizgeyi tek tırnaklar arasına almayı unutmayın.
Örnek 4 - date() Biçemlemesi
<?php
// Bugünün; March 10th, 2001, 5:16:18 pm olduğunu ve
// Mountain Standard Time (MST) Zaman Diliminde olduğumuzu varsayıyoruz
$bugün = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$bugün = date("m.d.y"); // 03.10.01
$bugün = date("j, n, Y"); // 10, 3, 2001
$bugün = date("Ymd"); // 20010310
$bugün = date('h-i-s, j-m-y, it is w Day'); // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$bugün = date('\i\t \i\s \t\h\e jS \d\a\y.'); // it is the 10th day.
$bugün = date("D M j G:i:s T Y"); // Sat Mar 10 17:16:18 MST 2001
$bugün = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:18 m is month
$bugün = date("H:i:s"); // 17:16:18
?>
Tarihi farklı dillerde biçimlendirmek için, date() işlevi yerine setlocale() ve strftime() işlevini kullanmalısınız.
Bilginize: Tarihin dizge gösteriminden zaman damgası üretirken, strtotime() işlevini kullanabilirsiniz. Ayrıca, bazı veritabanları girilen zaman damgalarını kendi biçimine çeviren işlevlere sahiptir (MySQL'in » UNIX_TIMESTAMP işlevi gibi).
PHP 5.1 sürümünden beri istek başlangıcının zaman damgası $_SERVER['REQUEST_TIME'] değişkeniyle tanımlanmaktadır.
(PHP 4, PHP 5)
getdate — Tarih/zaman bilgisi getirir
Değiştirgeyle çağrılmışsa zaman_damgası 'na karşılık olan tarih bilgisini bir ilişkisel dizi olarak döndürür. Değiştirgesiz çağrılmışsa dönen değer o anın yerel zamanına göre olur.
Seçimlik zaman_damgası değiştirgesi integer türünde bir Unix zaman damgası olup belirtilmediği takdirde yerel zaman kullanılır. Başka bir deyişle, time() işlevinden dönen değer öntanımlıdır.
zaman_damgası 'na karşılık olan tarih bilgisini bir ilişkisel dizi olarak döndürür. İlişkisel dizide döndürülen öğeler aşağıdaki gibidir:
| Anahtar | Açıklama | Örnek dönüş değerleri |
|---|---|---|
| "seconds" | Saniyelerin sayısal gösterimi | 0'dan 59'a kadar |
| "minutes" | Dakikaların sayısal gösterimi | 0'dan 59'a kadar |
| "hours" | Saatlerin sayılsal gösterimi | 0'dan 23'e kadar |
| "mday" | Ayın günlerinin sayısal gösterimi | 1'den 31'e kadar |
| "wday" | Haftanın günlerinin sayılsal gösterimi | (Pazar için) 0'dan (Cumartesi için) 6'ya kadar |
| "mon" | Ayın sayısal gösterimi | 1 'den 12'ye kadar |
| "year" | Yılın 4 haneli sayısal tam gösterimi | Örnek: 1999 ya da 2003 gibi |
| "yday" | Yılın gününün sayısal gösterimi | 0'dan 365'e kadar |
| "weekday" | Haftanın gününün metinsel tam gösterimi | Sunday'dan Saturday'ye |
| "month" | Ayın metinsel tam gösterimi, Ocak ya da Mart gibi | January'dan December'a kadar |
| 0 | Saniyeler, Unix Zaman Başlangıcından itibaren, time() işlevi tarafından döndürülen ve date() işleviyle kullanılan değerlerle benzerdir. | Sisteme Bağımlı, genellikle -2147483648 ile 2147483647 arasında. |
Örnek 1 - getdate() örneği
<?php
$bugun = getdate();
print_r($bugun);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[seconds] => 40
[minutes] => 58
[hours] => 21
[mday] => 17
[wday] => 2
[mon] => 6
[year] => 2003
[yday] => 167
[weekday] => Salı
[month] => Haziran
[0] => 1055901520
)
(PHP 4, PHP 5)
gettimeofday — Geçerli zamanı getirir
gettimeofday(2) işlevinin arayüzüdür. Sistem çağrısıdan döndürülmüş veriyi içeren bir ilişkisel dizi döndürür.
TRUE olarak ayarlanmışsa, bir dizi yerine bir gerçek sayı döndürür.
Varsayılan durumda değer array türünden döner. Eğer sayı_döndür değiştirgesi TRUE ise float türünde bir değerle döner.
Dizi anahtarları:
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 | sayı_döndür değiştirgesi eklendi. |
Örnek 1 - gettimeofday() örneği
<?php
print_r(gettimeofday());
echo gettimeofday(true);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[sec] => 1073504408
[usec] => 238215
[minuteswest] => 0
[dsttime] => 1
)
1073504408.23910
(PHP 4, PHP 5)
gmdate — Bir tarih/saati GMT/UTC tarih/saati olarak biçemler
Zamanı, Greenwich Saatiyle (GMT) döndürmesi dışında tıpkı date() işlevi gibi çalışır.
Zaman çıktısının biçimi string türündendir. Biçimlendirme seçenekleri için date() işlevine bakınız.
Seçimlik zaman_damgası değiştirgesi integer türünde bir Unix zaman damgası olup belirtilmediği takdirde yerel zaman kullanılır. Başka bir deyişle, time() işlevinden dönen değer öntanımlıdır.
Biçimlendirilmiş tarih dizgesi döndürür. Eğer zaman_damgası değiştirgesi için sayısal değer kullanılmamışsa, FALSE döndürür ve E_WARNING seviyesinde bir hata çıktılar.
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 | Zaman damgasının geçerlilik aralığı, genellikle Cum, 13 Ara 1901 20:45:54 GMT ile Per, 19 Oca 2038 03:14:07 GMT arasındadır. (Bu tarih değerleri aynı zamanda en küçük ve en büyük 32 bitlik işaretli tamsayıları temsil etmektedir.) Bununla birikte, PHP 5.1.0'den önce bu aralık bazı sistemlerde (ör: Windows) 01-01-1970 ile 19-01-2038 arasıyla sınırlıdır. |
| 5.1.1 | biçem değiştirgesinde kullanılabilecek standart tarih/zaman biçem sabitleri kullanıma girdi. |
Örnek 1 - gmdate() örneği
Aşağıdaki betik Türkiye'de (GMT +0200) çalıştırılsaydı ilk çıktı "01 Oca 1998 00:00:00", ikinci çıktı "31 Ara 1997 22:00:00" olurdu.
<?php
echo date("d M Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
echo gmdate("d M Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
?>
(PHP 4, PHP 5)
gmmktime — Bir GMT tarihi için Unix zaman damgasını döndürür
Aktarılan değiştirgelerin bir GMT tarihini belirtmesi dışında tıpkı mktime() işlevi gibidir. gmmktime() işlevi kendi içinde mktime() işlevini kullanır ve sadece türetilen yerel zamanda geçerli zamanlar kullanılabilir.
mktime() işlevindeki gibi, değiştirgeler sağdan sola sıralıdır. Böylece belirtilmeyen değiştirge için geçerli GMT zamanının kullanılabilmesi sağlanmıştır.
Saat
Dakika
Saniye-
Ay
Gün
Yıl
Değiştirgeler daima GMT zamanını temsil eder. ysu_var değiştirgesinin sonuca etkisi yoktur.
integer türünden Unix zaman damgası döner.
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 | PHP 5.1.0 sürümünden beri, ysu_var değiştirgesinin kullanılması önerilmemektedir. Sonuç olarak, yerine yeni zaman dilimi özellikleri kullanılmalıdır. |
Örnek 1 - Windows üzerinde gmmktime() işlevi
<?php
gmmktime(0, 0, 0, 1, 1, 1970); // GMT ve batıda geçerli, doğuda geçersiz
?>
(PHP 4, PHP 5)
gmstrftime — Yerel ayarlara göre tarih ve saati, GMT/UTC türüne çevirir
Zamanı, Greenwich Saatiyle (GMT) döndürmesi dışında tıpkı strftime() işlevi gibi davranır. Örneğin, Doğu Standart Zamanınında (GMT -0500) çalıştırıldığında, aşağıdaki örneğin ilk satırı "Ara 31 1998 20:00:00" basarken ikinci satırı "Oca 01 1999 01:00:00" basar.
Açıklama için strftime() işlevine bakınız.
Seçimlik zaman_damgası değiştirgesi integer türünde bir Unix zaman damgası olup belirtilmediği takdirde yerel zaman kullanılır. Başka bir deyişle, time() işlevinden dönen değer öntanımlıdır.
İstenilen biçime göre verilen zaman_damgası değiştirgesini ya da zaman damgası değiştirgesi kullanılmamışsa yerel zamanı; biçimlendirilmiş dizge olarak döndürür. Ay ve hafta günlerinin isimleri ve diğer dile bağımlı dizgelerle ilgili geçerli yereller setlocale() işlevi ile ayarlanabilir.
Örnek 1 - gmstrftime() örneği
<?php
setlocale(LC_TIME, 'en_US');
echo strftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
echo gmstrftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
?>
(PHP 5)
idate — Yerel zamanı/tarihi tamsayı olarak biçimlendirir
zaman_damgası ile belirtilen zaman için biçem dizgesine göre biçemlenmiş bir sayı döndürür. zaman_damgası belirtilmemişse time() işlevinin çıktısı öntanımlıdır.
date() işlevinden farklı olarak, idate() işlevi biçem dizgesi olarak tek bir karakter kabul eder.
| biçem karakterleri | Açıklama |
|---|---|
| B | Swatch Ritim/İnternet Saati |
| d | Ayın günleri |
| h | Saat (12 saatlik gösterim) |
| H | Saat (24 saatlik gösterim) |
| i | Dakika |
| I (büyük ı) | Yaz Saati Uygulaması etkinleştirilmişse 1, diğer durumlarda 0 döndürür |
| L (büyük l) | artık yıl için 1, değilse 0 döndürür |
| m | Ayın sayısal dengi |
| s | Saniye |
| t | Şimdiki ayın günleri |
| U | Unix Zaman Başlangıcından (1 Ocak 1970 00:00:00 UTC) beri geçen saniye sayısı; time() işlevinin çıktısına eşdeğerdir. |
| w | Haftanın günü (Pazar için 0) |
| W | ISO-8601 standardına göre yılın hafta numarası, haftaların başlangıcı Pazartesi'dir |
| y | Yıl (1 yada 2 karakter - aşağıya bakınız) |
| Y | Yıl (4 haneli) |
| z | Yılın günü |
| Z | Sanile olarak zaman dilimi |
Seçimlik zaman_damgası değiştirgesi integer türünde bir Unix zaman damgası olup belirtilmediği takdirde yerel zaman kullanılır. Başka bir deyişle, time() işlevinden dönen değer öntanımlıdır.
integer türünde bir değer döner.
idate() işlevi daima integer türünde değer döndürse de bu değerler "0" ile başlayamaz. idate() işlevi beklediğinizden daha az karakter döndürebilir. Aşağıdaki örneğe bakınız.
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
Örnek 1 - idate() örneği
<?php
$timestamp = strtotime('1st January 2004'); //1072915200
// Yılı iki haneli basması gerekirse de
// başında "0" olmadan sadece "4" basar
echo idate('y', $timestamp);
?>
(PHP 4, PHP 5)
localtime — Yerel zamanı getirir
localtime() işlevi, standart C işlev çağrısı olan localtime tarafından döndürülen yapıya eşdeğer bir dizi döndürür.
Seçimlik zaman_damgası değiştirgesi integer türünde bir Unix zaman damgası olup belirtilmediği takdirde yerel zaman kullanılır. Başka bir deyişle, time() işlevinden dönen değer öntanımlıdır.
Eğer değiştirge FALSE olarak ayarlanmış ya da kullanılmamışsa, sayısal indisli bir dizi döndürür. Eğer değiştirge TRUE olarak ayarlanmışsa localtime() işlevi standart C işlevi localtime tarafından döndürülen yapıyı farklı öğe isimleriyle indislenmiş olarak bir ilişkisel dizi olarak döndürür. İlişkisel dizinin farklı öğe isimleri aşağıdaki gibidir:
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
Örnek 1 - localtime() örneği
<?php
$localtime = localtime();
$localtime_assoc = localtime(time(), true);
print_r($localtime);
print_r($localtime_assoc);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Array
(
[0] => 24
[1] => 3
[2] => 19
[3] => 3
[4] => 3
[5] => 105
[6] => 0
[7] => 92
[8] => 1
)
Array
(
[tm_sec] => 24
[tm_min] => 3
[tm_hour] => 19
[tm_mday] => 3
[tm_mon] => 3
[tm_year] => 105
[tm_wday] => 0
[tm_yday] => 92
[tm_isdst] => 1
)
(PHP 4, PHP 5)
microtime — Geçerli Unix zaman damgasını mikrosaniye olarak döndürür
microtime() işlevi geçerli Unix zaman damgasını mikrosaniye cinsinden döndürür. Bu işlev sadece gettimeofday() sistem çağrısını destekleyen işletim sistemlerinde geçerlidir.
İşlev, isteğe bağlı olarak değiştirgesiz çağırıldığında; "msan. san." dizgesini döndürür. 'san.' geçerli zamanın Unix Zamam Başlangıcından (1 Ocak 1970 0:00:00 GMT) itibaren hesaplanan saniyeyi ve 'msan.' ise mikrosaniye kısmını belirtir. Dizgenin iki kısmı da saniye cinindendir.
İsteğe bağlı kullanılan bu değiştirgeyle TRUE aktarıldığında, saniyeler float türünde döndürülür.
| Sürüm: | Açıklama |
|---|---|
| 5.0.0 | gerçek_sayı değiştirgesi eklendi. |
Örnek 1 - microtime() ile zamanlama betiği
<?php
/**
* PHP 5 davranışını taklit eden basit bir işlev
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$sure_baslangici = microtime_float();
// Biraz bekle
usleep(100);
$sure_bitimi = microtime_float();
$sure = $sure_bitimi - $sure_baslangici;
echo "Bekleme süresi: $time saniye\n";
?>
Örnek 2 - PHP 5'de zamanlama betiği
<?php
$sure_baslangici = microtime(true);
// Biraz bekle
usleep(100);
$sure_bitimi = microtime(true);
$sure = $sure_bitimi - $sure_baslangici;
echo "Bekleme süresi: $time saniye.\n";
?>
(PHP 4, PHP 5)
mktime — Bir tarih için Unix zaman damgasını döndürür
Verilen değiştirge düzenine göre Unix zaman damgasını döndürür. Bu zaman damgası, Unix Zaman Başlangıcı (1 Ocak 1970 00:00:00 GMT) ile belirtilen zaman arasında geçen süreyi uzun tamsayı türünde saniye olarak belirtir.
Değiştirgeler sağdan sola sıralıdır; böylece belirtilmeyen bir değiştirge yerine yerel tarih ve zamana göre geçerli değerin kullanılması sağlanmıştır.
Bilginize: PHP 5.1'den itibaren, mktime() değiştirgesiz çağrıldığına bir E_STRICT uyarısı çıktılamaktadır. Böyle durumlarda time() işlevini kullanmalısınız.
Saat sayısı.
Dakika sayısı.
Son dakikanın geçen saniye sayısı.
Ay sayısı.
Gün sayısı.
Yıl sayısı, iki ya da dört hane olabilir. 0-69 değerleri arasında olanlar 2000-2069 ile ve 70-100 arasındaki değerler ise 1970-2000 yıllarıyla eşleşir. Sistemlerdeki time_t türü 32 bit işaretli tamsayı türüyle belirtilmiştir ve günümüzde çok kullanılmaktadır. yıl değiştirgesi için geçerli aralık 1901 ve 2038 arasındadır. Bununla birlikte, PHP 5.1.0 sürümünden önce bu aralık bazı sistemlerde 1970 ve 2038 arasında sınırlıydı (ör. Windows).
Bu değiştirge, yaz saati uygulaması varsa 1'e yoksa 0'a ya da yaz saati uygulması olup olmadığının bilinmediği durumlarda varsayılan değere yani -1'e ayarlanmalıdır. Bilinmeyen durumlarda PHP bunu çözümleyecektir. Bu beklenmeyen sonuçlara (fakat yanlış olmayan) neden olur. Bazı zamanlarda, PHP çalışırken YSU etkinleştirildiğinde ya da ysu_var değiştirgesi 1'e ayarlandığında zaman geçersiz olur. Örneğin, eğer saat 2:00'de YSU etkinleştirilirse, 2:00 ve 3:00 arasındaki tüm zaman geçersiz olacak ve mktime() işlevi anlamsız (genellikle negatif) bir değerle dönecektir. Bazı sistemlerde (ör. Solaris 8) YSU gece yarısında etkinleşir. YSU etkinleştiğinde saat 0:30 ise, saat bir önceki günün 23:30'u olarak değerlendirilecektir.
Bilginize: PHP 5.1.0 sürümünden beri, bu değiştirgenin kullanılması önerilmemektedir. Sonuç olarak, yerine yeni zaman dilimi özellikleri kullanılmalıdır.
mktime() işlevi verilen değiştirgelerden elde edilen Unix zaman damgası döndürür. Eğer değiştirge geçersiz ise işlev FALSE değeriyle döner (PHP 5.1 sürümünden önce -1 dönerdi).
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | Artık mktime() işlevi, ysu_var değiştirgesi kullanılırsa E_DEPRECATED uyarısı vermektedir. |
| 5.1.0 | ysu_var değiştirgesinin kullanımı artık önerilmemektedir. İşlev hata durumunda -1 yerine, FALSE değeri döndürür olmuştur. İşlev, yıl, ay ve gün değiştirgelerinde sıfır kabul edecek şekilde düzeltilmiştir. |
| 5.1.0 | mktime() değiştirgesiz çağrıldığına bir E_STRICT uyarısı çıktılamaktadır. Böyle durumlarda time() işlevini kullanmalısınız. |
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
Örnek 1 - Basit bir mktime() örneği
<?php
// Öntanımlı zaman dilimini belirtelim. PHP 5.1'den beri kullanılabiliyor.
date_default_timezone_set('UTC');
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
// Çıktısı: July 1, 2000 is on a Saturday
echo date('c', mktime(1, 2, 3, 4, 5, 2006));
// Şöyle bir şey basar: 2006-04-05T01:02:03+00:00
?>
Örnek 2 - mktime() örneği
mktime() işlevi tarih hesaplamaları ve geçerlilik denetimi için kullanışlıdır. Aralık dışına çıkan değerleri (ayın 32'si gibi) özdevinimli olarak doğru hesaplar. Örneğin, aşağıdaki satırların üreteceği dizge "Jan-01-1998" olacaktır.
<?php
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
?>
Örnek 3 - Gelecek ayın son günü
Verilen herhangi bir ayın son günü, gelecek ayın -1'inci değil 0'ıncı günü olarak ifade edilebilir. Aşağıdaki iki örnek de "2000 Şubat'ının son günü: 29" dizgesi üretilecektir.
<?php
$songün = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("2000 Şubat'ının son günü: %d", $songün);
$songün = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("2000 Şubat'ının son günü: %d", $songün);
?>
PHP 5.1.0 sürümünden önce, negatif zaman damgaları bilinen Windows sürümleri altında ve diğer benzer sistemlerde desteklemiyordu. Bundan dolayı, geçerli yılların aralığı 1970 ile 2038 arasında sınırlıydı.
(PHP 4, PHP 5)
strftime — Format a local time/date according to locale settings
Format the time and/or date according to locale settings. Month and weekday names and other language-dependent strings respect the current locale set with setlocale().
Not all conversion specifiers may be supported by your C library, in which case they will not be supported by PHP's strftime(). Additionally, not all platforms support negative timestamps, so your date range may be limited to no earlier than the Unix epoch. This means that %e, %T, %R and, %D (and possibly others) - as well as dates prior to Jan 1, 1970 - will not work on Windows, some Linux distributions, and a few other operating systems. For Windows systems, a complete overview of supported conversion specifiers can be found at » MSDN.
| format | Description | Example returned values |
|---|---|---|
| Day | --- | --- |
| %a | An abbreviated textual representation of the day | Sun through Sat |
| %A | A full textual representation of the day | Sunday through Saturday |
| %d | Two-digit day of the month (with leading zeros) | 01 to 31 |
| %e | Day of the month, with a space preceding single digits | 1 to 31 |
| %j | Day of the year, 3 digits with leading zeros | 001 to 366 |
| %u | ISO-8601 numeric representation of the day of the week | 1 (for Monday) though 7 (for Sunday) |
| %w | Numeric representation of the day of the week | 0 (for Sunday) through 6 (for Saturday) |
| Week | --- | --- |
| %U | Week number of the given year, starting with the first Sunday as the first week | 13 (for the 13th full week of the year) |
| %V | ISO-8601:1988 week number of the given year, starting with the first week of the year with at least 4 weekdays, with Monday being the start of the week | 01 through 53 (where 53 accounts for an overlapping week) |
| %W | A numeric representation of the week of the year, starting with the first Monday as the first week | 46 (for the 46th week of the year beginning with a Monday) |
| Month | --- | --- |
| %b | Abbreviated month name, based on the locale | Jan through Dec |
| %B | Full month name, based on the locale | January through December |
| %h | Abbreviated month name, based on the locale (an alias of %b) | Jan through Dec |
| %m | Two digit representation of the month | 01 (for January) through 12 (for December) |
| Year | --- | --- |
| %C | Two digit representation of the century (year divided by 100, truncated to an integer) | 19 for the 20th Century |
| %g | Two digit representation of the year going by ISO-8601:1988 standards (see %V) | Example: 09 for the week of January 6, 2009 |
| %G | The full four-digit version of %g | Example: 2008 for the week of January 3, 2009 |
| %y | Two digit representation of the year | Example: 09 for 2009, 79 for 1979 |
| %Y | Four digit representation for the year | Example: 2038 |
| Time | --- | --- |
| %H | Two digit representation of the hour in 24-hour format | 00 through 23 |
| %I | Two digit representation of the hour in 12-hour format | 01 through 12 |
| %l (lower-case 'L') | Hour in 12-hour format, with a space preceeding single digits | 1 through 12 |
| %M | Two digit representation of the minute | 00 through 59 |
| %p | UPPER-CASE 'AM' or 'PM' based on the given time | Example: AM for 00:31, PM for 22:23 |
| %P | lower-case 'am' or 'pm' based on the given time | Example: am for 00:31, pm for 22:23 |
| %r | Same as "%I:%M:%S %p" | Example: 09:34:17 PM for 21:34:17 |
| %R | Same as "%H:%M" | Example: 00:35 for 12:35 AM, 16:44 for 4:44 PM |
| %S | Two digit representation of the second | 00 through 59 |
| %T | Same as "%H:%M:%S" | Example: 21:34:17 for 09:34:17 PM |
| %X | Preferred time representation based on locale, without the date | Example: 03:59:16 or 15:59:16 |
| %z | Either the time zone offset from UTC or the abbreviation (depends on operating system) | Example: -0500 or EST for Eastern Time |
| %Z | The time zone offset/abbreviation option NOT given by %z (depends on operating system) | Example: -0500 or EST for Eastern Time |
| Time and Date Stamps | --- | --- |
| %c | Preferred date and time stamp based on local | Example: Tue Feb 5 00:45:10 2009 for February 4, 2009 at 12:45:10 AM |
| %D | Same as "%m/%d/%y" | Example: 02/05/09 for February 5, 2009 |
| %F | Same as "%Y-%m-%d" (commonly used in database datestamps) | Example: 2009-02-05 for February 5, 2009 |
| %s | Unix Epoch Time timestamp (same as the time() function) | Example: 305815200 for September 10, 1979 08:40:00 AM |
| %x | Preferred date representation based on locale, without the time | Example: 02/05/09 for February 5, 2009 |
| Miscellaneous | --- | --- |
| %n | A newline character ("\n") | --- |
| %t | A Tab character ("\t") | --- |
| %% | A literal percentage character ("%") | --- |
Maximum length of this parameter is 1023 characters.
Contrary to ISO-9899:1999, Sun Solaris starts with Sunday as 1. As a result, %u may not function as described in this manual.
Seçimlik zaman_damgası değiştirgesi integer türünde bir Unix zaman damgası olup belirtilmediği takdirde yerel zaman kullanılır. Başka bir deyişle, time() işlevinden dönen değer öntanımlıdır.
Returns a string formatted according format using the given timestamp or the current local time if no timestamp is given. Month and weekday names and other language-dependent strings respect the current locale set with setlocale().
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
As the output is dependent upon the underlying C library, some conversion specifiers are not supported. On Windows, supplying unknown conversion specifiers will result in 5 E_WARNING messages and return FALSE. On other operating systems you may not get any E_WARNING messages and the output may contain the conversion specifiers unconverted.
| Sürüm: | Açıklama |
|---|---|
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
This example will work if you have the respective locales installed in your system.
Örnek 1 strftime() locale examples
<?php
setlocale(LC_TIME, "C");
echo strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo strftime(" in Finnish is %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" in French %A and");
setlocale(LC_TIME, "de_DE");
echo strftime(" in German %A.\n");
?>
Örnek 2 ISO 8601:1988 week number example
<?php
/* December 2002 / January 2003
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */
// Outputs: 12/28/2002 - %V,%G,%Y = 52,2002,2002
echo "12/28/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/28/2002")) . "\n";
// Outputs: 12/30/2002 - %V,%G,%Y = 1,2003,2002
echo "12/30/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/30/2002")) . "\n";
// Outputs: 1/3/2003 - %V,%G,%Y = 1,2003,2003
echo "1/3/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2003")) . "\n";
// Outputs: 1/10/2003 - %V,%G,%Y = 2,2003,2003
echo "1/10/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/10/2003")) . "\n";
/* December 2004 / January 2005
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */
// Outputs: 12/23/2004 - %V,%G,%Y = 52,2004,2004
echo "12/23/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/23/2004")) . "\n";
// Outputs: 12/31/2004 - %V,%G,%Y = 53,2004,2004
echo "12/31/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/31/2004")) . "\n";
// Outputs: 1/2/2005 - %V,%G,%Y = 53,2004,2005
echo "1/2/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/2/2005")) . "\n";
// Outputs: 1/3/2005 - %V,%G,%Y = 1,2005,2005
echo "1/3/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2005")) . "\n";
?>
Bilginize: %G and %V, which are based on ISO 8601:1988 week numbers can give unexpected (albeit correct) results if the numbering system is not thoroughly understood. See %V examples in this manual page.
strptime() işlevi çözümlenmiş tarih değiştirgesini bir diziyle döndürür. Hata durumlarındaysa FALSE değeriyle döner.
Ay, gün isimleri ve yerel ayarlarıyla ilgili dile bağımlı diğer dizgeler (LC_TIME), setlocale() işleviyle ayarlanır.
Çözümlenen dizge (ör. strftime() işlevinden dönen değer)
tarih değiştirgesinde kullanılan biçim (ör. strftime() işlevinde kullanılanla aynı).
Biçimlendirme seçenekleri hakkında daha fazla bilgi için strftime() sayfasını okuyun.
Dizi döndürür. Hata durumlarında FALSE değeriyle döner.
| Değiştirge | Açıklama |
|---|---|
| "tm_sec" | Saniye (0-61) |
| "tm_min" | Dakika (0-59) |
| "tm_hour" | Saat (0-23) |
| "tm_mday" | Gün (1-31) |
| "tm_mon" | Ay (0-11) |
| "tm_year" | 1900'den itibaren yıllar |
| "tm_wday" | Pazar'dan itibaren hafta günleri (0-6) |
| "tm_yday" | Ocak 1'den itibaren günler (0-365) |
| "unparsed" | tarih değiştirgesinin bilinmeyen biçim değiştirgesi kullanımından dönen değer |
Örnek 1 - strptime() örneği
<?php
$biçim = '%d/%m/%Y %H:%M:%S';
$strf = strftime($biçim);
echo "$strf\n";
print_r(strptime($strf, $biçim));
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
03/10/2004 15:54:19
Array
(
[tm_sec] => 19
[tm_min] => 54
[tm_hour] => 15
[tm_mday] => 3
[tm_mon] => 9
[tm_year] => 104
[tm_wday] => 0
[tm_yday] => 276
[unparsed] =>
)
Bilginize: Bu işlev Windows sistemlerinde çalışmaz.
Bilginize: "tm_sec" "artık saniyeleri" de içerir (yılda 2 saniyeye kadar). Artık saniyeler hakkında bilgi edinmek için » Wikipedia artık saniyeler makalesine bakınız.
(PHP 4, PHP 5)
strtotime — Parse about any English textual datetime description into a Unix timestamp
The function expects to be given a string containing a US English date format and will try to parse that format into a Unix timestamp (the number of seconds since January 1 1970 00:00:00 UTC), relative to the timestamp given in now , or the current time if now is not supplied.
This function will use the TZ environment variable (if available) to calculate the timestamp. Since PHP 5.1.0 there are easier ways to define the timezone that is used across all date/time functions. That process is explained in the date_default_timezone_get() function page.
The string to parse. Before PHP 5.0.0, microseconds weren't allowed in the time, since PHP 5.0.0 they are allowed but ignored.
The timestamp which is used as a base for the calculation of relative dates.
Returns a timestamp on success, FALSE otherwise. Previous to PHP 5.1.0, this function would return -1 on failure.
Bir tarih/zaman işlevine yapılan her çağrı eğer zaman dilimi ayarı geçerli değilse bir E_NOTICE üretir. Ve/veya eğer sistem ayarları veya TZ ortam değişkeni kullanılıyorsa bir E_STRICT veya bir E_WARNING iletisi üretir. Ayrıca bakınız: date_default_timezone_set()
| Sürüm: | Açıklama |
|---|---|
| 5.2.7 | In PHP 5 prior to 5.2.7, requesting a given occurrence of a given weekday in a month where that weekday was the first day of the month would incorrectly add one week to the returned timestamp. This has been corrected in 5.2.7 and later versions. |
| 5.1.0 | Now returns FALSE on failure, instead of -1. |
| 5.1.0 |
Zaman dilimi hatalarında artık E_STRICT ve E_NOTICE çıktılanıyor. |
| 5.0.2 | In PHP 5 up to 5.0.2, "now" and other relative times are wrongly computed from today's midnight. This differs from other versions where it is correctly computed from current time. |
| 4.4.0 | In PHP versions prior to 4.4.0, "next" is incorrectly computed as +2. A typical solution to this is to use "+1". |
Örnek 1 A strtotime() example
<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>
Örnek 2 Checking for failure
<?php
$str = 'Not Good';
// previous to PHP 5.1.0 you would compare with -1, instead of false
if (($timestamp = strtotime($str)) === false) {
echo "The string ($str) is bogus";
} else {
echo "$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>
Bilginize: If the number of the year is specified in a two digit format, the values between 00-69 are mapped to 2000-2069 and 70-99 to 1970-1999. See the notes below for possible differences on 32bit systems (possible dates might end on 2038-01-19 03:14:07).
Bilginize: The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 UTC to Tue, 19 Jan 2038 03:14:07 UTC. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer.) Additionally, not all platforms support negative timestamps, therefore your date range may be limited to no earlier than the Unix epoch. This means that e.g. dates prior to Jan 1, 1970 will not work on Windows, some Linux distributions, and a few other operating systems. PHP 5.1.0 and newer versions overcome this limitation though.
(PHP 4, PHP 5)
time — Geçerli Unix zaman damgasını döndürür
Unix Zaman Başlangıcından (1 Ocak 1970 00:00:00 GMT) itibaren geçen zamanı saniye cinsinden döndürür.
Örnek 1 - time() örneği
<?php
$gelecekHafta = time() + (7 * 24 * 60 * 60);
// 7 gün; 24 saat; 60 dakida; 60 saniye
echo 'Şimdi: '. date('d-m-Y') ."\n";
echo 'Gelecek Hafta: '. date('d-m-Y', $gelecekHafta) ."\n";
// yada strtotime() işlevi ile kullanımı
echo 'Gelecek Hafta: '. date('d-m-Y', strtotime('+1 week')) ."\n";
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Şimdi: 25-03-2009 Gelecek Hafta: 01-04-2009 Gelecek Hafta: 01-04-2009
İstek başlangıç zamandamgası PHP 5.1'den beri $_SERVER['REQUEST_TIME'] değişkeniyle kullanımdadır.
(PHP 5 >= 5.1.0)
timezone_abbreviations_list — DateTimeZone::listAbbreviations işlevinin takma adıdır
Bu işlev, DateTimeZone::listAbbreviations işlevinin takma adıdır.
(PHP 5 >= 5.1.0)
timezone_identifiers_list — DateTimeZone::listIdentifiers işlevinin takma adıdır
Bu işlev, DateTimeZone::listIdentifiers işlevinin takma adıdır.
(PHP 5 >= 5.3.0)
timezone_location_get — DateTimeZone::getLocation işlevinin takma adıdır
Bu işlev, DateTimeZone::getLocation işlevinin takma adıdır.
(PHP 5 >= 5.1.3)
timezone_name_from_abbr — Kısaltmasından, zaman diliminin adını döndürür
Zaman dilimi kısaltması.
Yerel saatin GMT'ye göre saniye cinsinden farkı. Varsayılan değer, kısaltma değiştirgesinin karşılığı olarak bulunan ilk zaman diliminin döndürüleceği anlamına gelen -1'dir. Yoksa, farka uyan zaman dilimi aranır ve bulunamadığı durumlarda fark ne olursa olsun bulunan ilk zaman dilimi döndürülür.
Yaz saati uygulaması belirteci. Eğer kısaltma değiştirgesi yoksa zaman dilimi yalnızca gmt_farkı ve ysu_var değiştirgelerine göre aranacaktır.
Başarılı olduğunda zaman dilimini adını, başarısız olduğunda FALSE döndürür.
Örnek 1 - timezone_name_from_abbr() örneği
<?php
echo timezone_name_from_abbr("EET") . "\n";
echo timezone_name_from_abbr("", 3600, 0) . "\n";
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Europe/Helsinki Europe/Paris
(PHP 5 >= 5.1.0)
timezone_offset_get — DateTimeZone::getOffset işlevinin takma adıdır
Bu işlev, DateTimeZone::getOffset işlevinin takma adıdır.
(PHP 5 >= 5.1.0)
timezone_open — Yeni bir DateTimeZone nesnesi döndürür
Zaman dilimi belirtecinin tam adı (ör. Europe/Istanbul) ya da kısaltması (ör. EET).
Başarılı olduğunda DateTimeZone nesnesini, başarısız olduğunda FALSE değerini döndürür.
(PHP 5 >= 5.2.0)
timezone_transitions_get — DateTimeZone::getTransitions işlevinin takma adıdır
Bu işlev, DateTimeZone::getTransitions işlevinin takma adıdır.
(PHP 5 >= 5.3.0)
timezone_version_get — Gets the version of the timezonedb
Returns the current version of the timezonedb.
Returns a string.
Örnek 1 Getting the timezonedb version
<?php
echo timezone_version_get();
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
2009.7
This is a PHP language extension for RedHat Newt library, a terminal-based window and widget library for writing applications with user friendly interface. Once this extension is enabled in PHP it will provide the use of Newt widgets, such as windows, buttons, checkboxes, radiobuttons, labels, editboxes, scrolls, textareas, scales, etc. Use of this extension if very similar to the original Newt API of C programming language.
This module uses the functions of the RedHat Newt library. You need libnewt version >= 0.51.0.
Bu » PECL eklentisi PHP ile gelmez. Bu PECL eklentisini kurma bilgisi kılavuzun PECL eklentisinin kurulması başlıklı faslında bulunabilir. Yeni dağıtımlar, indirmeler, kaynak dosyaları, sürdürücü bilgileri ve CHANGELOG gibi ek bilgiyi şu adreste bulabilirsiniz: » http://pecl.php.net/package/newt.
PHP 4'te bu PECL eklentilerinin kaynak kodunu PHP kaynak paketi içindeki ext/ dizininde ya da yukarıdaki PECL bağlantısında bulabilirsiniz. In order to use these functions you must compile CGI or CLI PHP with newt support by using the --with-newt[=DIR] configure option.
Bilginize: This extension is not available for Windows platform.
You may need also curses and slang libraries, in order to compile this extension. To specify locations of these libraries, use the following configuration options: --with-curses-dir=/path/to/libcurses --with-slang-dir=/path/to/libslang
Bu eklentinin php.ini'de tanımlı yapılandırma yönergesi yoktur.
This extension uses two resource types: "newt component" and "newt grid".
Resource type "newt component" is returned by functions, which create common newt widgets (for example: newt_button())
Resource type "newt grid" is a special link identifier for components, returned by newt grid factory functions (for example: newt_create_grid())
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
| constant | meaning |
|---|---|
| NEWT_EXIT_HOTKEY | hotkey defined by newt_form_add_hot_key() was pressed |
| NEWT_EXIT_COMPONENT | some component has caused form to exit |
| NEWT_EXIT_FDREADY | file descriptor specified in newt_form_watch_fd() is ready to be read or written to |
| NEWT_EXIT_TIMER | time specified in newt_form_set_timer() has elapsed |
| constant | meaning |
|---|---|
| NEWT_COLORSET_ROOT | |
| NEWT_COLORSET_BORDER | |
| NEWT_COLORSET_WINDOW | |
| NEWT_COLORSET_SHADOW | |
| NEWT_COLORSET_TITLE | |
| NEWT_COLORSET_BUTTON | |
| NEWT_COLORSET_ACTBUTTON | |
| NEWT_COLORSET_CHECKBOX | |
| NEWT_COLORSET_ACTCHECKBOX | |
| NEWT_COLORSET_ENTRY | |
| NEWT_COLORSET_LABEL | |
| NEWT_COLORSET_LISTBOX | |
| NEWT_COLORSET_ACTLISTBOX | |
| NEWT_COLORSET_TEXTBOX | |
| NEWT_COLORSET_ACTTEXTBOX | |
| NEWT_COLORSET_HELPLINE | |
| NEWT_COLORSET_ROOTTEXT | |
| NEWT_COLORSET_ROOTTEXT | |
| NEWT_COLORSET_EMPTYSCALE | |
| NEWT_COLORSET_FULLSCALE | |
| NEWT_COLORSET_DISENTRY | |
| NEWT_COLORSET_COMPACTBUTTON | |
| NEWT_COLORSET_ACTSELLISTBOX | |
| NEWT_COLORSET_SELLISTBOX |
| constant | meaning |
|---|---|
| NEWT_ARG_LAST | |
| NEWT_ARG_APPEND |
| constant | meaning |
|---|---|
| NEWT_FLAGS_SET | |
| NEWT_FLAGS_RESET | |
| NEWT_FLAGS_TOGGLE |
| constant | meaning |
|---|---|
| NEWT_FLAG_RETURNEXIT | Exit form, when component is activated |
| NEWT_FLAG_HIDDEN | Component is hidden |
| NEWT_FLAG_SCROLL | Component is scrollable |
| NEWT_FLAG_DISABLED | Component is disabled |
| NEWT_FLAG_BORDER | |
| NEWT_FLAG_WRAP | Wrap text |
| NEWT_FLAG_NOF12 | Don't exit form on pressing F12 |
| NEWT_FLAG_MULTIPLE | |
| NEWT_FLAG_SELECTED | Component is selected |
| NEWT_FLAG_CHECKBOX | Component is checkbox |
| NEWT_FLAG_PASSWORD | Entry component is password entry |
| NEWT_FLAG_SHOWCURSOR | Show cursor |
| constant | meaning |
|---|---|
| NEWT_FD_READ | |
| NEWT_FD_WRITE | |
| NEWT_FD_EXCEPT |
| constant | meaning |
|---|---|
| NEWT_CHECKBOXTREE_UNSELECTABLE | |
| NEWT_CHECKBOXTREE_HIDE_BOX | |
| NEWT_CHECKBOXTREE_COLLAPSED | |
| NEWT_CHECKBOXTREE_EXPANDED | |
| NEWT_CHECKBOXTREE_UNSELECTED | |
| NEWT_CHECKBOXTREE_SELECTED |
| constant | meaning |
|---|---|
| NEWT_ENTRY_SCROLL | |
| NEWT_ENTRY_HIDDEN | |
| NEWT_ENTRY_RETURNEXIT | |
| NEWT_ENTRY_DISABLED |
| constant | meaning |
|---|---|
| NEWT_LISTBOX_RETURNEXIT |
| constant | meaning |
|---|---|
| NEWT_TEXTBOX_WRAP | Wrap text in the textbox |
| NEWT_TEXTBOX_SCROLL | Scroll text in the textbox |
| constant | meaning |
|---|---|
| NEWT_FORM_NOF12 | Don't exit form on F12 press |
| constant | meaning |
|---|---|
| NEWT_KEY_ |