├── .gitignore ├── Gemfile ├── images ├── favicon.png ├── og-logo.png ├── nmc-logo.gif └── banners │ ├── btn1-120x90.png │ ├── btn2-120x60.png │ ├── rect-180x150.png │ ├── sq-btn-125x125.png │ ├── lg-rect-386x280.png │ ├── med-rect-300x250.png │ ├── leaderboard-728x90.png │ └── vert-rect-240x400.png ├── LICENSE ├── _posts ├── 15-01-01-Documenting.md ├── 10-01-01-Security.md ├── 13-03-01-Docker.md ├── 03-01-01-Language-Highlights.md ├── 13-01-01-Virtualization.md ├── 01-01-01-Getting-Started.md ├── 05-01-01-Coding-Practices.md ├── 09-01-01-Errors-and-Exceptions.md ├── 12-01-01-Servers-and-Deployment.md ├── 14-01-01-Caching.md ├── 08-01-01-Templating.md ├── 05-02-01-The-Basics.md ├── 12-04-01-Shared-Servers.md ├── 12-02-01-Platform-as-a-Service.md ├── 01-03-01-Built-in-Web-Server.md ├── 11-01-01-Testing.md ├── 06-05-01-Further-Reading.md ├── 10-02-01-Web-Application-Security.md ├── 10-05-01-Configuration-Files.md ├── 06-01-01-Dependency-Injection.md ├── 03-04-01-Standard-PHP-Library.md ├── 01-02-01-Use-the-Current-Stable-Version.md ├── 10-06-01-Register-Globals.md ├── 06-04-01-Containers.md ├── 11-04-01-Complementary-Testing-Tools.md ├── 05-04-01-Design-Patterns.md ├── 04-01-01-Dependency-Management.md ├── 14-02-01-Bytecode-Cache.md ├── 06-02-01-Basic-Concept.md ├── 16-06-01-Frameworks.md ├── 07-05-01-Abstraction-Layers.md ├── 08-04-01-Compiled-Templates.md ├── 08-02-01-Benefits.md ├── 08-03-01-Plain-PHP-Templates.md ├── 07-01-01-Databases.md ├── 08-05-01-Further-Reading.md ├── 16-10-01-Books.md ├── 11-03-01-Behavior-Driven-Development.md ├── 16-01-01-Resources.md ├── 07-02-01-Databases_MySQL.md ├── 16-07-01-Components.md ├── 10-07-01-Error-Reporting.md ├── 03-06-01-XDebug.md ├── 17-01-01-Community.md ├── 03-03-01-Namespaces.md ├── 10-03-01-Password-Hashing.md ├── 01-05-01-Windows-Setup.md ├── 12-03-01-Virtual-or-Dedicated-Servers.md ├── 14-03-01-Object-Caching.md ├── 03-05-01-Command-Line-Interface.md ├── 13-02-01-Vagrant.md ├── 05-03-01-Date-and-Time.md ├── 04-03-01-PEAR.md ├── 06-03-01-Complex-Problem.md ├── 15-02-01-PHPDoc.md ├── 09-03-01-Exceptions.md ├── 07-02-01-Databases_PDO.md ├── 10-04-01-Data-Filtering.md ├── 07-04-01-Interacting-via-Code.md ├── 03-02-01-Programming-Paradigms.md ├── 01-04-01-Mac-Setup.md ├── 11-02-01-Test-Driven-Development.md ├── 02-01-01-Code-Style-Guide.md ├── 12-05-01-Building-your-Application.md ├── 04-02-01-Composer-and-Packagist.md ├── 09-02-01-Errors.md └── 05-05-01-PHP-and-UTF8.md ├── styles ├── base │ ├── all.less │ ├── variables.less │ ├── idioms.less │ ├── reset.less │ ├── buttons.less │ ├── spacing.less │ ├── bars-buttons.less │ ├── grid.less │ └── typography.less ├── print.css ├── site │ ├── site-footer.less │ ├── site-content.less │ ├── site-header.less │ ├── site-navigation.less │ └── variables.less ├── all.less └── syntax.css ├── _config.yml ├── sitemap.xml ├── index.html ├── Gruntfile.js ├── pages ├── example.md ├── Functional-Programming.md └── Design-Patterns.md ├── scripts └── setup.js ├── banners.md ├── Gemfile.lock ├── _includes └── welcome.md ├── README.md └── CONTRIBUTING.md /.gitignore: -------------------------------------------------------------------------------- 1 | /_site/ 2 | *.DS_Store 3 | node_modules -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'github-pages' -------------------------------------------------------------------------------- /images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/favicon.png -------------------------------------------------------------------------------- /images/og-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/og-logo.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Josh Lockhart 2 | 3 | http://creativecommons.org/licenses/by-nc-sa/3.0/ 4 | -------------------------------------------------------------------------------- /images/nmc-logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/nmc-logo.gif -------------------------------------------------------------------------------- /_posts/15-01-01-Documenting.md: -------------------------------------------------------------------------------- 1 | --- 2 | anchor: documenting 3 | --- 4 | 5 | # Documenting {#documenting} 6 | -------------------------------------------------------------------------------- /_posts/10-01-01-Security.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Güvenlik 3 | anchor: guvenlik 4 | --- 5 | 6 | # Güvenlik {#guvenlik_title} 7 | -------------------------------------------------------------------------------- /images/banners/btn1-120x90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/btn1-120x90.png -------------------------------------------------------------------------------- /images/banners/btn2-120x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/btn2-120x60.png -------------------------------------------------------------------------------- /images/banners/rect-180x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/rect-180x150.png -------------------------------------------------------------------------------- /images/banners/sq-btn-125x125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/sq-btn-125x125.png -------------------------------------------------------------------------------- /_posts/13-03-01-Docker.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Docker 3 | anchor: docker 4 | isChild: true 5 | --- 6 | 7 | # Docker {#docker_title} 8 | -------------------------------------------------------------------------------- /images/banners/lg-rect-386x280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/lg-rect-386x280.png -------------------------------------------------------------------------------- /images/banners/med-rect-300x250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/med-rect-300x250.png -------------------------------------------------------------------------------- /images/banners/leaderboard-728x90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/leaderboard-728x90.png -------------------------------------------------------------------------------- /images/banners/vert-rect-240x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkulekci/php-the-right-way/HEAD/images/banners/vert-rect-240x400.png -------------------------------------------------------------------------------- /_posts/03-01-01-Language-Highlights.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Öne Çıkanlar 3 | anchor: one_cikanlar 4 | --- 5 | 6 | # Öne Çıkanlar {#one_cikanlar_title} 7 | -------------------------------------------------------------------------------- /_posts/13-01-01-Virtualization.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sanallaştırma 3 | anchor: virtualization 4 | --- 5 | 6 | # Sanallaştırma {#virtualization_title} 7 | -------------------------------------------------------------------------------- /_posts/01-01-01-Getting-Started.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Başlarken 3 | isChild: false 4 | anchor: baslarken 5 | --- 6 | 7 | # Başlarken {#baslarken_title} 8 | 9 | -------------------------------------------------------------------------------- /_posts/05-01-01-Coding-Practices.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Kodlama Uygulamaları 3 | anchor: kodlama_uygulamalari 4 | --- 5 | 6 | # Kodlama Uygulamaları {#kodlama_uygulamalari_title} 7 | -------------------------------------------------------------------------------- /_posts/09-01-01-Errors-and-Exceptions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Hatalar ve İstisnalar 3 | anchor: hatalar_ve_istisnalar 4 | --- 5 | 6 | # Hatalar ve İstisnalar {#hatalar_ve_istisnalar_title} -------------------------------------------------------------------------------- /styles/base/all.less: -------------------------------------------------------------------------------- 1 | @import "reset"; 2 | @import "prefixer"; 3 | @import "spacing"; 4 | @import "typography"; 5 | @import "idioms"; 6 | @import "grid"; 7 | @import "bars-buttons"; 8 | @import "buttons"; -------------------------------------------------------------------------------- /styles/print.css: -------------------------------------------------------------------------------- 1 | body, .site-title, h1, h2, h3{ 2 | font-family: 'Georgia' !important; 3 | } 4 | 5 | 6 | nav.site-navigation, a.fork-me, a.top{ 7 | display:none; 8 | } 9 | 10 | div.site-content{ 11 | padding: 20px 40px 40px 20px; 12 | } -------------------------------------------------------------------------------- /_posts/12-01-01-Servers-and-Deployment.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sunucular ve Dağıtım 3 | anchor: sunucular_ve_dagitim 4 | --- 5 | 6 | # Sunucular ve Dağıtım {#sunucular_ve_dagitim_title} 7 | 8 | PHP uygulamalarını dağıtmanın ve web üzerinde yayınlamanın birkaç yolu vardır. 9 | -------------------------------------------------------------------------------- /styles/site/site-footer.less: -------------------------------------------------------------------------------- 1 | .site-footer{ 2 | clear: both; 3 | .ptd; 4 | font-size: 13px; 5 | text-align: center; 6 | } 7 | .site-footer img{ 8 | margin-left: 2px; 9 | position: relative; 10 | top: -2px; 11 | vertical-align: middle; 12 | } 13 | .site-footer ul{ 14 | list-style: none; 15 | .mhn; 16 | .phn; 17 | } 18 | -------------------------------------------------------------------------------- /_posts/14-01-01-Caching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Caching 3 | anchor: caching 4 | --- 5 | 6 | # Caching {#caching_title} 7 | 8 | PHP oldukça hızlıdır, ancak dosya okuma, uzak bilgisayara bağlantı gibi işlemlerde bazı darboğazlar oluşmaktadır. Neyse ki, uygulamanızın belli kısımlarını hızlandırmanız için, veya belirli bir zamandaki kaynakların kullanımını azaltmak için çeşitli araçlar bulunmakta. -------------------------------------------------------------------------------- /styles/site/site-content.less: -------------------------------------------------------------------------------- 1 | .site-content{ 2 | padding: 20px 40px 40px 320px; 3 | overflow: hidden; 4 | 5 | h1{ 6 | clear: both; 7 | } 8 | } 9 | .interior-site-content{ 10 | .pad; 11 | } 12 | .top{ 13 | background: #333; 14 | display: inline-block; 15 | float: right; 16 | margin-right: -40px; 17 | padding: 4px 8px; 18 | color: #FFF; 19 | font-size: 12px; 20 | text-decoration: none !important; 21 | } 22 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | baseurl: /php-the-right-way 2 | highlighter: rouge 3 | markdown: kramdown 4 | permalink: date 5 | maruku: 6 | use_tex: false 7 | use_divs: false 8 | png_engine: blahtex 9 | png_dir: images/latex 10 | png_url: /images/latex 11 | 12 | gems: 13 | - jekyll-sitemap 14 | 15 | defaults: 16 | - 17 | scope: 18 | path: "" 19 | values: 20 | sitemap: false 21 | 22 | exclude: ['CNAME', 'CONTRIBUTING.md', 'LICENSE', 'README.md', 'pages/example.md'] 23 | 24 | future: true -------------------------------------------------------------------------------- /_posts/08-01-01-Templating.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Arayüz Kalıpları (Templating) 3 | anchor: templating 4 | --- 5 | 6 | # Arayüz Kalıpları {#templating_title} 7 | 8 | Arayüz kalıpları sizin controller ve domain mantıklarınızı sunum katmanınızdan 9 | ayrımanıza imkan sağlar. Kalıplar genellikle uygulamanızın HMTL kısmıdır, 10 | ama siz ayrıca XML gibi diğer formatları da kullanabilirsiniz. Kalıplar 11 | genellikle [model–view–controller](pages/Design-Patterns.html#model-view-controller) (MVC) 12 | yazılım mimarisinin ikinci parçası olan, "views" olarak da adlandırılır. 13 | -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | http://www.phptherightway.com/index.html 5 | 2012-07-07T01:00:00-05:00 6 | daily 7 | 1 8 | 9 | 10 | http://www.phptherightway.com/banners.html 11 | 2012-07-08T14:11:00-05:00 12 | weekly 13 | 0.5 14 | 15 | 16 | -------------------------------------------------------------------------------- /_posts/05-02-01-The-Basics.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Temelleri 3 | isChild: true 4 | anchor: temelleri 5 | --- 6 | 7 | ## Temelleri {#temelleri_title} 8 | 9 | PHP her seviyeden geliştiriciye sadece hızlıca değil efektif şekilde kod 10 | üretmeye izin veren geniş bir dildir. Dilde kendimizi geliştirirken, 11 | sık sık dilin, ilk öğrendiğimiz (veya gözden kaçırdığımız) kısayolları ve kötü 12 | davranışlarını unutuyoruz. Bu temel sorunu çözmek için bu bölümde PHP içindeki 13 | basit temelleri hatırlatmayı amaçlamaktadır. 14 | 15 | * [Temelleri](/php-the-right-way/pages/The-Basics.html)'den okumaya devam edin. -------------------------------------------------------------------------------- /_posts/12-04-01-Shared-Servers.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Paylaşımlı Sunucu 3 | isChild: true 4 | anchor: paylasimli_sunucu 5 | --- 6 | 7 | ## Paylaşımlı Sunucu {#paylasimli_sunucu_title} 8 | 9 | PHP'nin popülaritesine teşekkür etmek gerekir. PHP kurulu olmayan bir barındırıcı (host) bulmak zor. Ancak son sürüm olmasına dikkat edilmeli. Paylaşımlı sunucu diğer geliştiricilerle aynı makinede uygulamanı yayınlamana izin verir. Bunun artısı daha ucuz olmasıdır. Diğer taraftan komşunuz ne karıştıryor, ne yapıyor hiç bir zaman bilemiyorsunuz. Sunucu düşebilir ya da güvenlik açığı oluşabilir. Projenizin bütçesi dahilinde paylaşımlı sunuculardan kaçının. 10 | -------------------------------------------------------------------------------- /_posts/12-02-01-Platform-as-a-Service.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Platform as a Service (PaaS) 3 | isChild: true 4 | anchor: platform_as_a_service_PaaS 5 | --- 6 | 7 | ## Platform as a Service (PaaS) {#platform_as_a_service_paas_title} 8 | 9 | PaaS size PHP uygulamanızı çalıştırmanız için bir ağ mimarisi ve sistem sunar. Bunun anlamı, PHP uygulamanızı veya çatınızı çalıştırmak için çok az ayarlama yapmanız gerektiğidir. 10 | 11 | Son zamanlarda, PaaS dağıtım, barındırma ve PHP uygulamalarını ölçeklendirmede popüler bir yöntem oldu. [PHP PaaS "Platform as a Service" sağlayıcıları](#php_paas_providers) listesini [kaynaklar bölümünde](#resources) bulabilirsiniz. 12 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | description: "An easy-to-read, quick reference for PHP best practices, accepted coding standards, and links to authoritative PHP tutorials around the Web" 4 | --- 5 | 6 | {% capture welcome_content %}{% include welcome.md %}{% endcapture %} 7 | {{ welcome_content|markdownify }} 8 | 9 | {% capture backtotop %}[Back to Top](#top){:.top}{% endcapture %} 10 | {% for post in site.posts reversed %} 11 | {% if post.isChild != true and loop.first != true %} 12 | {{ backtotop|markdownify }} 13 | {% endif %} 14 |
15 | {{ post.content }} 16 |
17 | {% endfor %} 18 | {{ backtotop|markdownify }} 19 | -------------------------------------------------------------------------------- /_posts/01-03-01-Built-in-Web-Server.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Dahili Web Sunucusu 3 | isChild: true 4 | anchor: dahili_web_sunucusu 5 | --- 6 | 7 | ## Dahili Web Sunucusu {#dahili_web_sunucusu_title} 8 | 9 | PHP 5.4 sürümü veya daha yeni sürümleri ile birlikte PHP kullanmaya herhangi 10 | bir web sunucusu kurmadan ve ayarlama yapmadan başlayabilirsiniz. Dahili web 11 | sunucusunu başlatmak için aşağıdaki komutu, projenize ait dosyaların bulunduğu 12 | dizin içinde komut satırından çalıştırabilirsiniz: 13 | 14 | {% highlight console %} 15 | > php -S localhost:8000 16 | {% endhighlight %} 17 | 18 | * [Dahili web sunucusu ve komut satırı hakkında belgeler][cli-server] 19 | 20 | [cli-server]: http://php.net/features.commandline.webserver -------------------------------------------------------------------------------- /_posts/11-01-01-Testing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Test Etme 3 | anchor: test_etme 4 | --- 5 | 6 | # Test Etme {#test_etme_title} 7 | 8 | Otomatize edilmiş testler yazmak, iyi geliştirilmiş bir uygulama elde etmiş olmanın yanı sıra, 9 | iyi yöntem olarak kabul edilir. Yeni bir özellik eklediğinizde, bir özelliği düzenlediğinizde 10 | ya da yoksaydığınızda otomatik oluşturulan testler uygulamanızın çakılmamasından emin 11 | olmak için muhteşem bir araçtır. 12 | 13 | PHP için farklı yaklaşımlarda kullanılan bir kaç farklı test araçları (veya yapı(framework)) 14 | mevcuttur - tüm bunlar, sadece şu andaki fonksiyonaliteyi bozmadığından emin olmayı, elle 15 | yapılan testleri ve geniş kalite test ekipleri ihtiyacını önlemeyi hedefliyor. 16 | -------------------------------------------------------------------------------- /_posts/06-05-01-Further-Reading.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Further Reading 3 | isChild: true 4 | anchor: further_reading 5 | --- 6 | 7 | ## Further Reading {#further_reading_title} 8 | 9 | - [Learning about Dependency Injection and PHP](http://ralphschindler.com/2011/05/18/learning-about-dependency-injection-and-php) 10 | - [What is Dependency Injection?](http://fabien.potencier.org/article/11/what-is-dependency-injection) 11 | - [Dependency Injection: An analogy](https://mwop.net/blog/260-Dependency-Injection-An-analogy.html) 12 | - [Dependency Injection: Huh?](http://net.tutsplus.com/tutorials/php/dependency-injection-huh/) 13 | - [Dependency Injection as a tool for testing](http://philipobenito.github.io/dependency-injection-as-a-tool-for-testing/) 14 | -------------------------------------------------------------------------------- /_posts/10-02-01-Web-Application-Security.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Web Uygulama Güvenliği 3 | isChild: true 4 | anchor: web_uygulamalari_guvenligi 5 | --- 6 | 7 | ## Web Uygulama Güvenliği {#web_uygulama_guvenligi_title} 8 | 9 | Web uygulamalarından yararlanmaya hazır art niyetli bazı insanlar vardır. Uygulamanız için gerekli önlemleri 10 | almak adına bu katı durum önemlidir. Neyse ki, bu gibi durumlara karşı alınması gereken güvenlik önlemler ve bilinmesi gerekenler 11 | [The Open Web Application Security Project][1] (OWASP)'de derlenmiş.Bu yazı uygulamanızın güvenliği için geliştirici tarafından okunmalı. 12 | 13 | 14 | * [Read the OWASP Security Guide][2] 15 | 16 | [1]: https://www.owasp.org/ 17 | [2]: https://www.owasp.org/index.php/Guide_Table_of_Contents 18 | -------------------------------------------------------------------------------- /_posts/10-05-01-Configuration-Files.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Konfigürasyon Dosyaları 3 | isChild: true 4 | anchor: konfigurasyon_dosyalari 5 | --- 6 | 7 | ## Konfigürasyon Dosyaları {#konfigurasyon_dosyalari_title} 8 | 9 | Uygulamanız için konfigürasyon dosyaları oluşturacağınız zaman, aşağıdaki yöntemleri izlemenizi öneririz: 10 | 11 | - Konfigüreayon dosyalarınızı direk olarak erişilemeyecek ve dosya sistemi vasıtasıyla çekilemeyecek bir 12 | konumda barındırmanızı tavsiye ederiz. 13 | - Eğer ana dizinde barındırmak zorunda iseniz onun adını '.php' uzantısı ile yazınız. Bu direk erişime 14 | izin verse bile metin olarak okunamamasını sağlar. 15 | - Konfigürasyon dosyalarınızdaki bilgileriniz ya şifreleme yöntemleri ile ya da grup/kullanıcı sistem 16 | izinleri ile korunmalıdır. 17 | -------------------------------------------------------------------------------- /_posts/06-01-01-Dependency-Injection.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bağımlılık Değiştirme 3 | anchor: dependency_injection 4 | --- 5 | 6 | ## Bağımlılık Değiştirme {#dependency_injection_title} 7 | 8 | [Wikipedia](http://en.wikipedia.org/wiki/Dependency_injection)'da: 9 | 10 | > Bağımlılık değiştirme kodlanmış bağımlılıkların çalışma veya derlenme anında kaldırılabilmesine ve değiştirilebilmesine izin veren 11 | > bir yazılım tasarım desenidir. 12 | 13 | Bu açıklama konuyu olduğundan biraz daha karmaşık gösteriyor olabilir. 14 | Bağımlılık değiştirme bir bileşenin bütün bağımlıklarının yaratılma anında (constructor aracılığıyla), 15 | metod kullanarak ya da özelliklere atama yaparak verilebilmesini sağlıyor. Böylece istenen anda bu bağımlıklar değiştirilebiliyor. 16 | Konu bu kadar basit aslında. 17 | -------------------------------------------------------------------------------- /_posts/03-04-01-Standard-PHP-Library.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Standart PHP Kütüphanesi 3 | isChild: true 4 | anchor: standart_php_kutuphanesi 5 | --- 6 | 7 | ## Standart PHP Kütüphanesi {#standart_php_kutuphanesi_title} 8 | 9 | Standart PHP Kütüphanesi (The Standard PHP Library (SPL)) PHP ile paketlenmiştir 10 | ve sınıflar ve arayüzler koleksiyonu sağlar. Temel olarak ihtiyaç duyulan bazı 11 | sınıflar ve veri yapılarını içerir (stack, queue, heap, ve dahası), ve bu veri 12 | yapıları veya kendi sınıfları üzerinden ulaşılabilen yineleyiciler SPL arayüzünü 13 | oluşturur. 14 | 15 | * [SPL hakkında][spl] 16 | * [SPL video course on Lynda.com(Paid)][spllynda] 17 | 18 | [spl]: http://php.net/manual/tr/book.spl.php 19 | [spllynda]: http://www.lynda.com/PHP-tutorials/Up-Running-Standard-PHP-Library/175038-2.html 20 | -------------------------------------------------------------------------------- /_posts/01-02-01-Use-the-Current-Stable-Version.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Güncel ve Tutarlı Sürümü Kullanın (7.0) 3 | isChild: true 4 | anchor: guncel_ve_tutarli_surumunu_kullanin 5 | --- 6 | 7 | ## Güncel ve Tutarlı Sürümü Kullanın (7.0) {#guncel_ve_tutarli_surumunu_kullanin_title} 8 | 9 | Eğer PHP'ye başlamak istiyorsanız, [PHP 7.0][php-release] ile başlayın. PHP 7.0 10 | yeni ve PHP 5.x üzerine, bir çok yeni özelliğe sahip. Ana kodunda bir çok kısım 11 | yeniden yazıldı ve önceki sürümlerinden daha hızlı. 12 | 13 | Yakın zamanlarda 5.x sürümleri mevcut ve 5.6 sürümü en son 5.x sürümü. Hangi 14 | fonksiyonunun hangi versiyonda olup olmadığını kontrol etmek için [php.net][php-docs] 15 | sitesindeki dökümantasyonu kontrol edebilirsiniz. 16 | 17 | 18 | [php-release]: http://php.net/downloads.php 19 | [php-docs]: http://php.net/manual/ 20 | [php70-bc]: http://php.net/manual/migration70.incompatible.php -------------------------------------------------------------------------------- /styles/site/site-header.less: -------------------------------------------------------------------------------- 1 | .site-header{ 2 | position: relative; 3 | z-index: 1; 4 | text-align: center; 5 | } 6 | .site-title{ 7 | .mbn; 8 | font-family: 'Alfa Slab One'; 9 | font-size: @baseline * 4; 10 | font-weight: normal !important; 11 | line-height: @baseline * 5 !important; 12 | 13 | a{ 14 | text-decoration: none; 15 | } 16 | } 17 | .site-slogan{ 18 | font-weight: normal; 19 | } 20 | .fork-me, .fork-me img{ 21 | position: absolute; 22 | top: 0; 23 | right: 0; 24 | } 25 | .fork-me{ 26 | z-index: 2; 27 | } 28 | 29 | .interior-site-header{ 30 | background: #EEE; 31 | .inner-shadow(fade(#000, 7%) 0 0 40px); 32 | .pas; 33 | text-align: center; 34 | 35 | .site-title{ 36 | font-size: @baseline * 2; 37 | line-height: @baseline * 2 !important; 38 | } 39 | .site-slogan{ 40 | .mbs; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /styles/site/site-navigation.less: -------------------------------------------------------------------------------- 1 | .site-navigation{ 2 | background: #EEE; 3 | .inner-shadow(fade(#000, 7%) 0 0 40px); 4 | .pas; 5 | position: fixed; 6 | top: 0; 7 | bottom: 0; 8 | overflow: auto; 9 | width: 240px; 10 | } 11 | .build-date{ 12 | .mbs; 13 | color: #AAA; 14 | font-family: Helvetica, Arial, sans-serif; 15 | font-size: 11px; 16 | } 17 | .site-navigation ul{ 18 | .man; 19 | .pan; 20 | .no-list; 21 | font-size: 16px; 22 | } 23 | .site-navigation > ul > li{ 24 | margin-bottom: 10px; 25 | } 26 | .site-navigation a{ 27 | text-decoration: underline; 28 | 29 | &:hover{ 30 | text-decoration: none; 31 | } 32 | } 33 | .site-navigation a.active{ 34 | background-color: #ff9; 35 | } 36 | .site-navigation ul ul{ 37 | .mls; 38 | .pth; 39 | font-size: 12px; 40 | 41 | a{ 42 | text-decoration: none; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /_posts/10-06-01-Register-Globals.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Register Globals 3 | isChild: true 4 | anchor: register_globals 5 | --- 6 | 7 | ## Register Globals {#register_globals_title} 8 | 9 | **NOT:** PHP 5.4.0 itibariyle `register_globals` özelliği kaldırıldı ve bundan sonrada kullanılmayacak. Bu sadece 10 | uygulamanızı güncellemeniz için bir uyarı olarak eklendi. 11 | 12 | Etkinleştirildiğinde, `$_POST`, `$_GET` ve `$_REQUEST` gibi değişkenler uygulamanızın her yerinden erişilebilir 13 | olacaktır. Bu verinin nerden geldiğini bilinemeyeceği için kolayca güvenlik açığına sebep olabiliyor. 14 | 15 | Örneğin: `$_GET['foo']` değişkeni `$foo` olarak kullanılabilecek, daha önceden tanımlanmamış bir değişkeni etkin 16 | kılacaktır. Eğer 5.4.0'dan daha küçük versiyonlarda PHP kullanıyorsanız, `register_globals` ayarını __off__ durumuna 17 | getirin. 18 | 19 | 20 | * [PHP manual'de Register_globals](http://www.php.net/manual/tr/security.globals.php) -------------------------------------------------------------------------------- /_posts/06-04-01-Containers.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Containers 3 | isChild: true 4 | anchor: containers 5 | --- 6 | 7 | ## Containers {#containers_title} 8 | 9 | The first thing you should understand about Dependency Injection Containers is that they are not the same thing as Dependency 10 | Injection. A container is a convenience utility that helps us implement Dependency Injection, however, they can be and often 11 | are misused to implement an anti-pattern, Service Location. Injecting a DI container as a Service Locator in to your classes arguably 12 | creates a harder dependency on the container than the dependency you are replacing. It also makes your code much less transparent 13 | and ultimately harder to test. 14 | 15 | Most modern frameworks have their own Dependency Injection Container that allows you to wire your dependencies together through configuration. 16 | What this means in practice is that you can write application code that is as clean and de-coupled as the framework it is built on. -------------------------------------------------------------------------------- /_posts/11-04-01-Complementary-Testing-Tools.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tamamlayıcı Test Araçları 3 | isChild: true 4 | anchor: tamamlayici_test_araclari 5 | --- 6 | 7 | ## Tamamlayıcı Test Araçları {#tamamlayici_test_araclari_title} 8 | 9 | Bireysel testler ve davranış odaklı çatıların yanısıra, tek bir yöne yönelimi olmayan bir sürü kapsamlı çatı(framework) ve yardımcı kütüphaneler(helper library) vardır. 10 | 11 | ### Araç Bağlantıları 12 | 13 | * [Selenium](http://seleniumhq.org/) tarayıcı otomatize etme aracıdır. [PHPUnit](http://phpunit.de/manual/current/en/selenium.html) ile bütünleşik kullanılabilir. 14 | * [Mockery](https://github.com/padraic/mockery) bir Mock nesne çatısıdır. [PHPUnit](http://phpunit.de/) veya [PHPSpec](http://www.phpspec.net/) ile bütünleşik kullanılabilir. 15 | * [Prophecy](https://github.com/phpspec/prophecy) is a highly opinionated yet very powerful and flexible PHP object mocking framework. It's integrated with [PHPSpec](http://www.phpspec.net/) and can be used with [PHPUnit](http://phpunit.de/). 16 | -------------------------------------------------------------------------------- /_posts/05-04-01-Design-Patterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tasarım Desenleri (Design Patterns) 3 | isChild: true 4 | anchor: tasarim_desenleri_design_patterns 5 | --- 6 | 7 | ## Tasarım Desenleri (Design Patterns) {#tasarim_desenleri_design_patterns_title} 8 | 9 | Uygulamanızı oluştururken kodunuzda ve projenizin yapısında genel bir desen 10 | kullanmak yararlı olacaktır. Desen kullanmak kodunuzu yönetmeyi kolaylaştırdığı 11 | ve diğer geliştiricilerin herşeyin birbiri ile uyumunu daha kolay 12 | anlayabilmesini sağladığı için yararlıdır. 13 | 14 | 15 | Eğer yüksek seviye kodla yazılmış bir çatı kullanıyorsanız projeniz bu çatı 16 | üzerine kurulacaktır. Bu çatı ile bazı desen kararları zaten hazırlanmış 17 | olacaktır. Ama çatı üzerine kodunuzu yazarak en iyi desen kararlarını ortaya 18 | çıkarabilirsiniz. Diğer taraftan, uygulamanızı geliştirirken bir çatı 19 | kullanmıyorsanız, projenizin türü ve boyutu ile uyumlu en iyi deseni 20 | bulmalısınız. 21 | 22 | * [Tasarım Desenleri](/php-the-right-way/pages/Design-Patterns.html) 23 | -------------------------------------------------------------------------------- /_posts/04-01-01-Dependency-Management.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bağımlılık (Dependency) Yönetimi 3 | anchor: bagimlilik_dependency_yonetimi 4 | --- 5 | 6 | # Bağımlılık (Dependency) Yönetimi {#bagimlilik_dependency_yonetimi_title} 7 | 8 | Kullanabilmeniz için tonlarca PHP kütüphanesi, yapısı(frameworks) ve 9 | bileşeni(component) bulunmaktadır. Projeniz bunlardan birkaçını kullanacaktır - 10 | bu başlıkta projenizde kullandığınız kütüphanelere bağımlılığınızdan ve bunların 11 | yönetilmesinden bahsedeceğiz. Yakın zamana kadar PHP'de bu projeniz içerisinde 12 | barındırdığınız diğer kütüphane, çatı ya da bileşeni yönetmek için uygun bir yol 13 | yoktu. Elle yönetilse bile, `autoloader` endişesi mevcuttu. Ancak şu anda bu 14 | endişeye girmenize bir neden yok. 15 | 16 | Şu sıralarda PHP için iki büyük paket yönetim sistemi bulunmaktadır. [Composer] ve 17 | ve [PEAR]. Composer şu anda PHP için en popüler paket yöneticisi ama PEAR'da uzun 18 | zaman ana paket yöneticisiydi. Hiç kullanmasanız bile PEAR hakkında bir kaç 19 | referans bulabilirsiniz. 20 | 21 | [Composer]: #composer_ve_packagist 22 | [PEAR]: #pear -------------------------------------------------------------------------------- /_posts/14-02-01-Bytecode-Cache.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bytecode Cache (Önbelleği) 3 | isChild: true 4 | anchor: bytecode_cache_onbellegi 5 | --- 6 | 7 | ## Bytecode Cache (Önbelleği) {#bytecode_cache_onbellegi_title} 8 | 9 | PHP dosyaları çalıştırıldığı zaman, kodlar ilk olarak bytecode'a (aynı zamanda opcode olarak bilinir) derlenir ve daha sonra bytecode çalıştırılır. 10 | Eğer PHP değiştirilmemişse, bytecode her zaman aynıdır. Bunun anlamı derleme aşaması CPU kaynaklarını boşa zaman harcamak demektir. 11 | 12 | Bytecode gereksiz derlemeleri önlemek için bellekte saklanacaktır ve oradan çağırılacaktır. Kurulumu ve ayarlamaları sadece dakikalar alırken uygulamanız önemli ölçüde hızlanacaktır. Kurmamanız için hiç bir neden yok. 13 | 14 | [OPcache](http://php.net/manual/en/book.opcache.php)'de dahili olarak gelen bytecode cache vardır. 15 | Ayrıca önceki versiyonlar içinde kullanılabilir. 16 | 17 | Popüler bytcode önbellek araçları: 18 | 19 | * [APC](http://php.net/manual/en/book.apc.php) (PHP 5.4 and earlier) 20 | * [APC](http://php.net/manual/tr/book.apc.php) 21 | * [XCache](http://xcache.lighttpd.net/) 22 | * [Zend Optimizer+](http://www.zend.com/products/server/) (part of Zend Server package) 23 | * [WinCache](http://www.iis.net/download/wincacheforphp) (extension for MS Windows Server) 24 | -------------------------------------------------------------------------------- /_posts/06-02-01-Basic-Concept.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Temel Kavramlar 3 | isChild: true 4 | anchor: temel_kavramlar 5 | --- 6 | 7 | ## Temel Kavramlar {#temel_kavramlar_title} 8 | 9 | Basit bir örnek ile kavramları size anlatmaya çalışalım. 10 | 11 | Veritabanı ile iletişim kuran bir adapter gerektiren bir `Database` sınıfı olsun. 12 | Bu `adapter`'in bir objesini constructor'da oluşturalım. Bu testi zorlaştırır. 13 | 14 | {% highlight php %} 15 | adapter = new MySqlAdapter; 25 | } 26 | } 27 | 28 | class MysqlAdapter {} 29 | {% endhighlight %} 30 | 31 | This code can be refactored to use Dependency Injection and therefore loosen the dependency. 32 | 33 | {% highlight php %} 34 | adapter = $adapter; 44 | } 45 | } 46 | 47 | class MysqlAdapter {} 48 | {% endhighlight %} 49 | 50 | Now we are giving the `Database` class its dependency rather than it creating it itself. We could even create a method 51 | that would accept an argument of the dependency and set it that way, or if the `$adapter` property was `public` we could 52 | set it directly. -------------------------------------------------------------------------------- /_posts/16-06-01-Frameworks.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Çatılar (Frameworks) 3 | isChild: true 4 | anchor: catilar_frameworks 5 | --- 6 | 7 | ## Çatılar (Frameworks) {#catilar_frameworks_title} 8 | 9 | Tekerleği yeniden icat etmektense bir çok geliştirici çatı yapısını kullanır. Çatı birçok düşük seviye sorunları soyutlar, ortak sorunları çözmek için kullanımı kolay bir arayüz sunar. 10 | 11 | Her projede kullanmanız gerekmez. Bazen düz PHP doğru yoldur, ama bir çatı kullanmanız gerekirse 3 ana çeşidi vardır: 12 | 13 | * Micro Frameworks (Mini Çatı) 14 | * Full-Stack Frameworks (Yığın Çatı) 15 | * Component-Based Frameworks (Bileşen Bazlı Çatı) 16 | 17 | Mini Çatı `callback`, `controller`, `method` gibi yapıların HTTP isteklerine mümkün olduğunda çabuk bir yönlendirme imkanı sağlar. Geliştirme sürecine yardım etmek için basit veritabanı işlemleri gibi bazı ekstra kütüphaneler ile birlikte gelir. HTTP servisleri oluşturmak için kullanılır. 18 | 19 | Bir çok çatı yapısında Mini Çatı bulunmaktadır ve üzerine önemli ölcüde özellikl eklenmesi ile oluşan yapılara Yığın Bazlı Çatı denir. Bu genellikle ORM'ler, Kimlik Doğrulama paketleri ile birlikte gelir. 20 | 21 | Bileşen Bazlı Çatı özel amaçlı kütüphaneler ve özel koleksiyonlar topluluğudur. Farklı Bileşen Bazlı Çatılar mini veya Yığın Bazlı Çatı kurmak için kullanılabilir. 22 | 23 | * [Popüler PHP Çatıları](https://github.com/codeguy/php-the-right-way/wiki/Frameworks) -------------------------------------------------------------------------------- /_posts/07-05-01-Abstraction-Layers.md: -------------------------------------------------------------------------------- 1 | --- 2 | isChild: true 3 | title: Soyutlama Katmanı 4 | anchor: databases_abstraction_layers 5 | --- 6 | 7 | ## Soyutlama Katmanı {#databases_abstraction_layers_title} 8 | 9 | Bir çok framework PDO üzerine kurulu kendine ait bir soyutlama katmanı içerir. 10 | Bunlar genellikle PDO'nun bağlantı arayüzü için bir soyutlama oluşturmak yerine 11 | tüm bir veritabanı için bir soyutlama getirirler, bu da farklı veritabanları 12 | yerine bir veritabanı sistemini soyutlamalarına neden olur. Bu tabiki bu biraz 13 | yük katacaktır, ama eğer MySQL, PostgreSQL ve SQLite ile çalışabilecek taşınabilir 14 | bir uygulama insa etmek istiyorsak bu yük katlanılabilir bir yük olur. 15 | 16 | Bazı soyutlama katmanları hali hazırda [PSR-0][psr0] veya [PSR-4][psr4] namespace 17 | standartlarına uygun inşa edilmiş ve siz uygulamanız için kullanabilirsiniz: 18 | 19 | * [Aura SQL][6] 20 | * [Doctrine2 DBAL][2] 21 | * [Propel][7] 22 | * [ZF2 Db][4] 23 | 24 | [1]: http://www.php.net/manual/en/book.pdo.php 25 | [2]: http://www.doctrine-project.org/projects/dbal.html 26 | [4]: http://packages.zendframework.com/docs/latest/manual/en/index.html#zend-db 27 | [6]: https://github.com/auraphp/Aura.Sql 28 | [7]: http://propelorm.org/Propel/ 29 | 30 | [psr0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 31 | [psr4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md 32 | -------------------------------------------------------------------------------- /_posts/08-04-01-Compiled-Templates.md: -------------------------------------------------------------------------------- 1 | --- 2 | isChild: true 3 | title: Derlenen Şablonlar (Compiled Template) 4 | anchor: derlenmis_sablonlar_template 5 | --- 6 | 7 | ## Derlenmiş Şablonlar(Template) {#derlenmis_sablonlar_template} 8 | 9 | PHP nesne odaklı bir dil olarak olgunlaşırken, aynı gelişimi şablon dili olma yolunda [gerçekleştiremedi](http://fabien.potencier.org/article/34/templating-engines-in-php). 10 | [Twig](http://twig.sensiolabs.org/) veya [Smarty](http://www.smarty.net/) gibi derlenen şablonlama sistemleri, 11 | bu boşluğu farklı dizimleri ile doldurmaya çalışıyorlar. Otomatik sızıntıları önleme, basit kontrol yapıları 12 | ve kalıtım özellikleri ile derlenebilen şablon sistemleri kolay kod yazmanın yanında temiz, okunabilir ve daha güvenli 13 | kullanım için tasarlanmıştır. Derlenen şablonlar farklı diller arasında paylaşılabilirler bile. 14 | Buna [Mustache](http://mustache.github.io/) güzel bir örnektir. Şablonlar derlenirken performans 15 | olarak biraz sıkıntı yaratabilir ancak bu derlenmiş şablon önbelleğe alındığında çok çok küçük 16 | bir performans kaybı yaratacaktır. 17 | 18 | Örnek bir derlenmiş şablon ([Twig](http://twig.sensiolabs.org/) kütüphanesi ile): 19 | 20 | {% highlight text %} 21 | {% raw %} 22 | {% include 'header.html' with {'title': 'User Profile'} %} 23 | 24 |

User Profile

25 |

Hello, {{ name }}

26 | 27 | {% include 'footer.html' %} 28 | {% endraw %} 29 | {% endhighlight %} 30 | -------------------------------------------------------------------------------- /_posts/08-02-01-Benefits.md: -------------------------------------------------------------------------------- 1 | --- 2 | isChild: true 3 | title: Templating (Şablon) 4 | anchor: templating(Şablon)_yararlari 5 | --- 6 | 7 | ## Yararları {#templating_sablon_yararlari_title} 8 | 9 | Sunum katmanındaki mantığı uygulamanın geri kalanından ayırmak template(şablon) mantığının kullanımındaki ana yarardır. 10 | Template yani şablonlar formatlanmış içeriği göstermekle görevlidirler. Verinin erişimi ya da verinin sürekliliği 11 | ya da daha karmaşık görevler için değillerdir. Geliştiricilerin sunucu tarafındaki kodla (controller, model) 12 | ilgilendiği ve tasarımcıların kullanıcı tarafındaki kodla (markup) ilgilendiği bir takım çalışması içerisinde daha 13 | okunalı ve temiz kod yazmayı sağlar. 14 | 15 | Şablonlar sunum katmanındaki kodların organizasyonunuda geliştirir. Şablonlar genellikle "views" klasörü altında 16 | olurlar ve her biri bir tekil dosya içerisinde bulunur. Bu taklaşım büyük kod parçalarının daha küçük hallere 17 | bölünmesiyle birlikte tekrar kullanılabilirliğini de artırır. Örneğin, sizin sitenizde bir başlık ve birde alt başlık 18 | kısmı varsa, bu şablonlar her bir sayfanın başına ve sonuna eklenebilir. 19 | 20 | Sonuç olarak, kullandığınız kütüphanelere bağlı olarak, şablonlar kullanıcı tarafından oluşturulan içeriklerde 21 | bazı kısımlarda işlemler(escaping) yaparak daha güvenli olmasını sağlar. Bazı kütüphaneler daha kapalı kutu 22 | olur ve tasarımcılar sadece izin verilen değişkenlere ve methodlara erişebilirler. 23 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | // Project configuration 3 | grunt.initConfig({ 4 | pkg: grunt.file.readJSON('package.json'), 5 | less: { 6 | dist: { 7 | options: { 8 | cleancss: true, 9 | compress: true, 10 | ieCompat: true 11 | }, 12 | files: { 13 | "css/all.css": "less/all.less" 14 | } 15 | } 16 | }, 17 | postcss: { 18 | options: { 19 | map: true, 20 | processors: [ 21 | require('autoprefixer')({ 22 | browsers: ['last 2 versions', 'ie 9'] 23 | }) 24 | ] 25 | }, 26 | dist: { 27 | src: 'css/all.css' 28 | } 29 | }, 30 | watch: { 31 | less: { 32 | files: ['less/**/*.less'], 33 | tasks: ['less:dist', 'postcss:dist'], 34 | options: { 35 | spawn: false 36 | } 37 | } 38 | } 39 | }); 40 | 41 | // Load plugins 42 | grunt.loadNpmTasks('grunt-contrib-less'); 43 | grunt.loadNpmTasks('grunt-contrib-watch'); 44 | grunt.loadNpmTasks('grunt-postcss'); 45 | 46 | // Default task(s) 47 | grunt.registerTask('default', ['less', 'postcss:dist']); 48 | }; -------------------------------------------------------------------------------- /_posts/08-03-01-Plain-PHP-Templates.md: -------------------------------------------------------------------------------- 1 | --- 2 | isChild: true 3 | title: Yalın(Düz) PHP Şablonları 4 | anchor: yalin_php_sablonlari 5 | --- 6 | 7 | ## Yalın PHP Şablonları {#yalin_php_sablonlari_title} 8 | 9 | Yalın PHP şablonları düz PHP kodlarını kullanan basit şablonlardır. Bu doğal bir seçimdir çünkü PHP'nin kendisi 10 | aslında bir şablon dilidir. Bunun anlamı siz PHP dilini rahatça HTML gibi dillerin arasında kullanabilirsiniz. 11 | Bu PHP geliştiricilerinin yararınadır çünkü başka yeni bir dil öğrenmelerine gerek yoktur, bildikleri fonksiyonları kullanabilirler ve hatta kullandıkları 12 | editörlerinin renklendirme seçeneklerini bile değiştirmeden kullanabilirler. Dahası, düz 13 | PHP şablonları tekrar derlenen şablon yöntemlerine göre derlenme aşaması olmadığından daha da hızlı çalışacaktır. 14 | 15 | Her modern PHP framework yapısı bir çeşit şablon sistemi kullanmaktadır, bir çoğuda varsayılan olarak düz PHP 16 | kullanır. Framework'ler dışında [Plates](http://platesphp.com/) veya [Aura.View](https://github.com/auraphp/Aura.View) 17 | gibi kütüphaneler kalıtım, tasarım modeli(layout) ve eklenti gibi modern özellikleri sağlayan düz PHP şablonları 18 | ile çalışabilmeyi sağlarlar. 19 | 20 | Örnek bir düz PHP şablonu ([Plates](http://platesphp.com/) kütüphanesi ile): 21 | 22 | {% highlight php %} 23 | insert('header', ['title' => 'User Profile']) ?> 24 | 25 |

User Profile

26 |

Hello, escape($name)?>

27 | 28 | insert('footer') ?> 29 | {% endhighlight %} 30 | -------------------------------------------------------------------------------- /pages/example.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Example Stand-Alone Page 4 | --- 5 | 6 | # Page Title 7 | 8 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 9 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 10 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 11 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 12 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 13 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 14 | 15 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 16 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 17 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 18 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 19 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 20 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 21 | 22 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 23 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 24 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 25 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 26 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 27 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 28 | -------------------------------------------------------------------------------- /_posts/07-01-01-Databases.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Veritabanları 3 | anchor: veritabanlari 4 | --- 5 | 6 | # Veritabanları {#veritabanlari_title} 7 | 8 | Bilginin devamlılığı için bir çok zaman kodunuzda veritabanını kullanırsınız. 9 | Veritabanına bağlanmak için bir kaç yolunuz vardır. _PHP 5.1.0'e kadar_ PHP'de 10 | bulunan [mysql][mysql], [mysqli][mysqli], [pgsql][pgsql] gibi veritabanı 11 | sürücülerini kullanabilirsiniz. 12 | 13 | Eğer sadece bir veritabanı kullanıyorsanız yukarıda ki saydıklarımız çok iyi 14 | olacaktır. Ama MySQL yanında biraz da MSSQL kullanıyorsanız, ya da Oracle 15 | veritabanına bağlanmanız gerekiyorsa, aynı sürücüyü kullanma ihtimaliniz 16 | olmayacaktır. Her birisi için yeni bir API öğrenmeniz gerekecektir. 17 | 18 | Diğer taraftan, mysql eklentisinin PHP'de aktif geliştirmesi duracaktır. 19 | PHP 5.4.0'dan bu yana resmi durumu "Uzun vadede önerilmemektedir" halindedir. 20 | Bunun anlamı bir kaç sürüm sonrasında silinecektir. PHP 5.6 ile gidebilir 21 | belki de. Eğer `mysql_connect()` ver `mysql_query()` kullanıyorsanız bu 22 | satırları tekrar yazmak durumunda kalacaksınız. Bu durumda en iyi seçenek 23 | mysql eklentisinin kullanımını belli bir geliştirme programı(takvimi) ile 24 | mysqli veya PDO ile değiştirmek olacaktır. _Eğer sıfırdan başlıyorsanız mysql 25 | eklentisi yerine [MySQLi extension][mysqli] veya PDO'yu kullanın._ 26 | 27 | * [PHP: MySQL için Bir API Seçmek](http://php.net/manual/tr/mysqlinfo.api.choosing.php) 28 | 29 | [mysql]: http://php.net/mysql 30 | [mysqli]: http://php.net/mysqli 31 | [pgsql]: http://php.net/pgsql 32 | [mssql]: http://php.net/mssql -------------------------------------------------------------------------------- /styles/site/variables.less: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Spacing 3 | ========================================================================== */ 4 | 5 | @baseline: 20px; 6 | 7 | /* ========================================================================== 8 | Typography 9 | ========================================================================== */ 10 | 11 | @body-color: #666; 12 | @body-font-family: "Droid Serif", Georgia, "Times New Roman", Times, serif; 13 | @body-font-size: 14px; 14 | @body-accent-color: #000; 15 | 16 | @header-color: #111; 17 | @header-font-family: "Droid Serif", Georgia, "Times New Roman", Times, serif; 18 | @header-font-weight: 700; 19 | 20 | /* ========================================================================== 21 | Grid 22 | ========================================================================== */ 23 | 24 | @fixed-column-width: 60px; 25 | @fixed-gutter-width: 20px; 26 | @fixed-columns: 12; 27 | 28 | @fluid-column-width: 4.3%; 29 | @fluid-gutter-width: 4.4%; 30 | @fluid-columns: 12; 31 | 32 | @mobile-break-width: 480px; 33 | @mobile-column-width: 20%; 34 | @mobile-gutter-width: 6.6666%; 35 | @mobile-columns: 4; 36 | 37 | /* ========================================================================== 38 | Buttons 39 | ========================================================================== */ 40 | 41 | @button-color: #DDD; 42 | @button-primary-color: #0055CC; 43 | @button-info-color: #2F96B4; 44 | @button-success-color: #51A351; 45 | @button-warning-color: #FAA732; 46 | @button-danger-color: #BD362F; 47 | -------------------------------------------------------------------------------- /_posts/08-05-01-Further-Reading.md: -------------------------------------------------------------------------------- 1 | --- 2 | isChild: true 3 | title: Ekstra Kaynaklar 4 | anchor: templating_ekstra_okumalar 5 | --- 6 | 7 | ## Ekstra Kaynaklar {#templating_ekstra_okumalar_title} 8 | 9 | ### Makaleler & Örnekler 10 | 11 | - [Templating Engines in PHP](http://fabien.potencier.org/article/34/templating-engines-in-php) 12 | - [An Introduction to Views & Templating in CodeIgniter](http://code.tutsplus.com/tutorials/an-introduction-to-views-templating-in-codeigniter--net-25648) 13 | - [Getting Started With PHP Templating](http://www.smashingmagazine.com/2011/10/17/getting-started-with-php-templating/) 14 | - [Roll Your Own Templating System in PHP](http://code.tutsplus.com/tutorials/roll-your-own-templating-system-in-php--net-16596) 15 | - [Master Pages](https://laracasts.com/series/laravel-from-scratch/episodes/7) 16 | - [Working With Templates in Symfony 2](http://code.tutsplus.com/tutorials/working-with-templates-in-symfony-2--cms-21172) 17 | 18 | ### Kütüphaneler 19 | 20 | - [Aura.View](https://github.com/auraphp/Aura.View) *(native)* 21 | - [Blade](http://laravel.com/docs/templates) *(compiled, framework specific)* 22 | - [Dwoo](http://dwoo.org/) *(compiled)* 23 | - [Latte](https://github.com/nette/latte) *(compiled)* 24 | - [Mustache](https://github.com/bobthecow/mustache.php) *(compiled)* 25 | - [PHPTAL](http://phptal.org/) *(compiled)* 26 | - [Plates](http://platesphp.com/) *(native)* 27 | - [Smarty](http://www.smarty.net/) *(compiled)* 28 | - [Twig](http://twig.sensiolabs.org/) *(compiled)* 29 | - [Zend\View](http://framework.zend.com/manual/2.3/en/modules/zend.view.quick-start.html) *(native, framework specific)* 30 | -------------------------------------------------------------------------------- /_posts/16-10-01-Books.md: -------------------------------------------------------------------------------- 1 | --- 2 | isChild: true 3 | anchor: kitaplar 4 | --- 5 | 6 | ## Kitaplar {#kitaplar_title} 7 | 8 | Çevrenizde PHP için bir çok kitap bulunmakta ama bir çoğu eski ve artık doğru 9 | bilgi içermiyor. "PHP 6" için yazılmış kitaplar bile yok ve olmayabilir de. 10 | 11 | Bu bölüm PHP'de geliştirme kitap önerileri için yaşayan bir döküman olmayı 12 | hedefler. Eğer kitabınızın eklenmesini istiyorsanız, bir pull-request 13 | gönderin. Bu isteğiniz değerlendirilecektir. 14 | 15 | ### Ücretsiz Kitaplar 16 | 17 | * [PHP Usulüne Uygun](https://leanpub.com/phptherightway/) - This website is 18 | available as a book completely for free 19 | 20 | ### Ücretli Kitaplar 21 | 22 | * [Modernizing Legacy Applications In PHP](https://leanpub.com/mlaphp) - Get 23 | your code under control in a series of small, specific steps 24 | * [Building Secure PHP Apps](https://leanpub.com/buildingsecurephpapps) - Learn the security basics that a senior developer usually acquires over years of experience, all condensed down into one quick and easy handbook 25 | * [The Grumpy Programmer's Guide To Building Testable PHP Applications](https://leanpub.com/grumpy-testing) - Learning to write testable doesn't have to suck 26 | * [Securing PHP: Core Concepts](https://leanpub.com/securingphp-coreconcepts) - A guide to some of the most common security terms and provides some examples of them in every day PHP 27 | * [Scaling PHP](https://leanpub.com/scalingphp) - Stop playing sysadmin and get back to coding 28 | * [Signaling PHP](https://leanpub.com/signalingphp) - PCNLT signals are a great help when writing PHP scripts that run from the command line. 29 | -------------------------------------------------------------------------------- /_posts/11-03-01-Behavior-Driven-Development.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Davranış Odaklı Geliştirme 3 | isChild: true 4 | anchor: davranis_odakli_gelistirme 5 | --- 6 | 7 | ## Davranış Odaklı Geliştirme (Behaviour Driven Development) {#davranis_odakli_gelistirme_title} 8 | 9 | İki tür Davranış Odaklı Geliştirme (Behavior-Driven Development - BDD) vardır: SpecBDD ve Story BDD. SpecBDD teknik 10 | davranışa veya koda odaklanır. StoryBDD iş veya özellik davranışlarına ve etkileşimlerine odaklanır. PHP her iki 11 | tür içinde çatıya sahiptir. 12 | 13 | StoryBDD ile, uygulamanızın davranışlarını açıklamak için okunabilir hikayeler yazabilirsiniz. Bu hikayeler 14 | uygulamanıza karşı test olarak kullanılabilir. PHP uygulamanızda StoryBDD için Behat adındaki çatı kullanabilirsiniz. 15 | Bu çatı Ruby için yazılmış [Cucumber](http://cukes.info/) çatısından ilham alınarak oluşturulmuş. 16 | Hikayeleri oluşturmak için Gherkin DSL dili kullanılır. 17 | 18 | SpecBDD ile kodunuzun gerçekteki davranışlarınızı açıklayan açıklamalar yazabilirsiniz. Fonksiyon ya da metodu 19 | test etmek yerine, bu fonksiyon ya da metodun nasıl davrandığını açıklayabilirsiniz. PHP PHPSpec çatısını 20 | bu amaç için sunmaktadır. Bu çatı için Ruby için yazılmış [RSpec project](http://rspec.info/) projesinden 21 | ilham alınmıştır. 22 | 23 | ### BDD Links 24 | 25 | * [Behat](http://behat.org/), the StoryBDD framework for PHP, inspired by Ruby's [Cucumber](http://cukes.info/) project; 26 | * [PHPSpec](http://www.phpspec.net/), the SpecBDD framework for PHP, inspired by Ruby's [RSpec](http://rspec.info/) project; 27 | * [Codeception](http://www.codeception.com) is a full-stack testing framework that uses BDD principles. 28 | -------------------------------------------------------------------------------- /_posts/16-01-01-Resources.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Kaynaklar 3 | anchor: kaynaklar 4 | --- 5 | # Kaynaklar {#kaynaklar_title} 6 | 7 | ## Kaynak 8 | 9 | * [PHP Website](http://php.net/) 10 | * [PHP Documentation](http://php.net/docs.php) 11 | 12 | ## Takip Etmek için Kişiler 13 | 14 | * [Rasmus Lerdorf](http://twitter.com/rasmus) 15 | * [Fabien Potencier](http://twitter.com/fabpot) 16 | * [Derick Rethans](http://twitter.com/derickr) 17 | * [Chris Shiflett](http://twitter.com/shiflett) 18 | * [Sebastian Bergmann](http://twitter.com/s_bergmann) 19 | * [Matthew Weier O'Phinney](http://twitter.com/mwop) 20 | * [Pádraic Brady](http://twitter.com/padraicb) 21 | * [Anthony Ferrara](http://twitter.com/ircmaxell) 22 | * [Nikita Popov](http://twitter.com/nikita_ppv) 23 | 24 | ## Danışmanlık 25 | 26 | * [phpmentoring.org](http://phpmentoring.org/) - PHP topluluğunda örgün, birebir danışmanlık. 27 | 28 | ## PHP Servis Platformları (PaaS) Sağlayıcıları 29 | 30 | * [PagodaBox](https://pagodabox.com/) 31 | * [AppFog](https://appfog.com/) 32 | * [Heroku](https://heroku.com) 33 | (PHP desteği dökümante edilmemiş ama tutarlı Facebook ortaklığı üzerine kurulu [link](http://net.tutsplus.com/tutorials/php/quick-tip-deploy-php-to-heroku-in-seconds/)) 34 | * [fortrabbit](http://fortrabbit.com/) 35 | * [Engine Yard Cloud](https://www.engineyard.com/products/cloud) 36 | * [Red Hat OpenShift Platform](http://openshift.com) 37 | * [dotCloud](http://docs.dotcloud.com/services/php/) 38 | * [AWS Elastic Beanstalk](http://aws.amazon.com/elasticbeanstalk/) 39 | * [cloudControl](https://www.cloudcontrol.com/) 40 | * [Windows Azure](http://www.windowsazure.com/) 41 | * [Zend Developer Cloud](http://www.phpcloud.com/develop) 42 | * [Google App Engine](https://developers.google.com/appengine/docs/php/gettingstarted/) 43 | * [Jelastic](http://jelastic.com/) 44 | -------------------------------------------------------------------------------- /_posts/07-02-01-Databases_MySQL.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Veritabanları MySQL 3 | anchor: veritabanlari-mysql 4 | isChild: true 5 | --- 6 | 7 | ## Veritabanları MySQL {#veritabanlari_mysql_title} 8 | 9 | PHP için [mysql] eklentisi oldukça eski ve yerini 2 yeni eklentiye bırakmış 10 | haldedir: 11 | 12 | - [mysqli] 13 | - [pdo] 14 | 15 | Sadece geliştirmesi durmuş değil ayrıca [PHP 5.5.0 ile eskimiş olarak][mysql_deprecated] 16 | işaretlenmiş durumundadır, ve **[PHP 7.0 ile birlikte silinecektir.][mysql_removed]** 17 | 18 | Hangi modulü kullandığınızı görmek için `php.ini` dosyanıza bakmanız 19 | gerekmektedir. Diğer bir opsiyon'da seçtiğiniz editörde `mysql_*` diye arama 20 | yapmanız olabilir. Eğer `mysql_connect()` ve `mysql_query()` diye fonksiyonlar 21 | ile karşılaşırsanız `mysql` kullanımda demektir. 22 | 23 | PHP 7.0 kullanmıyor olsanız bile, PHP 7.0 güncellemesi geldiğinde bu güncellemeyi 24 | yapmak sizin için çok zor olabilir. Halen geliştirmekte olduğunuz kendi 25 | uygulamanız için en iyi seçenek sizin mysql kullanımınızı [mysqli] veya [PDO] 26 | ile değiştirmek olacaktır. 27 | 28 | **Eğer [mysql]'den [mysqli]'ye güncellemek istiyorsanız, size basitçe şunu 29 | önerebiliriz. Uygulamanız içerisinde `mysql_*`ı arayıp `mysqli_*` ile değiştirin. 30 | Bu basitleştirilmiş çözüm mysqli ve [PDO][pdo]'nun sunduğu, parameter binding 31 | gibi imkanları kaçırmamıza neden olabilir.** 32 | 33 | * [PHP: Choosing an API for MySQL][mysql_api] 34 | * [PDO Tutorial for MySQL Developers][pdo4mysql_devs] 35 | 36 | [mysql]: http://php.net/mysql 37 | [mysql_deprecated]: http://php.net/migration55.deprecated 38 | [mysql_removed]: http://php.net/manual/en/migration70.removed-exts-sapis.php 39 | [mysqli]: http://php.net/mysqli 40 | [pdo]: http://php.net/pdo 41 | [mysql_api]: http://php.net/mysqlinfo.api.choosing 42 | [pdo4mysql_devs]: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers -------------------------------------------------------------------------------- /styles/base/variables.less: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Spacing 3 | ========================================================================== */ 4 | 5 | @baseline: 20px; 6 | 7 | /* ========================================================================== 8 | Typography 9 | ========================================================================== */ 10 | 11 | @body-color: #555; 12 | @body-font-family: "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande", sans-serif; 13 | @body-font-size: 14px; 14 | @body-accent-color: #f00; 15 | 16 | @header-color: #000; 17 | @header-font-family: "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande", sans-serif; 18 | @header-font-weight: bold; 19 | 20 | /* ========================================================================== 21 | Grid 22 | ========================================================================== */ 23 | 24 | @fixed-column-width: 40px; 25 | @fixed-gutter-width: 20px; 26 | @fixed-columns: 12; 27 | 28 | @fluid-column-width: 4.3%; 29 | @fluid-gutter-width: 4.4%; 30 | @fluid-columns: 12; 31 | 32 | @mobile-break-width: 480px; 33 | @mobile-column-width: 20%; 34 | @mobile-gutter-width: 6.6666%; 35 | @mobile-columns: 4; 36 | 37 | /* ========================================================================== 38 | Buttons 39 | ========================================================================== */ 40 | 41 | @button-color: #DDD; 42 | @button-primary-color: #0055CC; 43 | @button-info-color: #2F96B4; 44 | @button-success-color: #51A351; 45 | @button-warning-color: #FAA732; 46 | @button-danger-color: #BD362F; 47 | 48 | /* ========================================================================== 49 | Site Variables 50 | ========================================================================== */ 51 | 52 | @import "../site/variables"; -------------------------------------------------------------------------------- /styles/all.less: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | NMC Bootstrap 3 | 4 | This LESS file imports all other LESS files. You should compile 5 | and minify this file before site launch. 6 | ========================================================================== */ 7 | 8 | /* Import NMC bootstrap */ 9 | 10 | @import "base/all"; 11 | 12 | /* Import site-specific styles */ 13 | 14 | @import "site/site-header.less"; 15 | @import "site/site-navigation.less"; 16 | @import "site/site-content.less"; 17 | @import "site/site-footer.less"; 18 | 19 | /* Tablets and Smartphones */ 20 | 21 | @media only screen and (max-width : 1024px) { 22 | .build-date{ 23 | text-align: center; 24 | } 25 | .site-header{ 26 | height: 220px; 27 | position: absolute; 28 | top: 20px; 29 | left: 0; 30 | width: 100%; 31 | } 32 | .fork-me img{ 33 | height: 110px; 34 | width: 110px; 35 | } 36 | .site-navigation{ 37 | margin-top: 240px; 38 | padding: 20px; 39 | position: relative; 40 | width: auto; 41 | 42 | ul{ 43 | border: 1px solid #999; 44 | border-bottom: none; 45 | } 46 | li{ 47 | .man; 48 | .pan; 49 | } 50 | a{ 51 | background: #CCC; 52 | display: block; 53 | border-bottom: 1px solid #999; 54 | padding: 10px; 55 | text-decoration: none; 56 | } 57 | ul ul{ 58 | border: none; 59 | .man; 60 | .pan; 61 | } 62 | ul ul a{ 63 | background: transparent; 64 | } 65 | } 66 | .site-content{ 67 | padding: 20px; 68 | overflow:hidden; 69 | } 70 | .top{ 71 | display: inline-block; 72 | float: none; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /_posts/16-07-01-Components.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bileşenler (Components) 3 | isChild: true 4 | anchor: bilesenler_components 5 | --- 6 | 7 | ## Bileşenler (Components) {#bilesenler_components_title} 8 | 9 | Daha öncede değinildiği üzere "Bileşenler" paylaşımlı kod, yayınlama ve oluşturma aşamalarında genel bir amaç için diğer bir yaklaşımdır. 10 | Bir çok bileşen deposu vardır. Bunlardan ana iki tanesi: 11 | 12 | * [Packagist](/php-the-right-way/#composer_and_packagist) 13 | * [PEAR](/php-the-right-way/#pear) 14 | 15 | İki araçta yükleme ve yükseltme işlemlerinde yardımcı olmak için komut satırında çalışan bir arayüze sahiptir. Daha fazla bilgi için 16 | [Bağımlılık Yönetimi] bölümüne bakabilirsiniz. 17 | 18 | There are also component-based frameworks and component-vendors that offer no framework at all. These projects provide 19 | another source of packages which ideally have little to no dependencies on other packages, or specific frameworks. 20 | 21 | For example, you can use the [FuelPHP Validation package], without needing to use the FuelPHP framework 22 | itself. 23 | 24 | [Bağımlılık Yönetimi]: /php-the-right-way/#bagimlilik_dependency_yonetimi 25 | [FuelPHP Validation package]: https://github.com/fuelphp/validation 26 | 27 | * [Aura](http://auraphp.github.com/) 28 | * [FuelPHP](https://github.com/fuelphp) 29 | * [Hoa Project](https://github.com/hoaproject) 30 | * [Orno](https://github.com/orno) 31 | * [Symfony Components](http://symfony.com/doc/current/components/index.html) 32 | * [The League of Extraordinary Packages](http://thephpleague.com/) 33 | * Laravel's Illuminate Components 34 | * [Eloquent ORM](https://github.com/illuminate/database) 35 | * [Queue](https://github.com/illuminate/queue) 36 | 37 | _Laravel's [Illuminate components](https://github.com/illuminate) will become better decoupled from the Laravel framework. 38 | For now, only the components best decoupled from the Laravel framework are listed above._ -------------------------------------------------------------------------------- /_posts/10-07-01-Error-Reporting.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Hata Raporları 3 | isChild: true 4 | anchor: hata_raporlari 5 | --- 6 | 7 | ## Hata Raporları {#hata_raporlari_title} 8 | 9 | Hata logları uygulamanızdaki sorunları bulmak için yararlı olabilir, ama aynı zamanda dış dünyaya uygulama yapısı 10 | hakkında bilgi gösterebilir. Bu gibi sorunlarda uygulamanızı korumak için geliştirme ve canlı ortamın farklı 11 | konfigüre edilmesi gerekebilir. 12 | 13 | ### Geliştirme 14 | 15 | Geliştirme ortamında olası her hatayı görmek için aşağıdaki satırları `php.ini` dosyanıza ekleyebilirsiniz.  16 | 17 | display_errors = On 18 | display_startup_errors = On 19 | error_reporting = -1 20 | log_errors = On 21 | 22 | > `-1`, PHP'nin gelecekteki sürümlerinde yeni sabitler ve seviyeler eklense de olası her hatayı gösterecektir. `E_ALL` PHP 5.4'de aynı işi görecektir. - [php.net](http://php.net/manual/function.error-reporting.php) 23 | 24 | `E_STRICT` hata seviyesi 5.3.0 sürümü ile başladı ve `E_ALL` ile aynı değildir, ama 5.4.0 sürümünde `E_ALL` ın bir parçası oldu. Bu yüzden `-1` ya da `E_ALL | E_STRICT` kullanmalısınız. 25 | 26 | **PHP versionlarına göre olası tüm hata raporları** 27 | 28 | * < 5.3 `-1` or `E_ALL` 29 | *   5.3 `-1` or `E_ALL | E_STRICT` 30 | * > 5.3 `-1` or `E_ALL` 31 | 32 | ### Canlı Ortam 33 | 34 | Hataları canlı ortamda gizelemek için `php.ini` dosyasına aşağıdaki konfigürasyonları eklemelisiniz : 35 | 36 | display_errors = Off 37 | display_startup_errors = Off 38 | error_reporting = E_ALL 39 | log_errors = On 40 | 41 | Canlı sistemde bu ayarlar ile, hatalar halen web server için saklanacaktır, ama kullanıcılara gösterilmeyecektir. Daha fazla bilgi 42 | için aşağıdaki linkleri kullanabilirsiniz : 43 | 44 | * [error_reporting](http://php.net/manual/errorfunc.configuration.php#ini.error-reporting) 45 | * [display_errors](http://php.net/manual/errorfunc.configuration.php#ini.display-errors) 46 | * [display_startup_errors](http://php.net/manual/errorfunc.configuration.php#ini.display-startup-errors) 47 | * [log_errors](http://php.net/manual/errorfunc.configuration.php#ini.log-errors) 48 | -------------------------------------------------------------------------------- /_posts/03-06-01-XDebug.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: XDebug 3 | isChild: true 4 | anchor: xdebug 5 | --- 6 | 7 | ## XDebug {#xdebug_title} 8 | 9 | Yazılım gelişticiliğinde en yararlı araçlardan birisi de ayıklayıcıdır 10 | (debugger). Bu kodunuzu izlemenize ve yığın içeriklerini görme imkanı sağlar. 11 | XDebug, PHP'nin ayıklayıcısı, bazı geliştirme ortamlarında (IDE) yığın 12 | denetleme ve kesme noktaları için kullanılır. PHPUnit ve KCacheGrind gibi 13 | araçlar ile kodun profilini çıkarma ve analiz etme imkanı verir. 14 | 15 | Kendinizi `var_dump`/`print_r` karmaşasında bulursanız ve halen çözüm 16 | bulamıyorsanız, bir ayıklayıcı kullanmalısınız. 17 | 18 | [Xdebug kurmak][xdebug-install] aldatıcı olabilir, ama en önemli özelliği 19 | "Remote Debugging"dir - eğer siz yerel bir makinede geliştirip VM veya başka 20 | bir sunucuda test ediyorsanız, "Remote Debugging" özelliğini etkin hale 21 | getirmek isteyebilirsiniz. 22 | 23 | Genellikle, Apache Vhost veya .htaccess dosyalarınızı aşağıdaki gibi 24 | güncelleyeceksiniz : 25 | 26 | {% highlight ini %} 27 | php_value xdebug.remote_host=192.168.?.? 28 | php_value xdebug.remote_port=9000 29 | {% endhighlight %} 30 | 31 | "remote host" ve "remote port" sizin yerel bilgisayarınızı ve portunu 32 | belirtmektedir. Geliştirme ortamınızı bu bilgilere göre konfigüre edin. 33 | Geliştirme ortamınızı "listen for connections" moduna getirin ve aşağıdaki 34 | bağlantıyı açın : 35 | 36 | http://your-website.example.com/index.php?XDEBUG_SESSION_START=1 37 | 38 | Geliştirme ortamınız komut yürütür gibi mevcut durumu yakalar, kesme noktaları 39 | eklemenize ve bellekteki değerini araştırmanıza izin verir. 40 | 41 | Grafik arayüzlü ayıklayıcılar adım adım ilerlemeyi, değişkenleri seçmeyi ve 42 | çalışma zamanında kodu değerlendirmeyi kolaylaştırır. Birçok IDE Xdebug için 43 | grafiksel bir arayüzü dahili olarak ya da eklenti olarak barındırır. MacGDBp 44 | mac için açık kaynak kodlu bağımsız bir Xdebug uygulamasıdır. 45 | 46 | * [Xdebug Hakkında][xdebug-docs] 47 | * [MacGDBp Hakkında][macgdbp-install] 48 | 49 | [xdebug-docs]: http://xdebug.org/docs/ 50 | [xdebug-install]: http://xdebug.org/docs/install 51 | [macgdbp-install]: http://www.bluestatic.org/software/macgdbp/ 52 | 53 | -------------------------------------------------------------------------------- /_posts/17-01-01-Community.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Topluluk 3 | isChild: false 4 | anchor: topluluk 5 | --- 6 | 7 | # Topluluk {#topluluk_title} 8 | 9 | Büyük olduğu kadar farklı(çeşitlilik açısından) PHP toplulukları mevcuttur ve bu toplulukların üyeleri yeni PHP yazılımcılarını desteklemeye hazır ve isteklidir. Yerel PHP gruplarına katılarak veya daha büyük PHP konferanslarına katılarak PHP hakkında daha iyi bilgiler edinebilir ve daha iyi örneklere ulaşabilirsiniz. PHP'nin [irc.freenode.com][php-irc] adresindeki #phpc IRC kanalında takılabilirsin ve twitter üzerinden [@phpc][phpc-twitter] hesabını takip edebilirsin. Yeni geliştiricilerle tanışabilirsin, yeni konular öğrenebilirsin veya yeni arkadaşlar edinebilirsin. Google+ PHP [Programmer community][php-programmers-gplus] ve [StackOverflow][php-so] PHP geliştiricilerinin takıldığı diğer yerlerdir. 10 | 11 | [Resmi PHP Etkinlikleri Takvimi Hakkında][php-calendar] 12 | 13 | ## PHP Kullanıcı Grupları 14 | 15 | Büyük bir şehirde yaşıyorsanız, yakınlarınızda bir PHP kullanıcı grubu vardır. Resmin bir liste bulunmamasına rağmen [Google][google] veya [Meetup.com][meetup] veya [PHP.ug][php-ug] üzeriden bu grupları arayabilirsiniz. Daha küçük bir şehirde yaşıyorsanız, yerel bir grup olmayabilir. Bu durumda siz bir tane başlatın. 16 | 17 | [PHP Wiki'deki Kullanıcı Grupları Hakkında][php-wiki] 18 | 19 | ## PHP Konferansları 20 | 21 | PHP toplulukları tarafından dünya üzerinde birçok ülkede bölgesel ve ulusal konferanslar düzenlemektedir. PHP topluluğundan bilinen kişiler genellikle büyük etkinliklerde konuşurlar, ve bu endüstrinin liderlerinden birşeyler öğrenmek için büyük bir fırsattır. 22 | 23 | [PHP konferansları][php-conf] 24 | 25 | [php-calendar]: http://www.php.net/cal.php 26 | [google]: https://www.google.com/search?q=php+user+group+near+me 27 | [meetup]: http://www.meetup.com/find/ 28 | [php-ug]: http://php.ug 29 | [php-wiki]: https://wiki.php.net/usergroups 30 | [php-conf]: http://php.net/conferences/index.php 31 | [phpc-twitter]: https://twitter.com/phpc 32 | [php-programmers-gplus]: https://plus.google.com/u/0/communities/104245651975268426012 33 | [php-irc]: http://webchat.freenode.net/?channels=phpc 34 | [php-so]: http://stackoverflow.com/questions/tagged/php 35 | -------------------------------------------------------------------------------- /_posts/03-03-01-Namespaces.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: İsim Uzayları (Namespaces) 3 | isChild: true 4 | anchor: isim_uzaylari_namespaces 5 | --- 6 | 7 | ## İsim Uzayları (Namespaces) {#isim_uzaylari_namespaces_title} 8 | 9 | Daha öncede bahsedildiği üzere PHP topluluğu bir sürü geliştiriciden oluşmaktadır. 10 | Bu nedenle bazı durumlarda bir kaç farklı kütüphane aynı isimde kullanılmış 11 | olabilir. İki kütüphane aynı isim uzayında oldukları zaman çakışırlar ve bu da 12 | fatal error gibi sorunlara veya exceptionlara neden olur. 13 | 14 | _İsim uzayları_ bu sorunu çözmektedir. PHP referans kılavuzunda da açıklandığı 15 | gibi, isim uzayları işletim sistemlerindeki klasörler ile karşılaştırılabilir. 16 | Aynı isimdeki iki dosya nasıl farklı klasörlerde bulunabilirsa, aynı şekilde 17 | aynı isimdeki iki sınıf farklı İsim Uzayları altında aynı isimde bulunabilmektedir. 18 | 19 | Diğer geliştiricilerin geliştirdiği kütüphaneler ile çakışma korkusu yaşamadan 20 | geliştirme yapabilmeniz için isim uzaylarını kullanmak sizin yararınıza olacaktır. 21 | 22 | [PSR-4][psr4] İsim Uzayları konusuna değinmiştir ve birbiri ile uyumlu 23 | (tak-ve-kullan kod) standart dosyalar, sınıflar ve isim uzayları düzeni kurmayı 24 | amaçlamaktadır. 25 | 26 | 27 | 28 | Ekim 2014'de daha önceki autoloader standardı olan [PSR-0][psr0]'ı eski olarak 29 | işaretledi, ve [PSR-4][psr4] bunun yerine yayınlandı. Şu anda ikiside kullanılabilir 30 | ve PSR-0 silinmiş değil. PSR-4 PHP 5.3 ve üstü sürümlerini gerektirdiği için daha 31 | düşük sürümleri kullanan bir çok PHP projesi halen PSR-0'ı uygulamaktadır veya 32 | kullanmaktadır. _Luckily those PHP 5.2-only projects are starting to up their 33 | version requirements, meaning PSR-0 is being used less and less._ 34 | 35 | Eğer yeni bir proje ya da paket için autoloader standardını kullanmak 36 | istiyorsanız PSR-4'e bir gözatmak isteyebilirsiniz. 37 | 38 | * [İsim Uzayları hakkında][namespaces] 39 | * [PSR-0 hakkında][psr0] 40 | * [Read about PSR-4][psr4] 41 | 42 | [namespaces]: http://php.net/manual/tr/language.namespaces.php 43 | [psr0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 44 | [psr4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /styles/base/idioms.less: -------------------------------------------------------------------------------- 1 | /** 2 | * New Media Campaigns Idioms 3 | * 4 | * These are common patterns we use in all of our 5 | * projects. They are consolidated here to keep code DRY. 6 | * 7 | * Listing 8 | * * .no-text, .text-replace 9 | * * .no-list 10 | * * .no-form 11 | * * .fixed-width(@width) 12 | * * .column-width(@width) 13 | * * .column-left(@width) 14 | * * .column-right(@width) 15 | * * .full-size 16 | * * .absolute-default 17 | * * .absolute-fullsize 18 | * * .clearfix 19 | */ 20 | 21 | /* Hides text when using image replacement */ 22 | .no-text, .text-replace{ 23 | overflow: hidden; 24 | text-indent: 100%; 25 | white-space: nowrap; 26 | } 27 | 28 | /* Removes bullets, margin, and padding from list */ 29 | .no-list{ 30 | list-style: none; 31 | margin: 0; 32 | padding: 0; 33 | } 34 | 35 | /* Removes webkit styling from form element */ 36 | .no-form{ 37 | border: none; 38 | margin: 0; 39 | padding: 0; 40 | -webkit-appearance: none; 41 | } 42 | 43 | /* Center a fixed width container */ 44 | .fixed-width(@width) { 45 | margin: 0 auto; 46 | width: @width; 47 | } 48 | 49 | /* Adds left or right columns (e.g. content and sidebar) */ 50 | .column-width(@width){ 51 | display: inline; 52 | width: @width; 53 | } 54 | .column-left(@width){ 55 | .column-width(@width); 56 | float: left; 57 | } 58 | .column-right(@width){ 59 | .column-width(@width); 60 | float: right; 61 | } 62 | 63 | /* Set width and height of element to that of its parent */ 64 | .full-size{ 65 | height: 100%; 66 | width: 100%; 67 | } 68 | 69 | /* Position element absolutely to 0,0 */ 70 | .absolute-default{ 71 | position: absolute; 72 | left: 0; 73 | top: 0; 74 | } 75 | 76 | /* Position element absolutely and set its width and height to that of its parent (useful for slideshows) */ 77 | .absolute-fullsize{ 78 | .absolute-default; 79 | .full-size; 80 | } 81 | 82 | /* The micro clearfix http://nicolasgallagher.com/micro-clearfix-hack/ */ 83 | .clearfix { 84 | *zoom:1; 85 | 86 | &:before, 87 | &:after { 88 | content:""; 89 | display:table; 90 | } 91 | &:after { 92 | clear:both; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /_posts/10-03-01-Password-Hashing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Şifre Karıştırma (hashing) 3 | isChild: true 4 | anchor: sifre_karistirma_hashing 5 | --- 6 | 7 | ## Şifre Karıştırma (hashing) {#sifre_karistirma_hashing_title} 8 | 9 | Herkes bir şekilde, şifre ile korunan kullanıcı giriş ekranı bulunan bir uygulama yapar. Kullanıcı adı ve şifre veritabanında barındırılır ve giriş sırasında kimlik doğrulaması için kullanılır. 10 | 11 | Bu aşamada en önemli şey şifre saklanmadan önce [_karıştırılmasıdır (hash)_][3]. Şifre karıştırıldıktan sonra geri döndürülemezdir ve tek yönlüdür. Sabit uzunluktadır ve geri döndürülemez. Bunun anlamı, özgün metine ulaşılamaz ancak karıştırılmış şifreler birbiri ile karşılaştırarak doğruluğu belirlenir. Eğer şifreler karıştırılmaz ise 3. kişilerçe bir şekilde veritabanına ulaşılırsa kişilerin bilgileri tehlikeye girer. Bazı kullanıcılar (maalesefki) diğer servisler ile aynı şifreleri kullanabilir. Bu yüzden, bu konuda ciddi güvenlik önlemi almak gerekir. 12 | 13 | 14 | **`password_hash` ile Şifre Karıştırma** 15 | 16 | PHP 5.5 ile `password_hash` fonksiyonu geldi. `password_hash` şu anda PHP'nin desteklediği güçlü bir algoritmaya sahip BCrypt kütüphanesini kullanıyor. Ama gerektiğinde daha fazla algoritmayı desteklemek için güncellenecektir. [`password_compat`][2], password_* fonksiyonlarının PHP 5.3.7'den üstünede destek verebilmek için oluşturulmuş bir kütüphanedir. 17 | 18 | Aşağıda bir metni karıştıralım, sonra yeni bir metin ile karşılaştıralım. İki metin farklı olduğu için karşılaştırma sonucu yanlış olarak dönecektir. 19 | 20 | {% highlight php %} 21 | = 5.3.7 && < 5.5] [2] 37 | * [Kriptografi açısından karıştırmayı öğrenin] [3] 38 | * [PHP `password_hash` RFC] [4] 39 | 40 | [1]: http://us2.php.net/manual/en/function.password-hash.php 41 | [2]: https://github.com/ircmaxell/password_compat 42 | [3]: http://en.wikipedia.org/wiki/Cryptographic_hash_function 43 | [4]: https://wiki.php.net/rfc/password_hash 44 | -------------------------------------------------------------------------------- /styles/base/reset.less: -------------------------------------------------------------------------------- 1 | /** 2 | * html5doctor.com Reset Stylesheet 3 | * v1.6.1 4 | * Last Updated: 2010-09-17 5 | * Author: Richard Clark - http://richclarkdesign.com 6 | * Twitter: @rich_clark 7 | */ 8 | 9 | html, body, div, span, object, iframe, 10 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 11 | abbr, address, cite, code, 12 | del, dfn, em, img, ins, kbd, q, samp, 13 | small, strong, sub, sup, var, 14 | b, i, 15 | dl, dt, dd, ol, ul, li, 16 | fieldset, form, label, legend, 17 | table, caption, tbody, tfoot, thead, tr, th, td, 18 | article, aside, canvas, details, figcaption, figure, 19 | footer, header, hgroup, menu, nav, section, summary, 20 | time, mark, audio, video { 21 | margin:0; 22 | padding:0; 23 | border:0; 24 | outline:0; 25 | font-size:100%; 26 | vertical-align:baseline; 27 | background:transparent; 28 | } 29 | 30 | body { 31 | line-height:1; 32 | } 33 | 34 | article,aside,details,figcaption,figure, 35 | footer,header,hgroup,menu,nav,section { 36 | display:block; 37 | } 38 | 39 | nav ul { 40 | list-style:none; 41 | } 42 | 43 | blockquote, q { 44 | quotes:none; 45 | } 46 | 47 | blockquote:before, blockquote:after, 48 | q:before, q:after { 49 | content:''; 50 | content:none; 51 | } 52 | 53 | a { 54 | margin:0; 55 | padding:0; 56 | font-size:100%; 57 | vertical-align:baseline; 58 | background:transparent; 59 | } 60 | 61 | /* change colours to suit your needs */ 62 | ins { 63 | background-color:#ff9; 64 | color:#000; 65 | text-decoration:none; 66 | } 67 | 68 | /* change colours to suit your needs */ 69 | mark { 70 | background-color:#ff9; 71 | color:#000; 72 | font-style:italic; 73 | font-weight:bold; 74 | } 75 | 76 | del { 77 | text-decoration: line-through; 78 | } 79 | 80 | abbr[title], dfn[title] { 81 | border-bottom:1px dotted; 82 | cursor:help; 83 | } 84 | 85 | table { 86 | border-collapse:collapse; 87 | border-spacing:0; 88 | } 89 | 90 | /* change border colour to suit your needs */ 91 | hr { 92 | display:block; 93 | height:1px; 94 | border:0; 95 | border-top:1px solid #cccccc; 96 | margin:1em 0; 97 | padding:0; 98 | } 99 | 100 | input, select { 101 | vertical-align:middle; 102 | } -------------------------------------------------------------------------------- /_posts/01-05-01-Windows-Setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Windows Kurulumu 3 | isChild: true 4 | anchor: windows_kurulumu 5 | --- 6 | 7 | ## Windows Kurulumu {#windows_kurulumu_title} 8 | 9 | [windows.php.net/download][php-downloads] adresinden binary indirebilirsiniz. 10 | PHP'yi çıkardıktan sonra PHP'yi heryerden çalıştırabilmek için bir sizin PHP 11 | klasörünüze (php.exe nerede ise) [PATH][windows-path] belirlemenizi önerir. 12 | 13 | Öğrenmek ve yerel geliştirme için hali hazırda gelen PHP 5.4+ sürümü 14 | kullanabilirsiniz ve konfigürasyonu düşünmeniz gerekmez. Eğer hepsi bir arada 15 | bir kurulum (MySQL ve bir çok ekstra araç içeren) istiyorsanız, 16 | [Web Platform Installer][wpi], [XAMPP][xampp], [EasyPHP][easyphp], 17 | [OpenServer][openserver] ve [WAMP][wamp] size Windows platformunda hızlıca bir 18 | kurulum için yardımcı olacaktır. Bu araçlar production ortamına göre biraz 19 | farklılıklar içerecektir. Eğer uygulamanızı Linux ortamında yayınlarken Windows 20 | ortamında geliştirme yapıyorsanız biraz dikkat etmeniz gerekebilir. 21 | 22 | Eğer uygulamanızı Windows ortamında yayınlamak istiyorsanız IIS7 size daha stabil 23 | ve en iyi performansı sunacaktır. [Phpmanager][phpmanager] (IIS7 için bir arayüz 24 | eklentisi) size PHP konfigürasyonları ve yönetimi için kolaylık sağlayacaktır. 25 | IIS7 FastCGI ile gelmektedir sadece PHP'yi handler olarak ayarlamanız yeterlidir. 26 | Ekstra kaynaklar için [Dedicated area on iis.net][php-iis] adresine bakabilirsiniz. 27 | 28 | Genellikle uygulamalar farklı ortamlarda çalıştırıldığı için uygulama 29 | yayınlandığında farklı hatalar ile karşılaşılabilir. Eğer Windows ortamında 30 | geliştirirken projenizi Linux (ya da Windows olmayan herhangi bir yerde) 31 | ortamında yayınlıyorsanız, [Virtual Machine](/#virtualization_title) kullanmayı 32 | düşünmelisiniz. 33 | 34 | Chris Tankersley'in Windows ortamında kullanılacak araçlar ile ilgili çok yararlı 35 | blog yazılarıbulunmaktadır. [PHP development using Windows][windows-tools]. 36 | 37 | 38 | [easyphp]: http://www.easyphp.org/ 39 | [phpmanager]: http://phpmanager.codeplex.com/ 40 | [openserver]: http://open-server.ru/ 41 | [wamp]: http://www.wampserver.com/en/ 42 | [php-downloads]: http://windows.php.net/download/ 43 | [php-iis]: http://php.iis.net/ 44 | [windows-path]: http://www.windows-commandline.com/set-path-command-line/ 45 | [windows-tools]: http://ctankersley.com/2015/07/01/developing-on-windows/ 46 | [wpi]: http://www.microsoft.com/web/downloads/platform.aspx 47 | [xampp]: http://www.apachefriends.org/en/xampp.html -------------------------------------------------------------------------------- /_posts/12-03-01-Virtual-or-Dedicated-Servers.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sanal veya Özel Sunucular 3 | isChild: true 4 | anchor: sanal_veya_ozel_sunucular 5 | --- 6 | 7 | ## Sanal veya Özel Sunucular (Virtual or Dedicated Servers) {#sanal_veya_ozel_sunucular_title} 8 | 9 | Sistem yönetimini seviyorsanız veya öğrenmek istiyorsanız, virtual veya dedicated sunucular uygulamanızın yayınlamanız için tam bir kontrol sağlarlar. 10 | 11 | ### nginx ve PHP-FPM 12 | 13 | PHP, PHP'nin dahili FastCGI Process Manager (FPM)'ı üzerinden, [nginx](http://nginx.org) ile hafif ve yüksek performanslı web sunucusu olarak güzel eşleşiyor. Apache'ye göre daha az bellek kullnırken daha fazla isteği cevaplıyabiliyor. Bu özellikle sanal sunucular üzerinde, ki bellek her zaman bir ihtiyaç, çok önem kazanıyor. 14 | 15 | * [nginx Hakkında](http://nginx.org) 16 | * [PHP-FPM Hakkında](http://php.net/manual/en/install.fpm.php) 17 | * [nginx ve PHP-FPM Güvenli Kurulumu Hakkında](https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/) 18 | 19 | ### Apache ve PHP 20 | 21 | PHP ve Apache'nin uzun bir geçmişi var. Apache çok geniş konfigürasyona ve işlevselliğini artırmak için çokça [modüle](http://httpd.apache.org/docs/2.4/mod/) sahip. PHP çatıları ve Wordpress gibi açık kaynak kodlu uygulamaların kolay kurulumu için en çok seçilen ortak sunucu uygulamasıdır. Ne yazık ki, nginx ile karşılaştırıldığında daha fazla kaynak kullanmaktadır ve aynı zamandaki kaldırabileceği ziyaretçi sayısı daha azdır. 22 | 23 | Apache PHP'yi çalıştırmak için bir kaç konfigürasyona sahip. En yaygın ve en kolay kurulum, mod_php5 ile [prefork MPM](http://httpd.apache.org/docs/2.4/mod/prefork.html)'dir. Bellek kullanımı verimli olmasada kullanımı ve çalışması en kolay olandır. Sunucu tarafı ile çok fazla uğraşmak istemiyorsanız sizin için uygun bir seçimdir. _Eğer mod\_php5 kullanacaksanız, prefork MPM kullanmalısınız._ 24 | 25 | Alternatif olarak, Apache dışında daha fazla performans ve kararlılık istiyorsanız, nginx'le aynı FPM sisteminden yararlanabilirsiniz ve mod_fastcgi veya mod_fcgid ile [worker MPM](http://httpd.apache.org/docs/2.4/mod/worker.html) veya [event MPM](http://httpd.apache.org/docs/2.4/mod/event.html) modüllerini çalıştırabilirsiniz. Bu konfigürasyon belleği daha verimli kullanacak ve daha hızlı olacak ama kurulum aşaması daha zor olacaktır. 26 | 27 | * [Apache Hakkında](http://httpd.apache.org/) 28 | * [Multi-Processing Modulü Hakkında](http://httpd.apache.org/docs/2.4/mod/mpm_common.html) 29 | * [mod_fastcgi Hakkında](http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html) 30 | * [mod_fcgid Hakkında](http://httpd.apache.org/mod_fcgid/) 31 | -------------------------------------------------------------------------------- /_posts/14-03-01-Object-Caching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Nesnel Önbellekleme 3 | isChild: true 4 | anchor: nesnel_onbellekleme 5 | --- 6 | 7 | ## Nesnel Önbellekleme {#nesnel_onbellekleme_title} 8 | 9 | Veritabanından çağırmanın veya verinin getirilmesinin masraflı olduğu ve verinin değişmediği durumlar gibi kodunuzda 10 | bireysel nesneleri önbelleklemenin yararlı olabileceği zamanlar vardır. Bu verileri bellekte tutmak ve daha sonra 11 | hızlıca erişmek için nesnel önbellekleme yazılımlarını kullanabilirsiniz. Veritabanı sunucusuna binen yükü 12 | azaltarak performansı artırabilirsiniz. 13 | 14 | Birçok popüler Bytecode Cache çözümü özel verilerinizi önbelleklemenize izin verir, _so there's even more reason to take 15 | advantage of them._ APCu, XCache, ve WinCache PHP verilerinizi önbelleklemek için bir arayüz (API) sunar. 16 | 17 | En genel kullanılan nesnel önbellekleme sistemleri APCu ve memcached'dır. APCu mükkemmel bir seçimdir, belleğe erişmek 18 | için, basit bir arayüze sahiptir. Kolay kurulabilirdir ve kullanılabilirdir. APCu'nin bir sınırılaması sunucuda yüklü 19 | bulunmasıdır. Memcached ise ayrılmış bir servis olarak kurulur ve network üzerinden kullanılır, bunun anlamı br çok 20 | farklı sistemden erişebileceğiniz merkezi bir süper hızlı veri depolama imkanı sağlamasıdır. 21 | 22 | PHP (Fast-)CGI olarak sunucunuzda çalışıyorsa, her işlem kendi önbelleğini kullanacaktır. APCu verileri işlemler 23 | arasında paylaşılmayacaktır. Bu durumda, memcached kullanmayı tercih edebilirsiniz, memcached PHP işleme sürecine 24 | bağlı değildir. 25 | 26 | Bir ağ yapılandırmasında APCu memcached'dan erişim hızı açısından genellikle daha iyi performans gösterecektir, 27 | ama memcached daha hızlı ve daha fazla büyümek için uygun olacaktır. Eğer uygulamanızın ekstra özelliklerini veya 28 | birden fazla sunucuda çalışmasını önemsemiyorsanız, memcached APCu'den nesnel önbellekleme için daha iyi bir seçimdir. 29 | 30 | APCu örneği: 31 | 32 | {% highlight php %} 33 | php -i 22 | {% endhighlight %} 23 | 24 | `-i` özelliği PHP'nin konfigürasyonlarını [`phpinfo()`][phpinfo] fonksiyonu gibi 25 | ekrana bastıracaktır. 26 | 27 | `-a` özelliği ise ruby'nin IRBsi veya python gibi interaktif bir kabuk 28 | sağlayacaktır. [command line options][cli-options]'dan daha fazla özelliğe 29 | ulaşabilirsiniz. 30 | 31 | "Hello, $isim" yazan basit bir CLI uygulaması yazalım. `merhaba.php` adında bir 32 | dosya oluşturup bunu çalıştırmayı deneyin. 33 | 34 | {% highlight php %} 35 | php merhaba.php 58 | Usage: php merhaba.php [isim] 59 | > php merhaba.php dunya 60 | Merhaba, dunya 61 | {% endhighlight %} 62 | 63 | 64 | * [PHP komut satırı arayüzü hakkında][php-cli] 65 | * [Windows'da PHP komut satırı arayüzü][php-cli-windows] 66 | 67 | [phpinfo]: http://php.net/function.phpinfo 68 | [cli-options]: http://php.net/features.commandline.options 69 | [argc]: http://php.net/reserved.variables.argc 70 | [argv]: http://php.net/reserved.variables.argv 71 | [exit-codes]: http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits 72 | [php-cli]: http://php.net/features.commandline 73 | [php-cli-windows]: http://php.net/install.windows.commandline 74 | -------------------------------------------------------------------------------- /_posts/13-02-01-Vagrant.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Vagrant (Sanal Sunucu) 3 | isChild: true 4 | anchor: vagrant_sanal_sunucu 5 | --- 6 | 7 | ## Vagrant (Sanal Sunucu) {#vagrant_sanal_sunucu_title} 8 | 9 | Geliştirme ortamı ile yayınlama ortamınız farklı ise projenizi yayınladığınızda 10 | farklı hatalar ile karşılaşabilirsiniz. Bir ekip ile çalışırken, herkesin farklı 11 | geliştirme ortamlarında çalışması ve tüm uygulamaların aynı sürümde veya güncel 12 | olabilmesi çok zorlaşıyor. 13 | 14 | Eğer Windows bir makinede geliştirme yapıp Linux bir makinede yayınlıyorsanız 15 | veya bir ekip ile yazılım geliştiriyorsanız sanal bir makine kurmayı 16 | düşünmelisiniz. Bu ilk etapta zor gelebilir, ama [Vagrant][vagrant] kullanarak 17 | basit birkaç adım ile sanal bir makine kurabilirsiniz. Vargant üzerindeki temel 18 | box'lar elle ayarlanabilir, veya daha önceden kurulu bir vargant box'ınız varsa 19 | bunu yapmak için [Puppet][puppet] veya [Chef][chef] gibi "provisioning" 20 | yazılımları kullanabilirsiniz. 21 | 22 | Provisioning, birbirleri ile özdeş birden fazla box kurulurken ve gerektiğinde 23 | silinirken, tekrarlanacak olan bir çok kurulum karmaşasından korunmak için 24 | güzel bir yöntemdir. Bir box'ı silebilir ve hiçbir manuel yöntem kullanmadan 25 | tekrar oluşturabilirsiniz. Bu güzel ve sorunsuz bir kurulumu size sağlar. 26 | 27 | Vargant, projenizi local sunucunuz ve oluşturduğunuz sanal makine ile 28 | paylaşmanız için paylaşımlı bir klasör oluşturur. Bunun yararı, siz 29 | local sunucunuzda kodlarınızı yazarken, projenizin sanal sunucunuzda 30 | çalışmasına imkan tanımasıdır. 31 | 32 | Bunu ufak bir örnekle açıklayalım. Farzedelim ki siz Windows tabanlı sunucunuzda 33 | kendi IDE veya Text editörünüzü kullanarak bir proje geliştiriyorsunuz. PHP, 34 | MySQL gibi araçlar ise linux sanal sunucunuzda kurulu. Proje klasörünüzü 35 | Vagrant'ın paylaşım klasörü olarak ayarlarsanız, windows ortamında geliştirmeye 36 | devam edip, çalıştırma işlemini sanal sunucu üzerinde yapabilirsiniz. O klasör 37 | iki yönlü ve senkron olarak çalışacaktır. 38 | 39 | ### Birazcık Yardım 40 | 41 | Eğer Vagrant'a başlamak için küçük bir yardım istiyorsanız, üç tane servis 42 | sizin için yardımcı olabilir: 43 | 44 | - [Rove][rove]: Bu servis size PHP'nin de aralarında olduğu dada önceden 45 | oluşturulmuş Vagrant yapıları sunar. Provizyon şef ile yapılır. 46 | - [Puphpet][puphpet]: PHp geliştirmelerine sanal makine kurmak için basit bir 47 | arayüzdür. **Ağırlıklı olarak PHP'ye odaklanır.** Yerel makinelerin yanında, 48 | bulutda yayınlamak içinde kullanabilirsiniz. Provizyon Puppet ile yapılır. 49 | - [Protobox][protobox]: is a layer on top of vagrant and a web GUI to setup 50 | virtual machines for web development. A single YAML document controls 51 | everything that is installed on the virtual machine. 52 | 53 | 54 | [vagrant]: http://vagrantup.com/ 55 | [puppet]: http://www.puppetlabs.com/ 56 | [chef]: http://www.opscode.com/ 57 | [rove]: http://rove.io/ 58 | [puphpet]: https://puphpet.com/ 59 | [protobox]: http://getprotobox.com/ -------------------------------------------------------------------------------- /_posts/05-03-01-Date-and-Time.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tarih ve Saat 3 | isChild: true 4 | anchor: tarih_ve_saat 5 | --- 6 | 7 | ## Tarih ve Saat {#tarih_ve_saat_title} 8 | 9 | PHP'de `DateTime` isimli bir sınıf bulunmaktadır ve tarih zamanla ilgili okuma, 10 | yazma, karşılaştırma veya hesaplama gibi işlerinizde yardımcı olmaktadır. PHP 11 | içerisinde tarih ve saat ile ilgili bir çok fonksiyon bulunmaktadır, ama 12 | `DateTime` sınıfı genel kullanım için nesne tabanlı güzel bir arayüz sunmaktadır. 13 | DateTime sınıfı zaman dilimlerini(time zones) işleyebilir ancak bu durumda kısa 14 | girişin dışına çıkmış oluruz. 15 | 16 | İlk olarak `createFromFormat()` fonksiyonu ile işlenmemiş bir tarih saat 17 | metnini(string) çevirelim ve onu ekranda gösterelim. `format()` fonksiyonu 18 | DateTime nesnesini tekrar metne çevirmek için kullanılır. 19 | 20 | {% highlight php %} 21 | format('Y-m-d') . "\n"; 26 | {% endhighlight %} 27 | 28 | DateTime ile hesaplamalar DateInterval sınıfı ile mümkünüdür. DateTime sınıfının 29 | `add()` ve `sub()` fonksiyonları DateInterval sınıfını parametre olarak alır. 30 | DateInterval kullanmak yerine, tarih ve saat işlemleriyle kendinizi yormayın. 31 | Gün ışığından yararlanma ve zaman dilimi değişiklikleri zaman hesaplamalarında 32 | umduğumuzdan daha karışık sorunlar ortaya çıkarır. Zaman farkını hesaplamak için 33 | `diff()` fonksiyonunu kullanabilirsiniz. Bu fonksiyon yeni bir DateInterval 34 | nesnesi döndürecektir. 35 | 36 | {% highlight php %} 37 | add(new DateInterval('P1M6D')); 41 | 42 | $diff = $end->diff($start); 43 | echo 'Fark: ' . $diff->format('%m ay, %d gün (toplam: %a days)') . "\n"; 44 | // Fark: 1 ay, 6 gün (toplam: 37 days) 45 | {% endhighlight %} 46 | 47 | DateTime nesnesi ile standart karşılaştırma yöntemlerini kullanabilirsiniz: 48 | 49 | {% highlight php %} 50 | format('Y-m-d') . ' '; 69 | } 70 | {% endhighlight %} 71 | 72 | * [DateTime hakkında][datetime] 73 | * [Tarih Formatlama hakkında][dateformat] (kabul edilen tarih formatı seçenekleri) 74 | 75 | [datetime]: http://php.net/book.datetime 76 | [dateformat]: http://php.net/function.date 77 | -------------------------------------------------------------------------------- /_posts/04-03-01-PEAR.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: PEAR 3 | isChild: true 4 | anchor: pear 5 | --- 6 | 7 | ## PEAR {#pear_title} 8 | 9 | [PEAR][1] diğer bir paket yöneticisidir. Composer ile, bir kaç önemli fark dışında, hemen hemen aynıdır. 10 | 11 | PEAR her bir paket kendi içerisinde özel bir yapısı olmasını gerektirir. Bunun anlamı paketi yazan 12 | geliştiricinin bunu hazırlaması gerekmektedir. Eğer hazırlanmamış ise PEAR 13 | 14 | PEAR kurulumu geneldir. Bunun anlamı paketi bir kez kurduğunuzda kurulum yaptığınız sunucu üzerindeki 15 | bütün projelerinizde kullanabilirsiniz. Bu bir çok projenin aynı sürüm paketleri kullandığı durumlarda iyi 16 | olabilir. Ancak iki projede sürüm sıkıntılarından dolayı probleme yol açabilir. 17 | 18 | ### PEAR Nasıl Kurulur 19 | 20 | `phar` kurulumunu indirip onu çalıştırırarak kurabilirsiniz. [kurulum adımları][2] PEAR dökümantasyonunda 21 | her bir işletim sistemi için detaylı bir şekilde bulunmaktadır. 22 | 23 | Eğer Linux kullanıyorsanız, dağıtımınızın paket yöneticisine bakabilirsiniz. Örneğin Debian ve Ubuntu'da 24 | ``php-pear`` paket olarak bulunmaktadır. 25 | 26 | ### Bir Paket Nasıl Kurulur 27 | 28 | Eğer [PEAR paket listesinde][3] listelenmiş bir paket ise, aşağıdaki gibi kurabilirsiniz: 29 | 30 | {% highlight console %} 31 | pear install foo 32 | {% endhighlight %} 33 | 34 | Eğer paket farklı bir yrede barındırılıyor ise, öncelikle nereden yayınlandığını araştırmalısınız. Daha fazla 35 | bilgi için "[Using channel docs][4]" adresini kontrol edin. 36 | 37 | * [PEAR hakkında][1] 38 | 39 | ### Composer ile PEAR'ı İdare Etmek 40 | 41 | [Composer][5] kullanırken bir yandan da PEAR kodlarınıda yüklemek isterseniz Composer ile bunu yapabilirsiniz. Aşağıdaki satırlar `pear2.php.net` adresinden yükleme yapmak için örnektir: 42 | 43 | {% highlight json %} 44 | { 45 | "repositories": [ 46 | { 47 | "type": "pear", 48 | "url": "http://pear2.php.net" 49 | } 50 | ], 51 | "require": { 52 | "pear-pear2/PEAR2_Text_Markdown": "*", 53 | "pear-pear2/PEAR2_HTTP_Request": "*" 54 | } 55 | } 56 | {% endhighlight %} 57 | 58 | İlk bölüm olan `"repositories"` pear depolarını "initialise" ediyoruz. İkinci kısım olan require kısmında ise paketleri aşağıdaki gibi yazıyoruz: 59 | 60 | > pear-channel/Package 61 | 62 | bir pear kanalı diğer bir paket ile aynı isimde olabileceğinden dolayı, "pear" öneki çakışmaları önlemek için zorunludur. 63 | 64 | BU kod çalıştırıldıktan sonra paketin Composer autoloader'i aşağıdaki gibi olacaktır: 65 | 66 | > vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php 67 | 68 | Aşağıdaki gibi kullanabilirsiniz: 69 | 70 | {% highlight php %} 71 | adapter = $adapter; 42 | } 43 | } 44 | 45 | interface AdapterInterface {} 46 | 47 | class MysqlAdapter implements AdapterInterface {} 48 | {% endhighlight %} 49 | 50 | There are several benefits to the `Database` class now depending on an interface rather than a concretion. 51 | 52 | Consider that you are working in a team and the adapter is being worked on by a colleague. In our first example, we would have 53 | to wait for said colleague to finish the adapter before we could properly mock it for our unit tests. Now that the dependency 54 | is an interface/contract we can happily mock that interface knowing that our colleague will build the adapter based on that contract. 55 | 56 | An even bigger benefit to this method is that our code is now much more scalable. If a year down the line we decide that we 57 | want to migrate to a different type of database, we can write an adapter that implements the original interface and inject that instead, 58 | no more refactoring would be required as we can ensure that the adapter follows the contract set by the interface. 59 | -------------------------------------------------------------------------------- /styles/base/buttons.less: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Settings 3 | ========================================================================== */ 4 | 5 | @import 'variables.less'; 6 | 7 | /* 8 | @baseline: @baseline; 9 | @button-color: @button-color; 10 | @button-primary-color: @button-primary-color; 11 | @button-info-color: @button-info-color; 12 | @button-success-color: @button-success-color; 13 | @button-warning-color: @button-warning-color; 14 | @button-danger-color: @button-danger-color; 15 | */ 16 | 17 | /* ========================================================================== 18 | Default 19 | ========================================================================== */ 20 | 21 | .btn{ 22 | .btn-s; 23 | background-clip: border-box !important; 24 | background-repeat: repeat-x; 25 | border: 1px solid rgba(0, 0, 0, 0.25); 26 | .border-box; 27 | .border-radius(4px); 28 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 29 | cursor: pointer; 30 | display: inline-block; 31 | .gradient(@button-color, lighten(@button-color, 10%), @button-color); 32 | .phh; 33 | .pvn; 34 | .transition(background-position linear 0.1s); 35 | vertical-align: middle; 36 | color: #333; 37 | font-family: @body-font-family; 38 | text-decoration: none !important; 39 | text-shadow: rgba(255,255,255,0.75) 0 1px 0; 40 | 41 | &:hover{ 42 | background-position: 0 -15px; 43 | } 44 | } 45 | 46 | /* ========================================================================== 47 | Styles 48 | ========================================================================== */ 49 | 50 | .btn-primary, 51 | .btn-info, 52 | .btn-success, 53 | .btn-warning, 54 | .btn-danger{ 55 | color: #FFF !important; 56 | text-shadow: rgba(0,0,0,0.25) 0 -1px 0 !important; 57 | } 58 | .btn-primary{ 59 | .btn; 60 | .gradient(@button-primary-color, lighten(@button-primary-color, 10%), @button-primary-color); 61 | } 62 | .btn-info{ 63 | .btn; 64 | .gradient(@button-info-color, lighten(@button-info-color, 10%), @button-info-color); 65 | } 66 | .btn-success{ 67 | .btn; 68 | .gradient(@button-success-color, lighten(@button-success-color, 10%), @button-success-color); 69 | } 70 | .btn-warning{ 71 | .btn; 72 | .gradient(@button-warning-color, lighten(@button-warning-color, 10%), @button-warning-color); 73 | } 74 | .btn-danger{ 75 | .btn; 76 | .gradient(@button-danger-color, lighten(@button-danger-color, 10%), @button-danger-color); 77 | } 78 | 79 | /* ========================================================================== 80 | Sizes (Half = h, Single = s, Double = d) 81 | ========================================================================== */ 82 | 83 | .btn-h, .btn-half{ 84 | height: @baseline; 85 | font-size: @baseline * 0.6; 86 | line-height: @baseline; 87 | } 88 | .btn-s, .btn-single{ 89 | height: @baseline * 1.5; 90 | font-size: @baseline * 0.75; 91 | line-height: @baseline * 1.5; 92 | } 93 | .btn-d, .btn-double{ 94 | height: @baseline * 2; 95 | font-size: @baseline; 96 | line-height: @baseline * 2; 97 | } -------------------------------------------------------------------------------- /scripts/setup.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | // Load contributors 3 | var $contributors = $('#contributors'); 4 | if ($contributors.length) { 5 | var fail = function() { 6 | $contributors.html('

This project would not be possible without the help of our amazing contributors on GitHub.

'); 7 | }; 8 | $.ajax({ 9 | cache: false, 10 | dataType: 'jsonp', 11 | timeout: 3000, 12 | type: 'GET', 13 | url: 'https://api.github.com/repos/codeguy/php-the-right-way/contributors?per_page=100' 14 | }).done(function(data) { 15 | if (data.data && data.data.length) { 16 | var $ul = $(''), 17 | dataLength = data.data.length; 18 | for (var i = 0; i < dataLength; i++) { 19 | $ul.append(['
  • ', data.data[i].login, '
  • '].join('')); 20 | } 21 | $contributors.html($ul); 22 | } else { 23 | fail(); 24 | } 25 | }).fail(fail); 26 | } 27 | })(jQuery); 28 | 29 | (function($) { 30 | //Add current view's highlighting to the navigation 31 | 32 | /** helper for highlighting */ 33 | function highlightNav(navLinks, id) { 34 | navLinks.filter('[href="/php-the-right-way/#' + id + '"]').addClass("active"); 35 | } 36 | 37 | $(window).scroll(function() { 38 | //console.log("They see me scrollin, they hatin"); 39 | 40 | //clear highlighting 41 | var navLinks = $('.site-navigation a'); 42 | navLinks.removeClass("active"); 43 | 44 | //calc current viewport 45 | var viewTop = $(window).scrollTop(); 46 | var viewBottom = viewTop + $(window).height(); 47 | 48 | //for all h1 and h2 elements, check if they are visible 49 | //performance tweak: stop each() after the first element is found to be behind view 50 | var previous = ""; 51 | var foundOne = false; 52 | var fallback = ""; 53 | $('h1, h2').each(function(i, e) { 54 | //get element position; 55 | var eTop = $(e).offset().top; 56 | var eBottom = eTop + $(e).height(); 57 | var id = e.id; 58 | id = id.replace("_title", ""); 59 | 60 | if (eTop >= viewTop) { 61 | //if we are passed the view and no heading was highlighted yet, store previous one as fallback 62 | if (!foundOne) { 63 | fallback = previous; 64 | } 65 | if (eBottom <= viewBottom) { 66 | highlightNav(navLinks, id); 67 | foundOne = true; 68 | } else { 69 | return false; //break the each(), the rest is below 70 | } 71 | } 72 | previous = id; 73 | }); 74 | //no h1/h2 is in the viewport, so highlight the last one above 75 | if (!foundOne) { 76 | highlightNav(navLinks, fallback); 77 | } 78 | }); 79 | })(jQuery); -------------------------------------------------------------------------------- /styles/base/spacing.less: -------------------------------------------------------------------------------- 1 | /** 2 | * Spacing 3 | * 4 | * This LESS file defines margins and paddings for block-level 5 | * elements. Helper classes are included for use elsewhere 6 | * in site styles. 7 | */ 8 | 9 | /* Settings */ 10 | 11 | @import 'variables.less'; 12 | 13 | /* 14 | @baseline: @baseline; 15 | */ 16 | 17 | /** 18 | * Spacing 19 | * p, m, lh = padding, margin, line-height 20 | * a, t, r, b, l, h, v = all, top, right, bottom, left, horizontal, vertical 21 | * n, h, s, d = none(0px), half(@baseline / 2), single(@baseline), double(@baseline * 2), none(0px) 22 | */ 23 | 24 | .ptn, .pvn, .pan{ 25 | padding-top: 0px !important 26 | } 27 | .pth, .pvh, .pah{ 28 | padding-top: @baseline / 2 !important 29 | } 30 | .pts, .pvs, .pas{ 31 | padding-top: @baseline !important 32 | } 33 | .ptd, .pvd, .pad{ 34 | padding-top: @baseline * 2 !important 35 | } 36 | .prn, .phn, .pan{ 37 | padding-right: 0px !important 38 | } 39 | .prh, .phh, .pah{ 40 | padding-right: @baseline / 2 !important 41 | } 42 | .prs, .phs, .pas{ 43 | padding-right: @baseline !important 44 | } 45 | .prd, .phd, .pad{ 46 | padding-right: @baseline * 2 !important 47 | } 48 | .pbn, .pvn, .pan{ 49 | padding-bottom: 0px !important 50 | } 51 | .pbh, .pvh, .pah{ 52 | padding-bottom: @baseline / 2 !important 53 | } 54 | .pbs, .pvs, .pas{ 55 | padding-bottom: @baseline !important 56 | } 57 | .pbd, .pvd, .pad{ 58 | padding-bottom: @baseline * 2 !important 59 | } 60 | .pln, .phn, .pan{ 61 | padding-left: 0px !important 62 | } 63 | .plh, .phh, .pah{ 64 | padding-left: @baseline / 2 !important 65 | } 66 | .pls, .phs, .pas{ 67 | padding-left: @baseline !important 68 | } 69 | .pld, .phd, .pad{ 70 | padding-left: @baseline * 2 !important 71 | } 72 | .mtn, .mvn, .man{ 73 | margin-top: 0px !important 74 | } 75 | .mth, .mvh, .mah{ 76 | margin-top: @baseline / 2 !important 77 | } 78 | .mts, .mvs, .mas{ 79 | margin-top: @baseline !important 80 | } 81 | .mtd, .mvd, .mad{ 82 | margin-top: @baseline * 2 !important 83 | } 84 | .mrn, .mhn, .man{ 85 | margin-right: 0px !important 86 | } 87 | .mrh, .mhh, .mah{ 88 | margin-right: @baseline / 2 !important 89 | } 90 | .mrs, .mhs, .mas{ 91 | margin-right: @baseline !important 92 | } 93 | .mrd, .mhd, .mad{ 94 | margin-right: @baseline * 2 !important 95 | } 96 | .mbn, .mvn, .man{ 97 | margin-bottom: 0px !important 98 | } 99 | .mbh, .mvh, .mah{ 100 | margin-bottom: @baseline / 2 !important 101 | } 102 | .mbs, .mvs, .mas{ 103 | margin-bottom: @baseline !important 104 | } 105 | .mbd, .mvd, .mad{ 106 | margin-bottom: @baseline * 2 !important 107 | } 108 | .mln, .mhn, .man{ 109 | margin-left: 0px !important 110 | } 111 | .mlh, .mhh, .mah{ 112 | margin-left: @baseline / 2 !important 113 | } 114 | .mls, .mhs, .mas{ 115 | margin-left: @baseline !important 116 | } 117 | .mld, .mhd, .mad{ 118 | margin-left: @baseline * 2 !important 119 | } 120 | .lhh { 121 | line-height: @baseline / 2 !important; 122 | } 123 | .lhs { 124 | line-height: @baseline !important; 125 | } 126 | .lhd { 127 | line-height: @baseline * 2 !important; 128 | } 129 | .lhn { 130 | line-height: 0px !important; 131 | } -------------------------------------------------------------------------------- /banners.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Afişler 4 | description: "Çevrene yay! Bu afişleri kullanarak PHP geliştiricilerinin _PHP: Usulüne Uygun_ projesini farketmelerini sağla." 5 | --- 6 | 7 | # Afişler 8 | 9 | _PHP: Usulüne Uygun_ afişlerini kullanarak belgeyi yayın! Yeni kullanıcıların doğru bilgiye ulaşmasını sağlayın. 10 | 11 | ## Düğme 1 (120x90) 12 | 13 |

    PHP: Usulüne Uygun

    14 | 15 | {% highlight html %} 16 | 17 | PHP: Usulüne Uygun 18 | 19 | {% endhighlight %} 20 | 21 | ## Düğme 2 (120x60) 22 | 23 |

    PHP: Usulüne Uygun

    24 | 25 | {% highlight html %} 26 | 27 | PHP: Usulüne Uygun 28 | 29 | {% endhighlight %} 30 | 31 | ## Geniş Dikdörtgen (728x90) 32 | 33 |

    PHP: Usulüne Uygun

    34 | 35 | {% highlight html %} 36 | 37 | PHP: Usulüne Uygun 38 | 39 | {% endhighlight %} 40 | 41 | ## Büyük Dikdörtgen (386x280) 42 | 43 |

    PHP: Usulüne Uygun

    44 | 45 | {% highlight html %} 46 | 47 | PHP: Usulüne Uygun 48 | 49 | {% endhighlight %} 50 | 51 | ## Orta Dikdörtgen (300x250) 52 | 53 |

    PHP: Usulüne Uygun

    54 | 55 | {% highlight html %} 56 | 57 | PHP: Usulüne Uygun 58 | 59 | {% endhighlight %} 60 | 61 | ## Dikdörtgen (180x150) 62 | 63 |

    PHP: Usulüne Uygun

    64 | 65 | {% highlight html %} 66 | 67 | PHP: Usulüne Uygun 68 | 69 | {% endhighlight %} 70 | 71 | ## Kare Düğme (125x125) 72 | 73 |

    PHP: Usulüne Uygun

    74 | 75 | {% highlight html %} 76 | 77 | PHP: Usulüne Uygun 78 | 79 | {% endhighlight %} 80 | 81 | ## Dikey Dikdörtgen (240x400) 82 | 83 |

    PHP: Usulüne Uygun

    84 | 85 | {% highlight html %} 86 | 87 | PHP: Usulüne Uygun 88 | 89 | {% endhighlight %} 90 | -------------------------------------------------------------------------------- /_posts/15-02-01-PHPDoc.md: -------------------------------------------------------------------------------- 1 | --- 2 | anchor: phpdoc 3 | --- 4 | 5 | # PHPDoc {#phpdoc} 6 | 7 | PHPDoc is an informal standard for commenting PHP code. There are a *lot* of different [tags](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/index.html) available. The full list of tags and examples can be found at the [PHPDoc manual](http://www.phpdoc.org/docs/latest/index.html). 8 | 9 | Below is an example of how you might document a class with a few methods; 10 | 11 | {% highlight php %} 12 | 15 | * @link http://www.phpdoc.org/docs/latest/index.html 16 | * @package helper 17 | */ 18 | class DateTimeHelper 19 | { 20 | /** 21 | * @param mixed $anything Anything that we can convert to a \DateTime object 22 | * 23 | * @return \DateTime 24 | * @throws \InvalidArgumentException 25 | */ 26 | public function dateTimeFromAnything($anything) 27 | { 28 | $type = gettype($anything); 29 | 30 | switch ($type) { 31 | // Some code that tries to return a \DateTime object 32 | } 33 | 34 | throw new \InvalidArgumentException( 35 | "Failed Converting param of type '{$type}' to DateTime object" 36 | ); 37 | } 38 | 39 | /** 40 | * @param mixed $date Anything that we can convert to a \DateTime object 41 | * 42 | * @return void 43 | */ 44 | public function printISO8601Date($date) 45 | { 46 | echo $this->dateTimeFromAnything($date)->format('c'); 47 | } 48 | 49 | /** 50 | * @param mixed $date Anything that we can convert to a \DateTime object 51 | */ 52 | public function printRFC2822Date($date) 53 | { 54 | echo $this->dateTimeFromAnything($date)->format('r'); 55 | } 56 | } 57 | {% endhighlight %} 58 | 59 | The documentation for the class as a whole firstly has the [@author](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/author.html) tag, this tag is used to document the author of the code and can be repeated for documenting several authors. Secondly is the [@link](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/link.html) tag, used to link to a website indicating a relationship between the website and the code. Thirdly it has the [@package](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/package.html) tag, used to categorize the code. 60 | 61 | Inside the class, the first method has an [@param](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/param.html) tag documenting the type, name and description of the parameter being passed to the method. Additionally it has the [@return](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/return.html) and [@throws](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/throws.html) tags for documenting the return type, and any exceptions that could be throw respectively. 62 | 63 | The second and third methods are very similar and have a single [@param](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/param.html) tag as did the first method. The import difference between the second and third method is doc block is the inclusion/exclusion of the [@return](http://www.phpdoc.org/docs/latest/references/phpdoc/tags/return.html) tag. `@return void` explicitly informs us that there is no return, historically omitting the `@return void` statement also results in the same (no return) action. 64 | -------------------------------------------------------------------------------- /_posts/09-03-01-Exceptions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: İstisnalar (Exceptions) 3 | isChild: true 4 | anchor: istisnalar_exceptions 5 | --- 6 | 7 | ## İstisnalar (Exceptions) {#istisnalar_exceptions_title} 8 | 9 | İstisnalar bir çok programlama dilinin en popüler kısmıdır, ama genellikle PHP geliştiriciler için gözden kaçmıştır. 10 | Ruby gibi dillerde İstisnalar ağır derecede vardır, HTTP isteği hata vermesi, veya veritabanı sorgusu yanlış olduğunda, veya 11 | resim bulunamadığında bile Ruby ekrana bir istisna tetikleyecektir. 12 | 13 | PHP'nin kendisi bu konuda oldukça gevşektir, ve `file_get_contents()` çağrısı genellikle bir `FALSE` dönder ve bir uyarı gösterir. 14 | Codeigniter gibi bir çok eski PHP çatılarında sadece `false` dönecektir, hata mesajlarına ekleyecektir ve hatayı 15 | `$this->upload->get_error()` bu gibi yöntemleri kullanarak görebilirsiniz. Buradaki problem, hatanın son derece bariz olması yerine 16 | hatanın yerine bakmak ve hangi metotta olduğunu bulmak için dökümanlarına bakmak zorunda olmaktadır. 17 | 18 | Diğer bir problem, sınıflar otomatik olarak bir hata fırlattıklarında ve işlemden çıkıldığındadır. 19 | 20 | 21 | When you do this you stop another developer from being able to dynamically handle that error. Exceptions should be thrown to make a developer aware 22 | of an error, then they can choose how to handle this. E.g: 23 | 24 | {% highlight php %} 25 | subject('My Subject'); 28 | $email->body('How the heck are you?'); 29 | $email->to('guy@example.com', 'Some Guy'); 30 | 31 | try 32 | { 33 | $email->send(); 34 | } 35 | catch(Fuel\Email\ValidationFailedException $e) 36 | { 37 | // The validation failed 38 | } 39 | catch(Fuel\Email\SendingFailedException $e) 40 | { 41 | // The driver could not send the email 42 | } 43 | finally 44 | { 45 | // Executed regardless of whether an exception has been thrown, and before normal execution resumes 46 | } 47 | 48 | {% endhighlight %} 49 | 50 | ### SPL İstisnalar 51 | 52 | Genel `Exception` sınıfı geliştiriciler için çok az ayıklama kaynağı sağlayabilir. Ancak, buna çare olarak, varsayılan `Exception` 53 | sınıfını kapsayan özelliştirilmiş bir `Exception` sınıfı oluşturabilirsiniz: 54 | 55 | {% highlight php %} 56 | query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- Saldırıya açık bir sorgu! 25 | {% endhighlight %} 26 | 27 | Yukarıdaki kötü bir koddur. Kolaylıkla farkedilebilir ve kullanılabilir bir 28 | koddur. Kötü niyetli bir kişi `id` parametresinde sayı yerine 29 | `http://domain.com/?id=1%3BDELETE+FROM+users` gibi bir sorgu gönderebilir. Bu 30 | `$_GET['id']` değişkenine `1;DELETE FROM users` değerini atayacaktır ve bütün 31 | kullanıcılarınızı silecektir. Siz bunu PDO bağlı parameter ile girdiyi 32 | temizlemelisiniz. 33 | 34 | {% highlight php %} 35 | prepare('SELECT name FROM users WHERE id = :id'); 38 | $stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // <-- PDO tarafından sterilize edildi 39 | $stmt->execute(); 40 | {% endhighlight %} 41 | 42 | Bu doğru bir koddur. Bu bir PDO deyiminde bağlı parametreleri kullanıyor ve 43 | yabancı girdilerden gelecek zararları engelliyor. 44 | 45 | * [PDO hakkında][1] 46 | 47 | Veritabanı bağlantısı kapatılmadığında kaynaklarınız bir süre sonra tükenecektir. 48 | Bunu PDO kullanarak önleyebilirsiniz. PDO sayesinde bağlantı nesnesi silinirken 49 | bağlantı kapatılır ve bütün referansları silinir veya NULL'a eşitlenir. Bunu 50 | yapmazsanız kalıcı bir bağlantı kullanmadığınız sürece kodunuz bittiğinde PHP 51 | tabiki bağlantıları otomatik olarak kapatacaktır. 52 | 53 | * [PDO bağlantıları hakkında][5] 54 | 55 | ## Sayutlama Katmanı (Abstraction Layers) 56 | 57 | Birçok çatı PDO üzerine kurulmuş kendi soyutlanmış katmanını barındırmaktadır. 58 | Bunlar genellikle bir veritabanı sisteminin özelliklerini barındırmaktadır. 59 | Bazı durumlarda yetersiz kalsada uygulamanızın taşınabilir olması için bu gibi 60 | katmanlar güzel olabilir. (!) 61 | 62 | Aşağıda uygulamalarınızda kullanabileceğiniz [PSR-0][psr0] veya [PSR-4][psr4] 63 | standardında bir kaç örnek bulunmaktadır: 64 | 65 | * [Aura SQL][6] 66 | * [Doctrine2 DBAL][2] 67 | * [Propel][7] 68 | * [ZF2 Db][4] 69 | * [ZF1 Db][3] 70 | 71 | [1]: http://www.php.net/manual/tr/book.pdo.php 72 | [2]: http://www.doctrine-project.org/projects/dbal.html 73 | [3]: http://framework.zend.com/manual/en/zend.db.html 74 | [4]: http://packages.zendframework.com/docs/latest/manual/en/index.html#zend-db 75 | [5]: http://php.net/manual/tr/pdo.connections.php 76 | [6]: https://github.com/auraphp/Aura.Sql 77 | [7]: http://propelorm.org/Propel/ 78 | 79 | [psr0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 80 | [psr4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md -------------------------------------------------------------------------------- /_posts/10-04-01-Data-Filtering.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Veri Süzme 3 | isChild: true 4 | anchor: veri_suzme 5 | --- 6 | 7 | ## Veri Süzme {#veri_suzme_title} 8 | 9 | Yabancı bir girdiye kesinlikle güvenmeyin. Yabancı girdiden gelen veriyi kesinlikle temizleyin ve onaylayın (validate). 10 | `filter_var` ve `filter_input` fonksiyonları metni temizler ve onaylar (validate). (e-posta adresi vs.) 11 | 12 | Yabancı girdi herşey olabilir: `$_GET` ve `$_POST` ile gelen veriler, bazı `$_SERVER` değerlerinde ve 13 | `fopen('php://input', 'r')` aracılığıyla gelen HTTP isteklerinde gibi. Yabancı girdiler sadece kullanıcı form verileri ile 14 | sınırlandırılmamalı. Dosya yükleme ve indirmeler, oturum verileri, çerez verileri ve sisteminiz dışından aldığınız web 15 | servislerinden gelen verilerde yabancı girdidir. 16 | 17 | Yabancı veriler saklanabilir, birleştirilebilir ve daha sonra erişilebilir, ancak o halen yabancı bir girdidir. 18 | Her işleminizde çıktı verdiğinizde, birleştirmenizde veya kodunuzun içine kattığınızda kendinize "Veri güvenli mi?" sorusunu 19 | tekrar tekrar sorun. 20 | 21 | Veri amacına göre farklı şekillerde süzülebilir. Örneğin, Süzgeçten geçirilmemiş bir yabancı girdi, HTMl içerisinde 22 | kullanılabilir ve bir javascript kodunu çalıştırabilir. Bu `Cross-Site Scripting (XSS)` olarak bilinir ve çok tehlikeli 23 | bir ataktır. Bunu önlemenin bir yolu vardır. Kullanıcı tarafından oluşturulan bütün girdilerdeki HTML kodlarını 24 | `strip_tags` fonksiyonu ile silmektir veya `htmlentities`, `htmlspecialchars` fonksiyonları ile HTML özel karakterleri kaçış 25 | karakterleri ile değiştirmektir. 26 | 27 | Diğer bir örnek komut satırına parametre göndermektir. Bu genellikle tehlikelidir. Ancak kullanılacaksa `escapeshellarg` 28 | fonskiyonu ile parametreleri temizleyebilirsiniz. 29 | 30 | Son bir örnek ise, yabancı girdiyi dosya sisteminde bir dosyayı load etmek için kullandığımızı düşünelim. Burada bir açık oluşabilir. 31 | Burada "/", "../", [null bytes][6], veya diğer karakterleri girdiden gelen dosya adından silmeniz gerekebilir. Aksi durumda gizli, 32 | özel veya hassas dosyalara ulaşılabilir. 33 | 34 | * [Veri Süzme hakkında][1] 35 | * [`filter_var` hakkında][4] 36 | * [`filter_input` hakkında][5] 37 | * [null byte ile başa çıkma hakkında][6] 38 | 39 | ### Sterilize Etmek (Sanitization) 40 | 41 | Sterilize etmek kural dışı ve güvenli olmayan karakterlerin yabancı girdilerden silinmesi demektir. 42 | 43 | Örneğin, yabancı girdileri HTML içerisine ya da SQL sorgusuna göndermeden önce sterilize etmelisiniz. 44 | Eğer parametreleri gönderirken [PDO](#veritabanlari) kullanırsanız, o sizin için girdileri sterilize edecektir. 45 | 46 | Bazen HTML sayfalarında sadece bazı güvenli tagların kullanılması gerekmektedir. Bu çoğu zaman çok zor bir iştir. 47 | Bunu önlemek için Markdown veya BBCode gibi kısıtlı biçimlendiriciler kullanılır. Bu nedenle [HTML Purifier][html-purifier] 48 | gibi kütüphaneler mevcuttur. 49 | 50 | [Sterilize Etme Filtreleri][2] 51 | 52 | ### Doğrulama 53 | 54 | Doğrulama yabancı girdiler için ön bir eleme sağlar. Örneğin, bir kayıt işlemi sırasında bir e-posta adresini, 55 | bir telefonu ya da yaşı doğrulamak isteyebilirsiniz. 56 | 57 | 58 | [Doğrulama Süzgeçleri][3] 59 | 60 | [1]: http://www.php.net/manual/tr/book.filter.php 61 | [2]: http://www.php.net/manual/tr/filter.filters.sanitize.php 62 | [3]: http://www.php.net/manual/tr/filter.filters.validate.php 63 | [4]: http://php.net/manual/tr/function.filter-var.php 64 | [5]: http://www.php.net/manual/tr/function.filter-input.php 65 | [6]: http://php.net/manual/tr/security.filesystem.nullbytes.php 66 | [html-purifier]: http://htmlpurifier.org/ 67 | -------------------------------------------------------------------------------- /_posts/07-04-01-Interacting-via-Code.md: -------------------------------------------------------------------------------- 1 | --- 2 | isChild: true 3 | title: Interacting with Databases 4 | anchor: veritabani_ile_etkilesim 5 | --- 6 | 7 | ## Veritabanı ile etkilesim {#veritabani_ile_etkilesim_title} 8 | 9 | Geliştiriciler PHP öğrenmeye başladıkları zaman, genellikle kendi yöntemleri ile 10 | bunu yapmaktadırlar ve kodları şu şekilde görünür: 11 | 12 | {% highlight php %} 13 | 19 | {% endhighlight %} 20 | 21 | Bu kötü bir yöntemdir, ana olarak test edilmesi, debug edilmesi ve okunması 22 | zordur ve eğer bir limit konulmaz ise bütün alanları dışarıya çıktı olarak 23 | verebilirsiniz. 24 | 25 | [OOP](#object-oriented-programming) ya da [functional programming](#functional-programming) 26 | seçimlerine göre bunu yapmanın bir çok farklı yolları vardır. 27 | 28 | En temel adımı düşünün: 29 | 30 | {% highlight php %} 31 | query('SELECT * FROM table'); 34 | } 35 | 36 | foreach (getAllFoos($db) as $row) { 37 | echo "
  • ".$row['field1']." - ".$row['field1']."
  • "; // BAD!! 38 | } 39 | {% endhighlight %} 40 | 41 | Bu iyi bir başlangıçtır. İki farklı kalemi iki arklı dosyaya koyun ve bazı 42 | temizlikler yapın. 43 | 44 | Bir sınıf oluşturun ve içerisine bazı methodlarınızı koyun ve artık bir 45 | "Model"iniz var. Basit bir `.php` dosyası oluşturun ve sunum logic'inizi bu 46 | dosyanın içerisine koyun ve bir "View" katmanı oluşturun. Neredeyse bir [MVC] 47 | oluşturdunuz ki bu OOP mimarisi neredeyse bir çok 48 | [framework](#frameworks_title)'de mevcut. 49 | 50 | 51 | **foo.php** 52 | 53 | {% highlight php %} 54 | getAllFoos(); 65 | 66 | // Show the view 67 | include 'views/foo-list.php'; 68 | {% endhighlight %} 69 | 70 | 71 | **models/FooModel.php** 72 | 73 | {% highlight php %} 74 | db = $db; 82 | } 83 | 84 | public function getAllFoos() { 85 | return $this->db->query('SELECT * FROM table'); 86 | } 87 | } 88 | {% endhighlight %} 89 | 90 | **views/foo-list.php** 91 | 92 | {% highlight php %} 93 | 94 | - 95 | 96 | {% endhighlight %} 97 | 98 | Bu aslında modern framework'lerin yaptıklarıyla aynı, sadece biraz daha manual 99 | yöntemler kullanılmaktadır. Tüm bu şeyleri her zaman yapanız gerekmez, ama çok 100 | fazla gösterim mantığı(presentation logic) ve veritabanı etkileşimi olan gerçek 101 | bir uygulama veya problem olabilir. Bu durumda bu katmanları farklı şekillerde 102 | kullanmak isteyebilirsiniz. Örneğin [unit-test](#unit-testing) için SQLite 103 | kullanırken uygulama için PostgreSQL kullanmanız gerekebilir. 104 | 105 | [PHPBridge] veritabanı ile etkileşim konsepti için [Creating a Data Class] olarak 106 | bilinen güzel bir kaynaktır. Göz atabilirsiniz. 107 | 108 | [MVC]: http://code.tutsplus.com/tutorials/mvc-for-noobs--net-10488 109 | [PHPBridge]: http://phpbridge.org/ 110 | [Creating a Data Class]: http://phpbridge.org/intro-to-php/creating_a_data_class -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (4.2.6) 5 | i18n (~> 0.7) 6 | json (~> 1.7, >= 1.7.7) 7 | minitest (~> 5.1) 8 | thread_safe (~> 0.3, >= 0.3.4) 9 | tzinfo (~> 1.1) 10 | addressable (2.4.0) 11 | coffee-script (2.4.1) 12 | coffee-script-source 13 | execjs 14 | coffee-script-source (1.10.0) 15 | colorator (0.1) 16 | ethon (0.9.0) 17 | ffi (>= 1.3.0) 18 | execjs (2.6.0) 19 | faraday (0.9.2) 20 | multipart-post (>= 1.2, < 3) 21 | ffi (1.9.10) 22 | gemoji (2.1.0) 23 | github-pages (79) 24 | github-pages-health-check (= 1.1.0) 25 | jekyll (= 3.1.5) 26 | jekyll-coffeescript (= 1.0.1) 27 | jekyll-feed (= 0.5.1) 28 | jekyll-gist (= 1.4.0) 29 | jekyll-github-metadata (= 1.11.1) 30 | jekyll-mentions (= 1.1.2) 31 | jekyll-paginate (= 1.1.0) 32 | jekyll-redirect-from (= 0.10.0) 33 | jekyll-sass-converter (= 1.3.0) 34 | jekyll-seo-tag (= 1.4.0) 35 | jekyll-sitemap (= 0.10.0) 36 | jemoji (= 0.6.2) 37 | kramdown (= 1.10.0) 38 | liquid (= 3.0.6) 39 | listen (= 3.0.6) 40 | mercenary (~> 0.3) 41 | rouge (= 1.10.1) 42 | terminal-table (~> 1.4) 43 | github-pages-health-check (1.1.0) 44 | addressable (~> 2.3) 45 | net-dns (~> 0.8) 46 | octokit (~> 4.0) 47 | public_suffix (~> 1.4) 48 | typhoeus (~> 0.7) 49 | html-pipeline (2.4.1) 50 | activesupport (>= 2, < 5) 51 | nokogiri (>= 1.4) 52 | i18n (0.7.0) 53 | jekyll (3.1.5) 54 | colorator (~> 0.1) 55 | jekyll-sass-converter (~> 1.0) 56 | jekyll-watch (~> 1.1) 57 | kramdown (~> 1.3) 58 | liquid (~> 3.0) 59 | mercenary (~> 0.3.3) 60 | rouge (~> 1.7) 61 | safe_yaml (~> 1.0) 62 | jekyll-coffeescript (1.0.1) 63 | coffee-script (~> 2.2) 64 | jekyll-feed (0.5.1) 65 | jekyll-gist (1.4.0) 66 | octokit (~> 4.2) 67 | jekyll-github-metadata (1.11.1) 68 | octokit (~> 4.0) 69 | jekyll-mentions (1.1.2) 70 | html-pipeline (~> 2.3) 71 | jekyll (~> 3.0) 72 | jekyll-paginate (1.1.0) 73 | jekyll-redirect-from (0.10.0) 74 | jekyll (>= 2.0) 75 | jekyll-sass-converter (1.3.0) 76 | sass (~> 3.2) 77 | jekyll-seo-tag (1.4.0) 78 | jekyll (~> 3.0) 79 | jekyll-sitemap (0.10.0) 80 | jekyll-watch (1.4.0) 81 | listen (~> 3.0, < 3.1) 82 | jemoji (0.6.2) 83 | gemoji (~> 2.0) 84 | html-pipeline (~> 2.2) 85 | jekyll (>= 3.0) 86 | json (1.8.3) 87 | kramdown (1.10.0) 88 | liquid (3.0.6) 89 | listen (3.0.6) 90 | rb-fsevent (>= 0.9.3) 91 | rb-inotify (>= 0.9.7) 92 | mercenary (0.3.6) 93 | mini_portile2 (2.0.0) 94 | minitest (5.9.0) 95 | multipart-post (2.0.0) 96 | net-dns (0.8.0) 97 | nokogiri (1.6.7.2) 98 | mini_portile2 (~> 2.0.0.rc2) 99 | octokit (4.3.0) 100 | sawyer (~> 0.7.0, >= 0.5.3) 101 | public_suffix (1.5.3) 102 | rb-fsevent (0.9.7) 103 | rb-inotify (0.9.7) 104 | ffi (>= 0.5.0) 105 | rouge (1.10.1) 106 | safe_yaml (1.0.4) 107 | sass (3.4.22) 108 | sawyer (0.7.0) 109 | addressable (>= 2.3.5, < 2.5) 110 | faraday (~> 0.8, < 0.10) 111 | terminal-table (1.5.2) 112 | thread_safe (0.3.5) 113 | typhoeus (0.8.0) 114 | ethon (>= 0.8.0) 115 | tzinfo (1.2.2) 116 | thread_safe (~> 0.1) 117 | 118 | PLATFORMS 119 | ruby 120 | 121 | DEPENDENCIES 122 | github-pages 123 | 124 | BUNDLED WITH 125 | 1.10.6 126 | -------------------------------------------------------------------------------- /_posts/03-02-01-Programming-Paradigms.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Programlama Yaklaşımları 3 | isChild: true 4 | anchor: programlama_yaklasimlari 5 | --- 6 | 7 | ## Programlama Yaklaşımları {#programlama_yaklasimlari_title} 8 | 9 | PHP çeşitli programlama tekniklerini destekleyen esnek ve dinamik bir dildir. 10 | Özellikle PHP 5.0 ile katı bir nesne tabanlı model eklenmiş (2004), PHP 5.3 de 11 | "anonymous functions" ve "namespaces" (2009) desteği gelmiş ve PHP 5.4'de "traits" 12 | özelliği eklenerek yıllar içerisinde PHP, nesne tabanlı programlama konusunda 13 | kendisini önemli ölçüde geliştirmiştir. 14 | 15 | ### Nesne Tabanlı (Nesneye Dayalı) Programlama 16 | 17 | PHP, nesne tabanlı programlamanın "class", "abstract class", "interfaces", 18 | "inheritance", "constructors", "cloning", "exception" özellikleri ve daha 19 | fazlasını içermektedir. 20 | 21 | * [Nesne tabanlı programlama hakkında][oop] 22 | * [Trait'ler hakkında][traits] 23 | 24 | ### Fonksiyonel Programlama 25 | 26 | PHP, bir fonskiyonun bir değişkene atandığı "first-class" fonksiyonu 27 | desteklemektedir. Kullanıcı tanımlı ve dahili fonksiyonların ikiside bir 28 | değişkene referans edilebilir ve dinamik olarak çağırılabilir. Fonksiyon bir 29 | diğer fonksiyona parametre olarak gönderilebilir (bu özellik "High-order 30 | functions olarak bilinir.") veya bir fonksiyondan geri döndürülebilir. 31 | 32 | Özyineleme (recursion), kendi kendini çağıran fonksiyon desteklenen bir 33 | özelliktir, ama bir çok PHP kodu iterasyona (iteration) odaklanmaktadır. 34 | 35 | Yeni anonim fonksiyonlar (closures) PHP 5.3 ile gelmiştir. (2009) 36 | 37 | PHP 5.4, closurelerin bir nesnenin scope'u içine bindlenmesi özelliğini getirmiş, 38 | ayrıca callable desteğini geliştirmiştir. Artık neredeyse callables ve closures 39 | neredeyse tüm durumlarda değişmeli olarak kullanılabilmektedir. 40 | 41 | * [PHP'de Fonksiyonel Programlama hakkında](/php-the-right-way/pages/Functional-Programming.html) 42 | * ["Anonymous Functions" hakkında][anonymous-functions] 43 | * ["Closure class" hakkında][closure-class] 44 | * ["Closures RFC" hakkında][closures-rfc] 45 | * ["Callables" hakkında][callables] 46 | * [`call_user_func_array()` ile dinamik olarak fonksiyon çağırmak hakkında][call-user-func-array] 47 | 48 | ### Meta Programlama 49 | 50 | PHP, Reflection API ve Sihirli Yöntemler (Magic Methods) gibi bazı meta 51 | programlama mekanizmalarını destekler. PHP'de `__get()`, `__set()`, 52 | `__clone()`, `__toString()` ve `__invoke()` gibi Sihirli Yöntemler bulunmaktadır. 53 | Bunlar geliştiriciye sınıfların davranışlarını değiştirmelerine izin verirler. 54 | Ruby geliştiricileri genellikle PHP'de `method_missing`in (Çağırılan methodun 55 | olmaması durumu) eksik olduğunu söylerler. Ancak PHP bunu `__call()` ve 56 | `__callStatic()` Sihirli Yöntemlerini kullanarak desteklemektedir. 57 | 58 | * [Sihirli yöntemler hakkında][magic-methods] 59 | * [Reflection hakkında][reflection] 60 | * [Overloading hakkında][overloading] 61 | 62 | [namespaces]: http://php.net/manual/tr/language.namespaces.php 63 | [overloading]: http://php.net/manual/tr/language.oop5.overloading.php 64 | [oop]: http://www.php.net/manual/tr/language.oop5.php 65 | [anonymous-functions]: http://www.php.net/manual/tr/functions.anonymous.php 66 | [closure-class]: http://php.net/manual/tr/class.closure.php 67 | [callables]: http://php.net/manual/tr/language.types.callable.php 68 | [magic-methods]: http://php.net/manual/tr/language.oop5.magic.php 69 | [reflection]: http://www.php.net/manual/tr/intro.reflection.php 70 | [traits]: http://www.php.net/traits 71 | [call-user-func-array]: http://php.net/manual/tr/function.call-user-func-array.php 72 | [closures-rfc]: https://wiki.php.net/rfc/closures 73 | [overloading]: http://php.net/language.oop5.overloading 74 | -------------------------------------------------------------------------------- /_includes/welcome.md: -------------------------------------------------------------------------------- 1 | # Hoşgeldiniz 2 | 3 | İnternet üzerinde PHP ile ilgili geçerliliğini yitirmiş çok fazla bilgi bulunmakta. 4 | Bu da PHP ile yeni tanışanların günümüzde kullanılmayan, benimsenmeyen yaklaşımları 5 | ve deneyimleri izlemesine, kötü yazımış kodların üretilmesine neden olmakta. 6 | Buna artık bir son verilmeli. _PHP: Usulüne Uygun (PHP: The Right Way)_, PHP 7 | hakkında kolay anlaşılır, güncel ve pratik bilgiler, kabul görmüş kodlama 8 | standartları hakkında bilgiler ve internet üzerinde güvenilir eğitici web 9 | sitelerine bağlantılar içermektedir. 10 | 11 | There's a lot of outdated information on the Web that leads new PHP users astray, 12 | propagating bad practices and insecure code. _PHP: The Right Way_ is an easy-to-read, 13 | quick reference for PHP popular coding standards, links to authoritative tutorials 14 | around the Web and what the contributors consider to be best practices at the present 15 | time. 16 | 17 | _There is no canonical way to use PHP_. This website aims to introduce new PHP 18 | developers to some topics which they may not discover until it is too late, and aims 19 | to give seasoned pros some fresh ideas on those topics they've been doing for years 20 | without ever reconsidering. This website will also not tell you which tools to use, but 21 | instead offer suggestions for multiple options, when possible explaining the differences 22 | in approach and use-case. 23 | 24 | This is a living document and will continue to be updated with more helpful information 25 | and examples as they become available. 26 | 27 | ## Çeviri 28 | 29 | _PHP: Usulüne Uygun_ birçok dilde çevirisi bulunmaktadır: 30 | 31 | * [English](http://www.phptherightway.com) 32 | * [Deutsch](http://rwetzlmayr.github.io/php-the-right-way) 33 | * [Español](http://phpdevenezuela.github.io/php-the-right-way) 34 | * [Français](http://eilgin.github.io/php-the-right-way/) 35 | * [Indonesia](http://id.phptherightway.com) 36 | * [Italiano](http://it.phptherightway.com) 37 | * [Polski](http://pl.phptherightway.com) 38 | * [Português do Brasil](http://br.phptherightway.com) 39 | * [Română](https://bgui.github.io/php-the-right-way/) 40 | * [Slovenščina](http://sl.phptherightway.com) 41 | * [Srpski](http://phpsrbija.github.io/php-the-right-way/) 42 | * [Türkçe](http://hkulekci.github.io/php-the-right-way/) 43 | * [български](http://bg.phptherightway.com) 44 | * [Русский язык](http://getjump.github.io/ru-php-the-right-way) 45 | * [Українська](http://iflista.github.com/php-the-right-way) 46 | * [العربية](https://adaroobi.github.io/php-the-right-way/) 47 | * [فارسى](http://novid.github.io/php-the-right-way/) 48 | * [ภาษาไทย](https://apzentral.github.io/php-the-right-way/) 49 | * [한국어판](http://modernpug.github.io/php-the-right-way) 50 | * [日本語](http://ja.phptherightway.com) 51 | * [简体中文](http://laravel-china.github.io/php-the-right-way/) 52 | * [繁體中文](http://laravel-taiwan.github.io/php-the-right-way) 53 | 54 | ## Feragatname 55 | 56 | _PHP'yi kullanmanın kuralsal, kesin bir yolu yoktur_. Fakat bu site uygun özellikleri ve yararlı bilgileri içeren en iyi kullanım yöntemini göstermeye çalışmaktadır. Bu site yeni kullanıcılar için bir başlangıç ve tecrübeli kişiler için fikirlerini tazeleme ortamıdır. 57 | 58 | Bu site, daha yararlı olmak için devamlı güncellenecek bir belgedir. 59 | 60 | ## Nasıl Katkıda Bulunurum 61 | 62 | Bu sitenin yeni kullanıcılar için yararlı olmasına yardımcı olun! [GitHub Üzerinden Katkıda Bulunun][1] 63 | 64 | ## Afişler 65 | 66 | _PHP: Usulüne Uygun_'un sitenize yerleştirmek için afişleri var. Bunları sitenize yerleştirerek desteğinizi gösterin, 67 | ve yeni kullanıcıların doğru bilgiye ulaşmasını sağlayın. 68 | 69 | 70 | [Afişler][2] 71 | 72 | [1]: https://github.com/codeguy/php-the-right-way/tree/gh-pages 73 | [2]: /php-the-right-way/banners.html 74 | -------------------------------------------------------------------------------- /_posts/01-04-01-Mac-Setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Mac (OSX) Kurulumu 3 | isChild: true 4 | anchor: mac_osx_kurulumu 5 | --- 6 | 7 | ## Mac (OSX) Kurulumu {#mac_osx_kurulumu_title} 8 | 9 | OSX ile birlikte PHP zaten kurulu halde gelmektedir fakat kurulu PHP sürümü 10 | güncel ve kararlı sürümden biraz eski olabilir. Örneğin, Lion PHP 5.3.6 11 | versiyonu ile, Mountain Lion ise 5.3.10 versiyonu ile, Mavericks 5.4.17 ile, 12 | Yosemite 5.5.9 ile ve El Capitan 5.5.29 ile gelmektedir. Hali hazırda PHP 7.0 13 | dahili olarak gelmemektedir. 14 | 15 | PHP'yi OS X'de kurmak için bir kaç yöntem bulunmaktadır. 16 | 17 | 18 | ### Homebrew ile Kurulum 19 | 20 | [Homebrew] OS X için güçlü bir paket yöneticisidir ve PHP ve eklentilerinin 21 | kurulumunu kolayca yapabilmenizi sağlar. [Homebrew PHP] deposu, PHP kurulumuna 22 | izin verecek, PHP ile ilgili "formulae"leri barındıran bir depodur. 23 | 24 | Bu noktada, siz `php53`, `php54`, `php55`, `php56` veya `php70` sürümlerini 25 | `brew install` komutu ile rahatça kurablirsiniz ve bu sürümler arasında `PATH` 26 | değişkenini değiştirerek dolaşabilirsiniz. Alternatif olarak [brew-php-switcher][brew-php-switcher] 27 | sizin için bunu otomatik olarak yapacaktır. 28 | 29 | ### Macports ile Kurulum 30 | 31 | [MacPorts] projesi OS X üzerinde komut satırından çalışan, X11 üzerinde çalışan 32 | veya Aqua tabanlı açık kaynak yazılımları bile compile edip, kurup 33 | güncelleyebileceğiniz kolay kurulum için tasarlanmış bir açık kaynak projesidir. 34 | 35 | MacPorts pre-compiled binary dosyalar sunmaktadır. Bu yüzden kaynak kodundan 36 | bütün gereksinimlerle birlikte tekrar kurmanız gerekmez, Bu sizin hayatınızı 37 | kolaylaştırır ve ekstra kurulumlar ile uğraştırmaz. 38 | 39 | Bu noktada, `php54`, `php55`, `php56` veya `php70` sürümlerini `port install` 40 | komutu ile kolayca kurabilirsiniz. 41 | 42 | sudo port install php56 43 | sudo port install php70 44 | 45 | Ve kolayca `select` komutu ile kullanmak istediğiniz sürümü aktif edebilirsiniz. 46 | 47 | sudo port select --set php php70 48 | 49 | 50 | ### phpbrew ile Kurulum 51 | 52 | [phpbrew] çoklu PHP sürümlerini yönetmek için bir araçtır. Farklı versiyonlara 53 | ihtiyaç duyduğunuz uygulama/projeler için gerçekten çok yararlı olabilir ve 54 | siz sanal makine kullanmazsınız. 55 | 56 | ### Liip's binary installer ile Kurulum 57 | 58 | [php-osx.liip.ch] 5.3 ile 7.0 sürümleri arasında her sürüm için bir satırlık 59 | kurulum scriptleri sunan popüler bir seçenektir. Apple tarafından kurulan PHP'nin 60 | üzerine yazmak ama her bir sürüm için farklı klasörler oluşturur (/usr/local/php5). 61 | 62 | ### Kaynaktan Kurmak 63 | 64 | Diğer bir seçenek ise [kaynak kodunu compile][mac-compile] ederek kurmakdır. 65 | Bu durumda [Xcode][xcode-gcc-substitution]'un veya ["Command Line Tools for XCode"] 66 | kurulmuş olması gerekmektedir. 67 | 68 | ### Hepsi Bir Arada Kurulum 69 | 70 | Yukarıdaki listelenenler PHP'nin kendisinin kurulumuyde ve Apache, Nginx veya 71 | SQL Server gibi şeyleri desteklemiyordu. [MAMP][mamp-downloads] ve [XAMPP][xampp] 72 | gibi "Hepsi Bir Arada" çözümünde ekstra olarak bir kaç yazılım daha kurulmaktadır. 73 | Ancak kolay kurulum desteği ile gelmektedir. 74 | 75 | 76 | [Homebrew]: http://brew.sh/ 77 | [Homebrew PHP]: https://github.com/Homebrew/homebrew-php#installation 78 | [MacPorts]: https://www.macports.org/install.php 79 | [phpbrew]: https://github.com/phpbrew/phpbrew 80 | [php-osx.liip.ch]: http://php-osx.liip.ch/ 81 | [mac-compile]: http://php.net/install.macosx.compile 82 | [xcode-gcc-substitution]: https://github.com/kennethreitz/osx-gcc-installer 83 | ["Command Line Tools for XCode"]: https://developer.apple.com/downloads 84 | [mamp-downloads]: http://www.mamp.info/en/downloads/ 85 | [xampp]: http://www.apachefriends.org/en/xampp.html 86 | [brew-php-switcher]: https://github.com/philcook/brew-php-switcher 87 | -------------------------------------------------------------------------------- /styles/syntax.css: -------------------------------------------------------------------------------- 1 | .highlight { background: #ffffff; } 2 | .highlight .c { color: #999988; font-style: italic } /* Comment */ 3 | .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ 4 | .highlight .k { font-weight: bold } /* Keyword */ 5 | .highlight .o { font-weight: bold } /* Operator */ 6 | .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ 7 | .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ 8 | .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ 9 | .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ 10 | .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ 11 | .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ 12 | .highlight .ge { font-style: italic } /* Generic.Emph */ 13 | .highlight .gr { color: #aa0000 } /* Generic.Error */ 14 | .highlight .gh { color: #999999 } /* Generic.Heading */ 15 | .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ 16 | .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ 17 | .highlight .go { color: #888888 } /* Generic.Output */ 18 | .highlight .gp { color: #555555 } /* Generic.Prompt */ 19 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 20 | .highlight .gu { color: #aaaaaa } /* Generic.Subheading */ 21 | .highlight .gt { color: #aa0000 } /* Generic.Traceback */ 22 | .highlight .kc { font-weight: bold } /* Keyword.Constant */ 23 | .highlight .kd { font-weight: bold } /* Keyword.Declaration */ 24 | .highlight .kp { font-weight: bold } /* Keyword.Pseudo */ 25 | .highlight .kr { font-weight: bold } /* Keyword.Reserved */ 26 | .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ 27 | .highlight .m { color: #009999 } /* Literal.Number */ 28 | .highlight .s { color: #d14 } /* Literal.String */ 29 | .highlight .na { color: #008080 } /* Name.Attribute */ 30 | .highlight .nb { color: #0086B3 } /* Name.Builtin */ 31 | .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ 32 | .highlight .no { color: #008080 } /* Name.Constant */ 33 | .highlight .ni { color: #800080 } /* Name.Entity */ 34 | .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ 35 | .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ 36 | .highlight .nn { color: #555555 } /* Name.Namespace */ 37 | .highlight .nt { color: #000080 } /* Name.Tag */ 38 | .highlight .nv { color: #008080 } /* Name.Variable */ 39 | .highlight .ow { font-weight: bold } /* Operator.Word */ 40 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 41 | .highlight .mf { color: #009999 } /* Literal.Number.Float */ 42 | .highlight .mh { color: #009999 } /* Literal.Number.Hex */ 43 | .highlight .mi { color: #009999 } /* Literal.Number.Integer */ 44 | .highlight .mo { color: #009999 } /* Literal.Number.Oct */ 45 | .highlight .sb { color: #d14 } /* Literal.String.Backtick */ 46 | .highlight .sc { color: #d14 } /* Literal.String.Char */ 47 | .highlight .sd { color: #d14 } /* Literal.String.Doc */ 48 | .highlight .s2 { color: #d14 } /* Literal.String.Double */ 49 | .highlight .se { color: #d14 } /* Literal.String.Escape */ 50 | .highlight .sh { color: #d14 } /* Literal.String.Heredoc */ 51 | .highlight .si { color: #d14 } /* Literal.String.Interpol */ 52 | .highlight .sx { color: #d14 } /* Literal.String.Other */ 53 | .highlight .sr { color: #009926 } /* Literal.String.Regex */ 54 | .highlight .s1 { color: #d14 } /* Literal.String.Single */ 55 | .highlight .ss { color: #990073 } /* Literal.String.Symbol */ 56 | .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ 57 | .highlight .vc { color: #008080 } /* Name.Variable.Class */ 58 | .highlight .vg { color: #008080 } /* Name.Variable.Global */ 59 | .highlight .vi { color: #008080 } /* Name.Variable.Instance */ 60 | .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /pages/Functional-Programming.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Functional Programming in PHP 4 | --- 5 | 6 | # Functional Programming in PHP 7 | 8 | PHP supports first-class functions, meaning that a function can be assigned to a variable. Both user-defined and built-in 9 | functions can be referenced by a variable and invoked dynamically. Functions can be passed as arguments to other 10 | functions (a feature called higher-order functions) and a function can return other functions. 11 | 12 | Recursion, a feature that allows a function to call itself, is supported by the language, but most of the PHP code focus 13 | is on iteration. 14 | 15 | Anonymous functions (with support for closures) have been present since PHP 5.3 (2009). 16 | 17 | PHP 5.4 added the ability to bind closures to an object's scope and also improved support for callables such that they 18 | can be used interchangeably with anonymous functions in almost all cases. 19 | 20 | The most common usage of higher-order functions is when implementing a strategy pattern. The built-in `array_filter` 21 | function asks both for the input array (data) and a function (a strategy or a callback) used as a filter function on 22 | each array item. 23 | 24 | {% highlight php %} 25 | $min 55 | * 56 | * Returns a single filter out of a family of "greater than n" filters 57 | */ 58 | function criteria_greater_than($min) 59 | { 60 | return function($item) use ($min) { 61 | return $item > $min; 62 | }; 63 | } 64 | 65 | $input = array(1, 2, 3, 4, 5, 6); 66 | 67 | // Use array_filter on a input with a selected filter function 68 | $output = array_filter($input, criteria_greater_than(3)); 69 | 70 | print_r($output); // items > 3 71 | {% endhighlight %} 72 | 73 | Each filter function in the family accepts only elements greater than some minimum value. Single filter returned by 74 | `criteria_greater_than` is a closure with `$min` argument closed by the value in the scope (given as an argument when 75 | `criteria_greater_than` is called). 76 | 77 | Early binding is used by default for importing `$min` variable into the created function. For true closures with late 78 | binding one should use a reference when importing. Imagine a templating or input validation library, where closure is 79 | defined to capture variables in scope and access them later when the anonymous function is evaluated. 80 | 81 | * [Read about Anonymous functions][anonymous-functions] 82 | * [More details in the Closures RFC][closures-rfc] 83 | * [Read about dynamically invoking functions with `call_user_func_array`][call-user-func-array] 84 | 85 | [anonymous-functions]: http://www.php.net/manual/en/functions.anonymous.php 86 | [call-user-func-array]: http://php.net/manual/en/function.call-user-func-array.php 87 | [closures-rfc]: https://wiki.php.net/rfc/closures 88 | -------------------------------------------------------------------------------- /_posts/11-02-01-Test-Driven-Development.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Test Odaklı Geliştirme 3 | isChild: true 4 | anchor: test_odakli_gelistirme 5 | --- 6 | 7 | ## Test Odaklı Geliştirme {#test_odakli_gelistirme_title} 8 | 9 | [Wikipedia](http://en.wikipedia.org/wiki/Test-driven_development)'den: 10 | 11 | > Test odaklı geliştirme (TOG), geliştirme sürecinin döngüsel tekrarına dayana bir yazılım geliştirme sürecidir: ilk olarak 12 | > geliştirici bir özelliği ya da fonksiyonu tanımlayan (başlangıçta başarısız) bir test oluşturur, sonra testi geçmek için 13 | > az sayıda kodlar eklenir ya da çıkarılır ve sonunda yazılımın işlevini ve davranışını değiştirmeden iç yapısında yapılan değişikliklerle 14 | > yeni kod kabul edilir standartlara uygun bir hale getirilir. Kent Beck, TOG tekniğini keşfeden ve geliştiren olarak kabul edilen kişi, 15 | > 2003 yılında TOG'un basit tasarımı ve özgüveni teşvik ettiğini belirti. 16 | 17 | Uygulamanız için kullanabileceğiniz bir kaç çeşit test yöntemi vardır: 18 | 19 | ### Birim Test (Unit Testing) 20 | 21 | Unit Testing fonskiyonları, sınıfları ve metodları bir geliştirme döndüsü üzerinden tüm çalışma zamanında çalıştığından emin olmak için bir programlama yaklaşımıdır. Fonskiyonların ve metodların içindeki ya da dışındaki değişkenlerin değerlerini kontrol ederek iç mantığın doğru çalıştığını kontrol edebilirsiniz. Bağımlılık kontrolü ve sahte sınıflar ve taslaklar inşa ederek, bağımlılığı doğrulayabilirsiniz ve bu daha iyi bir test kapsamı için doğru kullanımdır. 22 | 23 | Bir sınıf ya da metod oluşturduğunuzda, bu sınıf ya da metodun her bir davranışı için bir birim test oluşturmalısınız. Basit seviyede, yanlış bir argüman gönderdiğinizde hata vereceğinden ve doğru bir argüman gönderdiğinizde çalışacağından emin olmalısınız. Geliştirme döngüsünde bu sınıf ya da metod içerisinde değişiklik olduğunda eski işlevleri umduğumuz gibi çalışacaktır. 24 | 25 | Birim test için diğer bir kullanım açıkkaynağa katkıda bulunmaktır. Bozuk işlevleri göstermek ve sonrasında düzeltmek için bir test yazabilirsiniz. Testi geçebildiğini gösterebilirsiniz. Bir projeyi çalıştırdığınızda gönderilen istekler için testi bir gereklilik olarak önerebilirsiniz. 26 | 27 | [PHPUnit](http://phpunit.de) PHP uygulamaları için birim test yazmak için de-facto test çatısıdır. Buna ek olarak bir kaç alternatif de bulunmaktadır. 28 | 29 | * [atoum](https://github.com/atoum/atoum) 30 | * [Enhance PHP](https://github.com/Enhance-PHP/Enhance-PHP) 31 | * [PUnit](http://punit.smf.me.uk/) 32 | * [SimpleTest](http://simpletest.org) 33 | 34 | 35 | ### Entegrasyon Test (Integration Testing) 36 | 37 | [Wikipedia](http://en.wikipedia.org/wiki/Integration_testing)'den: 38 | 39 | Entegrasyon testi (bazen entegrasyon ve test olarakta anılır, kısaltılmış hali "I&T"dir.) uygulamanızdaki modüllerin birleştirildiği ve bir grup olarak test edildiği bir test aşamasıdır. Birim test (Unit Test) sonrası ve doğrulama testleri (Validation Testing) öncesi oluşturulur. Entegrasyon testinde birim testi yapılmış modülleri girdi olarak alınır, daha büyük gruplar oluşturacak şekilde birleştirilir, entegrasyon test planında tanımlanan testler uygulanır ve sistem testi için hazır bir şekilde entegra sistem sunulur. 40 | 41 | Birim test için kullanılan bir çok araç entegrasyon testi için de kullanılabilir. 42 | 43 | 44 | ### Fonksiyonel Test (Functional Testing) 45 | 46 | (acceptance testing) olarak da bilinen, fonksyonle test birimlerin birbirleri ile doğru konuşup konuşmadığını ve birimlerin tek tek düzgün çalışıp çalışmadığını kontrol etmek yerine uygulamanızı gerçekten kullanan otomatik test araçları oluşturmak için kullanılan araçlar kullanarak oluşturulur. Bu araçlar gerçek veriler ile ve gerçek kullanıcıları simule ederek çalışırlar. 47 | 48 | #### Fonksiyonel Test Araçları 49 | 50 | * [Selenium](http://seleniumhq.com) 51 | * [Mink](http://mink.behat.org) 52 | * [Codeception](http://codeception.com) is a full-stack testing framework that includes acceptance testing tools 53 | * [Storyplayer](http://datasift.github.io/storyplayer) is a full-stack testing framework that includes support for creating and destroying test environments on demand 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP: The Right Way 2 | 3 | ## Giriş 4 | 5 | Bu _PHP: The Right Way_ projesi için Github Pages "repo"sudur. 6 | 7 | * Bu site bir Jekyll projesidir. 8 | * Her bölüm ve alt bölümleri "_posts/" dizininde bir Markdown dosyasıdır. 9 | * Her alt bölümün başında `isChild: true` vardır. 10 | * Sayfa yapıları ve navigasyon otomatik oluşturulur. 11 | 12 | ## Tanıtım 13 | 14 | _PHP: The Right Way_ sitenizde tanıtmak için bir banner'ı vardır. Bu konuda 15 | yardım edin ki yeni PHP geliştiricileri kaliteli bilgiyi nerde bulacaklarını 16 | bilsinler. 17 | 18 | [See Banner Images](http://www.phptherightway.com/banners.html) 19 | 20 | ## Nasıl Katkıda Bulunabilirim 21 | 22 | 1. Fork edin ve düzenleyin. 23 | 2. İsterseniz [Jekyll](https://github.com/mojombo/jekyll/) ile 24 | [Ruby](https://rvm.io/rvm/install/) üzerinden kendi bilgisayarınızda 25 | görüntüleyebilirsiniz. 26 | 3. Değerlendirilmesi için "Pull Request" isteği gönderin. 27 | 28 | ### Katılımcı Rehberi 29 | 30 | 1. Use American English spelling (*sadece İngilizce repo için*) 31 | 2. Tab karakteri yerine 4 karakter boşluk kullanın. 32 | 3. Tüm yazıyı 120 karaktere sarmaya çalışın. 33 | 4. Kod örnekleri için [PSR-1](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md) 34 | veya daha büyük standartlara bağlı kalın. 35 | 36 | ## Linkler 37 | 38 | 39 | 40 | * [English](http://www.phptherightway.com) 41 | * [Deutsch](http://rwetzlmayr.github.io/php-the-right-way) 42 | * [Español](http://phpdevenezuela.github.io/php-the-right-way) 43 | * [Français](http://eilgin.github.io/php-the-right-way/) 44 | * [Indonesia](http://id.phptherightway.com) 45 | * [Italiano](http://it.phptherightway.com) 46 | * [Polski](http://pl.phptherightway.com) 47 | * [Português do Brasil](http://br.phptherightway.com) 48 | * [Română](https://bgui.github.io/php-the-right-way/) 49 | * [Slovenščina](http://sl.phptherightway.com) 50 | * [Srpski](http://phpsrbija.github.io/php-the-right-way/) 51 | * [Türkçe](http://hkulekci.github.io/php-the-right-way/) 52 | * [български](http://bg.phptherightway.com) 53 | * [Русский язык](http://getjump.github.io/ru-php-the-right-way) 54 | * [Українська](http://iflista.github.com/php-the-right-way) 55 | * [العربية](https://adaroobi.github.io/php-the-right-way/) 56 | * [فارسى](http://novid.github.io/php-the-right-way/) 57 | * [ภาษาไทย](https://apzentral.github.io/php-the-right-way/) 58 | * [한국어판](http://modernpug.github.io/php-the-right-way) 59 | * [日本語](http://ja.phptherightway.com) 60 | * [简体中文](http://laravel-china.github.io/php-the-right-way/) 61 | * [繁體中文](http://laravel-taiwan.github.io/php-the-right-way) 62 | 63 | ### Çeviri 64 | 65 | Eğer _PHP: The Right Way_'i çevirmek istiyorsanız, repo'yu fork edin ve kendi 66 | github hesabınızdan yayınlayın. Ana dökümandan çevirinize bağlantı vereceğiz. 67 | 68 | Parçalanmaları ve okuyucu karışıklığını önlemek için lütfen birini seçin : 69 | 70 | 1. Github sayfanıza bağlantı vermek `[username].github.io/php-the-right-way` 71 | 2. Github sayfanıza subdomain ile bağlantı vermek (e.g. "ru.phptherightway.com") 72 | 73 | Eğer bir subdomain kullanıyorsanız `CNAME` dosyasına domain bilgilerinizi 74 | giriniz ve DNS kurulumu için bize başvurun. Subdomain kullanmıyorsanız, `CNAME` 75 | dosyasını tamamen silin aksi durumda kendi fork'unuz çalışmayacaktır. 76 | 77 | [Wiki sayfasına](https://github.com/codeguy/php-the-right-way/wiki/Translations) 78 | çevirinizin durumu hakkında bilgi ekleyin. 79 | 80 | Çeviriniz bittiğinde bize bildirmek için bir issue(konu) açın . 81 | 82 | ## Niçin 83 | 84 | Son zamanlarda PHP topluluğunun yetersizliği hakkında bir çok tartışma oldu. Bu 85 | repo bu problemi çözmeyi hedeflemektedir. 86 | 87 | ## Kim 88 | 89 | Adım [Josh Lockhart](http://twitter.com/codeguy). 90 | [Slim Framework](http://www.slimframework.com/)'ün yazarıyım, ve 91 | [New Media Campaigns](http://www.newmediacampaigns.com/) şirketinde 92 | çalışmaktayım. 93 | 94 | ### Collaborators 95 | 96 | * [Kris Jordan](http://krisjordan.com/) 97 | * [Phil Sturgeon](http://philsturgeon.co.uk/) 98 | 99 | ## Lisans 100 | 101 | [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/) 102 | -------------------------------------------------------------------------------- /_posts/02-01-01-Code-Style-Guide.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Kodlama Stili Rehberi 3 | anchor: kodlama_stili_rehberi 4 | --- 5 | 6 | # Kodlama Stili Rehberi {#kodlama_stili_rehberi_title} 7 | 8 | PHP topluluğu geniş ve çeşitlidir. Sayısız kütüphane, framework ve bileşenlerden 9 | oluşmaktadır. Bunlardan birkaçını seçip herhangi bir projede kullanmak PHP 10 | geliştiricilerinin sıklıkla kullandığı bir yöntemdir. PHP kodlarında genel bir 11 | stile uymak, farklı ve çeşitli kütüphaneleri sorunsuz kullanmak açısından son 12 | derece önemlidir. PHP kodunun genel kod stiline olabildiğince uyması, 13 | geliştiricilerin kolaylıkla farklı kütüphaneleri kullanabilmesine olanak tanır. 14 | 15 | [Framework Interop Group][fig] (daha önce 'PHP Standartları Grubu' olarak 16 | bilinen) çeşitli kodlama standartları önerilerinde bulunmuş ve [PSR-0][psr0], 17 | [PSR-1][psr1] ve [PSR-2][psr2] gibi standartları kabul etmiştir. Kabul edilmiş 18 | olan bu standartlar Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, 19 | Laravel ve Lithium gibi birçok büyük projelerde kullanılmaya başlanmış ve 20 | desteklenmiştir. Bu standartları dilerseniz kendi projelerinizde 21 | kullanabilirsiniz veya kendi kodlama stiliniz ve standartlarınız ile devam 22 | edebilirsiniz. 23 | 24 | Diğer geliştiricilerin yazdığınız kodu daha kolay okuyup anlamaları ve üzerinden 25 | çalışabilmeleri için bu standartlardan bir veya daha fazlasına uygun kod 26 | yazmalısınız. Bunlar PSR'nin standartları ya da PEAR veya Zend'in standartları 27 | olabilir. Üçüncü partiler tarafından hazırlanmış kodlarla çalışırken birçok 28 | bileşenden oluşan uygulamalar birbiri ile daha uyumlu olabilir. 29 | 30 | * [PSR-0 hakkında][psr0] 31 | * [PSR-1 hakkında][psr1] 32 | * [PSR-2 hakkında][psr2] 33 | * [Read about PSR-4][psr4] 34 | * ["PEAR Coding Standards" hakkında][pear-cs] 35 | * ["Zend Coding Standards" hakkında][zend-cs] 36 | * [Read about Symfony Coding Standards][symfony-cs] 37 | 38 | [PHP_CodeSniffer][phpcs] eklentisini kullanarak yazdığınız kodların bu 39 | standartlardan herhangi birine uyumlu olup olmadığını kontrol edebilirsiniz. 40 | [Sublime Text 2][st-cs] gibi bir editörde ise bu konuda gerçek zamanlı 41 | geribildirimler alabilirsiniz. 42 | 43 | 44 | [PHP_CodeSniffer][phpcs] aracını bu standartlara karşı uygun olup olmadığını 45 | kotrol etmek için kullanabilirsiniz veya [Sublime Text 2-3][st-cs] gibi bir 46 | editör'e eklenti olarak kurabilir ve neredeyse gerçek zamanlı geribildirimler 47 | alabilirsiniz. 48 | 49 | Kod düzeninizi aşağıdaki bir kaç aracı kullanarak kolayce düzeltebilirsiniz. 50 | Bunlardan birisi iyi test edilmiş bir kod bulunan 51 | [PHP Coding Standards Fixer][phpcsfixer]'dir. Diğer bir seçenek ise [sublime-phpfmt][sublime-phpfmt] 52 | olarak bir Sublime Text ektentisi olan [php.tools][phptools]'dur. 53 | 54 | Ayrıca `phpcs`yi komut satırından da çalıştırabilirsiniz: 55 | 56 | phpcs -sw --standard=PSR2 file.php 57 | 58 | Size hataları ve nasıl düzelteceğinize dair açıklamaları gösterecektir. Ayrıca 59 | bu komutu git hook olarak da kaydedebilirsiniz. Bu kod deponuza standart olmayan 60 | hiç bir kodun girmemesinde yardımcı olacaktır. 61 | 62 | İngilizce, kod içinde bulunan değişken, sabit, fonksiyon, yordam gibi semboller 63 | ve yapılara ait isimlendirmelerde tercih edilmektedir. Yorumlar için ise şu 64 | anda ve gelecekte kodlar üzerinde uğraşacak kişilerin anlayabileceği bir dil 65 | tercih edilmelidir. Örneğin, proje ekibinde Türkçe bilmeyen bir eleman varsa, 66 | yorum satırlarını Türkçe yerine İngilizce yazmanız daha doğru olacaktır. 67 | 68 | [fig]: http://www.php-fig.org/ 69 | [psr0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 70 | [psr1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md 71 | [psr2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md 72 | [psr4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md 73 | [pear-cs]: http://pear.php.net/manual/en/standards.php 74 | [zend-cs]: http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards 75 | [symfony-cs]: http://symfony.com/doc/current/contributing/code/standards.html 76 | [phpcs]: http://pear.php.net/package/PHP_CodeSniffer/ 77 | [st-cs]: https://github.com/benmatselby/sublime-phpcs 78 | [phpcsfixer]: http://cs.sensiolabs.org/ 79 | [phptools]: https://github.com/phpfmt/php.tools 80 | [sublime-phpfmt]: https://github.com/phpfmt/sublime-phpfmt -------------------------------------------------------------------------------- /_posts/12-05-01-Building-your-Application.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Uygulamanızı Build Etmek ve Deploy Etmek 3 | isChild: true 4 | anchor: uygulamanizi_build_etmek_ve_deploy_etmek 5 | --- 6 | 7 | ## Uygulamanızı Build Etmek ve Deploy Etmek {#uygulamanizi_build_etmek_ve_deploy_etmek_title} 8 | 9 | Eğer dosyalarınızı güncellemeden önce kendinizi elle (manually) veritabanı şemasını güncellerken veya 10 | testlerinizi elle (manually) çalıştırıyor buluyorsanız, iki kere düşünün! 11 | 12 | Uygulamanızın yeni versiyonunu deploy etmek için elle (manually) yapmanız gerekecek her ekstra işlem ile büyük hatalar 13 | yapma ihtimaliniz artacaktır. İster basit bir güncellemeyle uğraşırken, ister kapsamlı bir yapı kuruyorken ve hatta sürekli 14 | entegrasyon stratejisiyle uğraşıyorken [build otomasyonu](http://en.wikipedia.org/wiki/Build_automation) arkadaşınızdır. 15 | 16 | Otomatikleştirmek isteyeceğiniz bazı işlemler: 17 | 18 | * Bağımlılık yönetimi 19 | * Dosyalarınızın (assets) derleme, sıkıştırma (minification) işlemleri 20 | * Test çalıştırma 21 | * Dökümantasyon oluşturma 22 | * Paketleme 23 | * Deployment 24 | 25 | 26 | ### Otomasyon Araçlarını Hazırlamak {#otomasyon-aralarn-hazrlamak} 27 | 28 | Otomasyon araçları, yazılım deployment'larının yaygın görevlerini idare eden betik koleksiyonu olarak tanımlanabilir. 29 | Build araçları yazılımınızın bir parçası değildir, sadece yazılımınızla dışarıdan çalışır. 30 | 31 | Bazıları PHP, bazıları farklı dillerde olmak üzere build otomasyonunda size yardımcı olabilecek bir çok açık kaynak 32 | araç bulunmaktadır. Eğer belirli bir iş için daha uygunlarsa PHP ile yazılmış olmamaları sizi durdurmasın. 33 | İşte bir kaç örnek: 34 | 35 | [Phing](http://www.phing.info/) PHP dünyasında otomatik deployment a başlamak için en kolay yoldur. Phing ile basit 36 | bir XML dosyasından paketleme, deployment veya test işlemlerini kontrol edebilirsiniz. Phing ([Apache Ant](http://ant.apache.org/) 37 | tabanlıdır) bir web uygulamasını yüklemek ve ya güncellemek için genellikle ihtiyaç duyulabilecek geniş çaplı işlemleri 38 | hizmetinize sunar ve PHP de yazılmış özel işlemler ile geliştirilebilir. 39 | 40 | [Capistrano](https://github.com/capistrano/capistrano/wiki) her seviyede programcının kullanabileceği bir ya da birden fazla makinada uzaktan düzenli ve tekrar edebilecek şekilde konut çalıştırmasılmasını sağlayan bir sistemdir. Aslında Ruby on Rails uygulamaları için ayarlanmış olmasına rağmen **PHP uygulamaları** içinde başarıyla kullanılmaktadır. Etkili kullamıö için Ruby ve Rake bilgisi gereklidir. 41 | 42 | Dave Gardner'ın yazısı [PHP Deployment with Capistrano](http://www.davegardner.me.uk/blog/2012/02/13/php-deployment-with-capistrano/) Capistrano kullanmak isteyen PHP programcıları için güzel bir başlangıç noktası olabilir. 43 | 44 | [Chef](http://www.opscode.com/chef/) bir dağıtım çerçevesinden daha fazlasıdır. Yalnızca uygulamanızı dağıtmakla kalmayan, tüm sunucu ortamınızı veya sanal sunucu paaketlerinizi da oluşturabilen, çok güçlü bir Ruby tabanlı sistem entegrasyon çatısıdır. 45 | 46 | PHP kullanlar için Chef hakkında bazı kaynaklar: 47 | 48 | * [Three part blog series about deploying a LAMP application with Chef, Vagrant, and EC2](http://www.jasongrimes.org/2012/06/managing-lamp-environments-with-chef-vagrant-and-ec2-1-of-3/) 49 | * [Chef Cookbook which installs and configures PHP 5.3 and the PEAR package management system](https://github.com/opscode-cookbooks/php) 50 | 51 | Daha fazla kaynak: 52 | 53 | * [Automate your project with Apache Ant](http://net.tutsplus.com/tutorials/other/automate-your-projects-with-apache-ant/) 54 | * [Maven](http://maven.apache.org/), a build framework based on Ant and [how to use it with PHP](http://www.php-maven.org/) 55 | 56 | ### Sürekli Entegrasyon (Continuous Integration) 57 | 58 | > Sürekli Entegrasyon, bir ekibin üyelerinin sık sık işlerini entegre ettiği, genellikle her kişinin en az günlük olarak 59 | > bütünleştiği - günde birden fazla entegrasyona yol açan bir yazılım geliştirme pratiğidir. Birçok ekip bu yaklaşımın önemli > ölçüde entegrasyon sorunlarını azaltığını ve ekibin daha uyumlu bir yazılım geliştirmesini sağladığını tecrübe etti. 60 | 61 | *-- Martin Fowler* 62 | 63 | PHP için sürekli entegrasyon uygulamanın bir çok farklı yolu vardır. [Travis CI] (https://travis-ci.org/) küçük projeler için bile sürekli entegrasyonu uygulamayı kolaylaştırarar harika bir iş çıkardı. Travis CI açık kaynak topluluğu için entegrasyon hizmeti sağlayan bir uygulamasıdır. GitHub ile entegredir ve birçok kişi için PHP dahil birinci sınıf destek sunar. 64 | 65 | Daha fazla kaynak: 66 | 67 | * [Continuous Integration with Jenkins](http://jenkins-ci.org/) 68 | * [Continuous Integration with PHPCI](http://www.phptesting.org/) 69 | * [Continuous Integration with Teamcity](http://www.jetbrains.com/teamcity/) 70 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to PHP The Right Way 2 | 3 | Enjoy [PHP The Right Way](http://phptherightway.com) and want to get 4 | involved? Great! There are plenty of ways you can help out. 5 | 6 | Please take a moment to review this document in order to make the contribution 7 | process easy and effective for everyone involved. 8 | 9 | Following these guidelines helps to communicate that you respect the time of 10 | the developers managing and developing this open source project. In return, 11 | they should reciprocate that respect in addressing your issue or assessing 12 | patches and features. 13 | 14 | 15 | ## Using the issue tracker 16 | 17 | The [issue tracker](https://github.com/codeguy/php-the-right-way/issues) is 18 | the preferred channel for changes: spelling mistakes, wording changes, new 19 | content and generally [submitting pull requests](#pull-requests), but please 20 | respect the following restrictions: 21 | 22 | * Please **do not** use the issue tracker for personal support requests (use 23 | [Stack Overflow](http://stackoverflow.com/questions/tagged/php) or IRC). 24 | 25 | * Please **do not** derail or troll issues. Keep the discussion on topic and 26 | respect the opinions of others. 27 | 28 | 29 | 30 | ## Pull Requests 31 | 32 | Pull requests are a great way to add new content to PHP The Right Way, as well 33 | as updating any browser issues or other style changes. Pretty much any sort of 34 | change is accepted if seen as constructive. 35 | 36 | Adhering to the following this process is the best way to get your work 37 | included in the project: 38 | 39 | 1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, 40 | and configure the remotes: 41 | 42 | ```bash 43 | # Clone your fork of the repo into the current directory 44 | git clone https://github.com//php-the-right-way.git 45 | # Navigate to the newly cloned directory 46 | cd php-the-right-way 47 | # Assign the original repo to a remote called "upstream" 48 | git remote add upstream https://github.com/codeguy/php-the-right-way.git 49 | ``` 50 | 51 | 2. If you cloned a while ago, get the latest changes from upstream: 52 | 53 | ```bash 54 | git checkout gh-pages 55 | git pull upstream gh-pages 56 | ``` 57 | 58 | 3. Create a new topic branch (off the main project development branch) to 59 | contain your change or fix: 60 | 61 | ```bash 62 | git checkout -b 63 | ``` 64 | 65 | 4. Install the [Jekyll](https://github.com/mojombo/jekyll/) gem to preview locally. 66 | 67 | ```bash 68 | # Install the needed gems through Bundler 69 | bundle install 70 | # Run the local server 71 | bundle execute jekyll s 72 | ``` 73 | 74 | 5. Commit your changes in logical chunks. Please adhere to these [git commit 75 | message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) 76 | or your content is unlikely be merged into the main project. Use Git's 77 | [interactive rebase](https://help.github.com/articles/interactive-rebase) 78 | feature to tidy up your commits before making them public. 79 | 80 | 6. Locally merge (or rebase) the upstream development branch into your topic branch: 81 | 82 | ```bash 83 | git pull [--rebase] upstream gh-pages 84 | ``` 85 | 86 | 7. Push your topic branch up to your fork: 87 | 88 | ```bash 89 | git push origin 90 | ``` 91 | 92 | 8. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) 93 | with a clear title and description. 94 | 95 | 96 | ## Contribution Agreement and Usage 97 | 98 | By submitting a pull request to this repository, you agree to allow the project 99 | owners to license your work under the the terms of the [Creative Commons Attribution-NonCommercial-ShareAlike 100 | 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/). 101 | 102 | The same content and license will be used for all PHP The Right Way publications, 103 | including - but not limited to: 104 | 105 | * [phptherightway.com](http://phptherightway.com) 106 | * Translations of phptherightway.com 107 | * [LeanPub: PHP The Right Way](https://leanpub.com/phptherightway/) 108 | * Translations of "LeanPub: PHP The Right Way" 109 | 110 | All content is completely free now, and always will be. 111 | 112 | ## Contributor Style Guide 113 | 114 | 1. Use American English spelling (*primary English repo only*) 115 | 2. Use four (4) spaces to indent text; do not use tabs 116 | 3. Wrap all text to 120 characters 117 | 4. Code samples should adhere to PSR-1 or higher 118 | 5. Use [GitHub Flavored Markdown](http://github.github.com/github-flavored-markdown/) for all content 119 | 6. Use language agnostic urls when referring to external websites such as the [php.net](http://php.net/urlhowto.php) manual 120 | -------------------------------------------------------------------------------- /styles/base/bars-buttons.less: -------------------------------------------------------------------------------- 1 | .button() { 2 | .border-box; 3 | cursor: pointer; 4 | display: inline-block; 5 | .phh; 6 | text-align: center; 7 | font-weight: bold; 8 | } 9 | .button-hover(){ 10 | text-decoration: none; 11 | } 12 | .bar() { 13 | display: block; 14 | .pah; 15 | text-align: center; 16 | font-weight: bold; 17 | } 18 | 19 | /* Sizes */ 20 | 21 | .btn-size(@scale){ 22 | height: @baseline * @scale !important; 23 | padding-bottom: 0 !important; 24 | padding-top: 0 !important; 25 | line-height: @baseline * (@scale * 0.9); 26 | } 27 | .btn-half{ 28 | .btn-size(1); 29 | font-size: 0.8em; 30 | } 31 | .btn-single{ 32 | .btn-size(1.5); 33 | font-size: 1em; 34 | } 35 | .btn-double{ 36 | .btn-size(2); 37 | font-size: 1.1em; 38 | } 39 | 40 | /* Shapes */ 41 | 42 | .bb-shape-square() { 43 | .border-radius(0); 44 | } 45 | .bb-shape-rounded(@rad:3px) { 46 | .border-radius(@rad); 47 | } 48 | .bb-shape-round() { 49 | .border-radius(@baseline); 50 | } 51 | 52 | /* Text */ 53 | 54 | .bb-text-dark(){ 55 | color: #333; 56 | text-shadow: 0 1px 0 #fff; 57 | } 58 | .bb-text-light(){ 59 | color: #fff; 60 | text-shadow: 0 -1px 0 rgba(0,0,0,.3); 61 | } 62 | .bb-text-color(@color){ 63 | 64 | } 65 | 66 | /* Color */ 67 | 68 | .bb-color-plain(@color){ 69 | background: @color; 70 | } 71 | .bb-color-gradient(@color){ 72 | .gradient(@color,lighten(@color,10%),darken(@color,10%)); 73 | } 74 | .bb-color-soft(@color){ 75 | .gradient(@color,lighten(@color,5%),darken(@color,5%)); 76 | } 77 | .bb-color-gloss(@color){ 78 | @topStart: desaturate(lighten(@color,40%),20%); 79 | @topStop: desaturate(lighten(@color,20%),40%); 80 | @bottomStart: desaturate(lighten(@color,10%),30%); 81 | @bottomStop: desaturate(lighten(@color,15%),30%); 82 | .linear-gradient-top(@color,@topStart,0%,@topStop,50%,@bottomStart,50%,@bottomStop,100%); 83 | } 84 | 85 | /* Border */ 86 | 87 | .bb-border-noborder(){ 88 | border: none; 89 | } 90 | .bb-border-plain(@color){ 91 | border: 1px solid darken(@color,10%); 92 | } 93 | .bb-border-contrast(@color){ 94 | border: 1px solid darken(@color,15%); 95 | .box-shadow(inset 0 0 1px 1px lighten(@color,15%)); 96 | } 97 | .bb-border-meta(@color){ 98 | border: 1px solid darken(@color,15%); 99 | .box-shadow(inset 0 2px 1px -1px lighten(@color,20%)); 100 | } 101 | 102 | /* Minimal */ 103 | 104 | .button-minimal(@color) { 105 | .button(); 106 | .bb-shape-rounded(); 107 | .bb-color-plain(@color); 108 | .bb-border-contrast(@color); 109 | .bb-text-dark(); 110 | } 111 | .button-minimal-hover(@color){ 112 | .button-minimal(darken(@color,5%)); 113 | .button-hover(); 114 | } 115 | .button-minimal-active(@color){ 116 | .button-minimal-hover(darken(@color,5%)); 117 | } 118 | .bar-minimal(@color) { 119 | .button-minimal(@color); 120 | .bar(); 121 | } 122 | 123 | /* Clean */ 124 | 125 | .button-clean(@color) { 126 | .button(); 127 | .bb-shape-rounded(); 128 | .bb-color-gradient(@color); 129 | .bb-border-plain(darken(@color,5%)); 130 | .bb-text-dark(); 131 | } 132 | .button-clean-hover(@color){ 133 | .button-clean(darken(@color,5%)); 134 | .button-hover(); 135 | } 136 | .button-clean-active(@color){ 137 | .button-clean-hover(darken(@color,5%)); 138 | } 139 | .bar-clean(@color){ 140 | .button-clean(@color); 141 | .bar(); 142 | } 143 | 144 | /* Soft */ 145 | 146 | .button-soft(@color) { 147 | .button(); 148 | .bb-shape-rounded(); 149 | .bb-color-soft(@color); 150 | .bb-border-meta(darken(@color,5%)); 151 | .bb-text-light(); 152 | } 153 | .button-soft-hover(@color){ 154 | .button-soft(darken(@color,5%)); 155 | .button-hover(); 156 | } 157 | .button-soft-active(@color){ 158 | .button-soft-hover(darken(@color,5%)); 159 | } 160 | .bar-soft(@color){ 161 | .button-soft(@color); 162 | .bar(); 163 | } 164 | 165 | /* Pill */ 166 | 167 | .button-pill(@color) { 168 | .button(); 169 | .bb-shape-round(); 170 | .bb-color-soft(@color); 171 | .bb-border-meta(darken(@color,5%)); 172 | .bb-text-light(); 173 | } 174 | .button-pill-hover(@color){ 175 | .button-pill(darken(@color,5%)); 176 | .button-hover(); 177 | } 178 | .button-pill-active(@color){ 179 | .button-pill-hover(darken(@color,5%)); 180 | } 181 | .bar-pill(@color){ 182 | .button-pill(@color); 183 | .bar(); 184 | } 185 | 186 | /* Gloss */ 187 | 188 | .button-gloss(@color) { 189 | .button(); 190 | .bb-shape-rounded(5px); 191 | .bb-color-gloss(@color); 192 | .bb-border-plain(darken(@color,5%)); 193 | .box-shadow(inset 0 1px 0 0 rgba(255,255,255,.5)); 194 | .bb-text-light(); 195 | } 196 | .button-gloss-hover(@color){ 197 | .button-gloss(darken(@color,5%)); 198 | .box-shadow(inset 0 1px 0 0 rgba(255,255,255,.3)); 199 | .button-hover(); 200 | } 201 | .button-gloss-active(@color){ 202 | .button-gloss-hover(darken(@color,5%)); 203 | .box-shadow(inset 0 0 5px 0 rgba(0,0,0,.3)); 204 | } 205 | .bar-gloss(@color){ 206 | .button-gloss(@color); 207 | .bar(); 208 | } 209 | 210 | @btn-minimal-color: #eee; 211 | .btn-minimal { .button-minimal(@btn-minimal-color); } 212 | .btn-minimal:hover { .button-minimal-hover(@btn-minimal-color); } 213 | .btn-minimal:active { .button-minimal-active(@btn-minimal-color); } 214 | 215 | @btn-clean-color: #eee; 216 | .btn-clean { .button-clean(@btn-clean-color); } 217 | .btn-clean:hover { .button-clean-hover(@btn-clean-color); } 218 | .btn-clean:active { .button-clean-active(@btn-clean-color); } 219 | 220 | @btn-soft-color: #6C84AB; 221 | .btn-soft { .button-soft(@btn-soft-color); } 222 | .btn-soft:hover { .button-soft-hover(@btn-soft-color); } 223 | .btn-soft:active { .button-soft-active(@btn-soft-color); } 224 | 225 | @btn-pill-color: #6C84AB; 226 | .btn-pill { .button-pill(@btn-pill-color); } 227 | .btn-pill:hover { .button-pill-hover(@btn-pill-color); } 228 | .btn-pill:active { .button-pill-active(@btn-pill-color); } 229 | 230 | @btn-gloss-color: #172D6E; 231 | .btn-gloss { .button-gloss(@btn-gloss-color); } 232 | .btn-gloss:hover { .button-gloss-hover(@btn-gloss-color); } 233 | .btn-gloss:active { .button-gloss-active(@btn-gloss-color); } 234 | 235 | 236 | .bar-minimal { .bar-minimal(@btn-minimal-color); } 237 | .bar-clean { .bar-clean(@btn-clean-color); } 238 | .bar-soft { .bar-soft(@btn-soft-color); } 239 | .bar-pill { .bar-pill(@btn-pill-color); } 240 | .bar-gloss { .bar-gloss(@btn-gloss-color); } -------------------------------------------------------------------------------- /styles/base/grid.less: -------------------------------------------------------------------------------- 1 | /** 2 | * Hybrid Grid Sytem 3 | * 4 | * Blend of the Semantic Grid System and Zurb Foundation with a little Twitter Bootstrap 5 | */ 6 | 7 | /* Settings */ 8 | 9 | @import 'variables.less'; 10 | 11 | /* 12 | @fixed-column-width: 40px; 13 | @fixed-gutter-width: 20px; 14 | @fixed-columns: 12; 15 | 16 | @fluid-column-width: 4.3%; 17 | @fluid-gutter-width: 4.4%; 18 | @fluid-columns: 12; 19 | 20 | @mobile-break-width: 480px; 21 | @mobile-column-width: 8.6%; 22 | @mobile-gutter-width: 8.8%; 23 | @mobile-columns: 6; 24 | */ 25 | 26 | /* Grid */ 27 | 28 | #grid { 29 | 30 | .cols(@cols,@width,@gutter){ 31 | .border-box(); 32 | width: ((@cols * @width) + ((@cols - 1) * @gutter)); 33 | margin-left: @gutter; 34 | position: relative; 35 | display: inline; 36 | float: left; 37 | min-height: 1px; 38 | &:first-child { 39 | margin-left: 0; 40 | } 41 | &:last-child { 42 | float: right; 43 | } 44 | } 45 | 46 | } 47 | 48 | .grid-fixed,.grid-fluid { 49 | .clearfix; 50 | .row { 51 | .border-box(); 52 | display: block; 53 | width: 100%; 54 | margin: 0 auto; 55 | .clearfix; 56 | 57 | .center,.center:last-child { 58 | float: none; 59 | display: block; 60 | margin: 0 auto; 61 | } 62 | } 63 | } 64 | 65 | .grid-fixed { 66 | @total-width: (@fixed-column-width*@fixed-columns) + (@fixed-gutter-width*(@fixed-columns - 1)); 67 | @column-width: @fixed-column-width; 68 | @gutter-width: @fixed-gutter-width; 69 | @columns: @fixed-columns; 70 | width: @total-width; 71 | 72 | /* This is duplicated in both classes. Unavoidable. */ 73 | .colX (@index) when (@index > 0) { 74 | (~".col@{index}") { 75 | #grid > .cols(@index,@column-width,@gutter-width); 76 | } 77 | .colX(@index - 1); 78 | } 79 | .colX (0) {} 80 | .colX(@columns); 81 | 82 | .offsetX (@index) when (@index > 0) { 83 | (~".offset@{index}") { 84 | margin-left: (@index * @column-width) + ((@index + 1) * @gutter-width); 85 | } 86 | .offsetX(@index - 1); 87 | } 88 | .offsetX (0) {} 89 | .offsetX(@columns - 1); 90 | 91 | .pushX (@index) when (@index > 0) { 92 | (~".push@{index}") { 93 | left: @index * (@column-width + @gutter-width); 94 | } 95 | .pushX(@index - 1); 96 | } 97 | .pushX (0) {} 98 | .pushX(@columns - 1); 99 | 100 | .pullX (@index) when (@index > 0) { 101 | (~".pull@{index}") { 102 | right: @index * (@column-width + @gutter-width); 103 | } 104 | .pullX(@index - 1); 105 | } 106 | .pullX (0) {} 107 | .pullX(@columns - 1); 108 | } 109 | 110 | 111 | .grid-fluid { 112 | @total-width: 100%; 113 | @column-width: @fluid-column-width; 114 | @gutter-width: @fluid-gutter-width; 115 | @columns: @fluid-columns; 116 | width: @total-width; 117 | 118 | /* This is duplicated in both classes. Unavoidable. */ 119 | .colX (@index) when (@index > 0) { 120 | (~".col@{index}") { 121 | #grid > .cols(@index,@column-width,@gutter-width); 122 | } 123 | .colX(@index - 1); 124 | } 125 | .colX (0) {} 126 | .colX(@columns); 127 | 128 | .offsetX (@index) when (@index > 0) { 129 | (~".offset@{index}") { 130 | margin-left: (@index * @column-width) + ((@index + 1) * @gutter-width); 131 | } 132 | .offsetX(@index - 1); 133 | } 134 | .offsetX (0) {} 135 | .offsetX(@columns - 1); 136 | 137 | .pushX (@index) when (@index > 0) { 138 | (~".push@{index}") { 139 | left: @index * (@column-width + @gutter-width); 140 | } 141 | .pushX(@index - 1); 142 | } 143 | .pushX (0) {} 144 | .pushX(@columns - 1); 145 | 146 | .pullX (@index) when (@index > 0) { 147 | (~".pull@{index}") { 148 | right: @index * (@column-width + @gutter-width); 149 | } 150 | .pullX(@index - 1); 151 | } 152 | .pullX (0) {} 153 | .pullX(@columns - 1); 154 | } 155 | 156 | 157 | @media all and (max-width: @mobile-break-width) { 158 | 159 | // Reset all columns to full width 160 | .grid-fixed { 161 | .colX (@index) when (@index > 0) { 162 | (~".col@{index}") { 163 | width: 100%; 164 | margin: 0; 165 | left: 0; 166 | right: 0; 167 | } 168 | .colX(@index - 1); 169 | } 170 | .colX (0) {} 171 | .colX(@fixed-columns); 172 | } 173 | .grid-fluid { 174 | .colX (@index) when (@index > 0) { 175 | (~".col@{index}") { 176 | width: 100%; 177 | margin: 0; 178 | left: 0; 179 | right: 0; 180 | } 181 | .colX(@index - 1); 182 | } 183 | .colX (0) {} 184 | .colX(@fluid-columns); 185 | } 186 | 187 | .grid-fixed, .grid-fluid { 188 | @total-width: 100%; 189 | @column-width: @mobile-column-width; 190 | @gutter-width: @mobile-gutter-width; 191 | @columns: @mobile-columns; 192 | width: @total-width; 193 | 194 | .m-colX (@index) when (@index > 0) { 195 | (~".m-col@{index}") { 196 | #grid > .cols(@index,@column-width,@gutter-width); 197 | } 198 | .m-colX(@index - 1); 199 | } 200 | .m-colX (0) {} 201 | .m-colX(@mobile-columns); 202 | 203 | .m-offsetX (@index) when (@index > 0) { 204 | (~".m-offset@{index}") { 205 | margin-left: (@index * @column-width) + ((@index + 1) * @gutter-width); 206 | } 207 | .m-offsetX(@index - 1); 208 | } 209 | .m-offsetX (0) {} 210 | .m-offsetX(@columns - 1); 211 | 212 | .m-pushX (@index) when (@index > 0) { 213 | (~".m-push@{index}") { 214 | left: @index * (@column-width + @gutter-width); 215 | } 216 | .m-pushX(@index - 1); 217 | } 218 | .m-pushX (0) {} 219 | .m-pushX(@columns - 1); 220 | 221 | .m-pullX (@index) when (@index > 0) { 222 | (~".m-pull@{index}") { 223 | right: @index * (@column-width + @gutter-width); 224 | } 225 | .m-pullX(@index - 1); 226 | } 227 | .m-pullX (0) {} 228 | .m-pullX(@columns - 1); 229 | } 230 | 231 | } 232 | -------------------------------------------------------------------------------- /_posts/04-02-01-Composer-and-Packagist.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Composer ve Packagist 3 | isChild: true 4 | anchor: composer_ve_packagist 5 | --- 6 | 7 | ## Composer ve Packagist {#composer_ve_packagist_title} 8 | 9 | Composer PHP için **muhteşem** bir bağımlılık yönetimi aracıdır. Bağımlılık 10 | yönetimini bir kaç basit komut ile `composer.json` dosyası içerisinde yazıyoruz, 11 | Composer projenizin ihtiyaçlarını otomatik olarak indiriyor ve kurulumunu 12 | gerçekleştiriyor. Composer Node.js'deki NPM ile veya Ruby'deki Bundler ile 13 | benzerdir. 14 | 15 | Composer ile uyumlu şimdiden projenizde kullanmanız için bir çok PHP kütüphanesi 16 | bulunmakta. Bu paketler Composer'ın resmi deposu olan [Packagist]'da 17 | listelenmetedir. 18 | 19 | ### Composer Nasıl Kurulur 20 | 21 | Yerel (önerilmemesine rağmen içinde bulunduğunuzu dizin için) ya da genel 22 | (örneğin: /usr/local/bin) kullanım için Composer'ı kurabilirsiniz. Global olarak 23 | kurmak için aşağıdaki örneğe bakınız: 24 | 25 | {% highlight console %} 26 | curl -sS https://getcomposer.org/installer | php 27 | mv composer.phar /usr/local/bin/composer 28 | {% endhighlight %} 29 | 30 | **Not:** Eğer `mv` ile ilgili bir izin hatası alıyorsanız `sudo` kullanabilirsiniz. 31 | 32 | Bu komut `composer.phar` (bir PHP ikili arşivi) dosyası indirecek. Bu dosyayı 33 | `php` kullanarak çalıştırabilir ve projenizin ihtiyaçlarını yönetebilirsiniz. 34 | 35 | Not: Kodu çevirici bir kaynağa indirdi iseniz öncelikle çevrim 36 | içi kod okuyunuz. 37 | 38 | #### Windows Kurulumu 39 | 40 | Windows kullanıcıları için [ComposerSetup] adında bir kurulum dosyası 41 | bulunmaktadır. Bu kurulum dosyası `$PATH` dizinine yani global dizine kurulum 42 | yapmaktadır. Kullanırken `composer` komutu ile direk çalışabilirsiniz. 43 | 44 | 45 | ### Composer Nasıl Kurulur (elle) 46 | 47 | Composer'i elle kurmak biraz üst seviye bir tekniktir. Ancak geliştiricinin 48 | etkileşimli kurulum yerine bu yöntemi kullanması için bir kaç sebep vardır. 49 | Etkilşimli kurulum aşağıdaki PHP kurulumlarını denetler: 50 | 51 | - PHP'nin yeterli bir sürümü kontrol edilir 52 | - `.phar` dosyası düzgün çalıştırılır. 53 | - Dizin izinleri kontrol edilir. 54 | - Sorunlu uzantılar yüklenmez. 55 | - Belirli `php.ini` ayarları ayarlanır.  56 | 57 | Bu kurulum adımlarının hiçbiri olmadan yapılan elle kurulumda, sizin için bir 58 | değerinin olup olmadığına karar vermelisiniz. Aşağıdaki komutlar ile elle 59 | kuruluma başlayalım : 60 | 61 | {% highlight console %} 62 | curl -s https://getcomposer.org/composer.phar -o $HOME/local/bin/composer 63 | chmod +x $HOME/local/bin/composer 64 | {% endhighlight %} 65 | 66 | `$HOME/local/bin` dizini (ya da sizin seçeceğiniz bir dizin) sizin `$PATH` 67 | değişkeninizin içerisinde olmalı. Bu `composer` komutunu kullanılabilir 68 | yapacaktır. 69 | 70 | Dökümantasyonda karşılaştığımız `php composer.phar install` komutunu aşağıdaki 71 | gibi kullanabilirsiniz : 72 | 73 | {% highlight console %} 74 | composer install 75 | {% endhighlight %} 76 | 77 | Bu bölüm compeser'ın global olarak nasıl kurulduğunu varsayar. 78 | 79 | ### Bağımlıklıkları Nasıl Tanımlar ve Kurarız 80 | 81 | Composer proje bağımlılığını `composer.json` isimli bir dosya ile sağlar. 82 | Bu dosyayı elle ya da Composer vasıtasıyla güncelleyebilirsiniz. 83 | `composer.phar require` komutu projenize bağımlılığı ekler ve daha önce 84 | oluşturmamış iseniz `composer.json` dosyanızı oluşturur. Aşağıda bir örnek 85 | yapalım ve projemize [Twig]'i ekleyelim. 86 | 87 | {% highlight console %} 88 | composer require twig/twig:~1.8 89 | {% endhighlight %} 90 | 91 | `composer init` komutu sana tam bir `composer.json` dosyası oluşturmak için 92 | rehber olabilir. Herhangi bir şekilde `composer.json` dosyanızı oluşturduktan 93 | sonra aşağıdaki komutu kullanarak Composer ile bağımlılıklarınızı `vendor/` 94 | dizini altına indirebilir ve yükleyebilirsiniz. 95 | 96 | {% highlight console %} 97 | composer install 98 | {% endhighlight %} 99 | 100 | Daha sonra aşağıdaki satırları uygulamanızın ana PHP dosyasına ekleyiniz; 101 | bunları nasıl yapacağınız size zaten Composer'daki projelerde bildirilecek. 102 | 103 | {% highlight php %} 104 | echo $foo; 16 | Notice: Undefined variable: foo in php shell code on line 1 17 | {% endhighlight %} 18 | 19 | Bu en düşük seviyede bir hata uyarısı oluşurur ve PHP mutlu mesut çalışmaya devam eder. Bu durum "exception-heavy" programlama geçmişinden gelenlere karmaşık ve saçma gelebilir.Örneğin Python bu durumda bir exception fırlatıp çalışmayı durduracaktır: 20 | 21 | {% highlight python %} 22 | $ python 23 | >>> print foo 24 | Traceback (most recent call last): 25 | File "", line 1, in 26 | NameError: name 'foo' is not defined 27 | {% endhighlight %} 28 | 29 | Aslında tek gerçek fark, Python'un küçük de olsa herhangi bir şey için çalışmayı durdurmasıdır, böylece geliştiriciler herhangi bir olası sorunun veya aykırı durumun olmadığından emin olabilirler. Bunun yanında PHP hata raporladığı ve oluşurdu bir durum olmadıkça işleme devam edecektir. 30 | 31 | ### Hata Ciddiyeti 32 | 33 | PHP farklı hata ciddiyet seviyesine sahiptir. En yaygın üç mesaj türü hatalar, bildirimler ve uyarılardır. Bunlar farklı şiddet derecelerine sahiptir; `E_ERROR`, `E_NOTICE`, and `E_WARNING`. Hatalar ölümcül çalışma zamanı hatalarıdır ve genellikle kodunuzdaki hatalardan kaynaklanır ve PHP'nin çalışmayı durdurmasına neden olacağı için düzeltilmesi gerekir. Bildirimler ölümcül olmayan hatalardır, komut dizisinin çalıştırılması durdurulmaz. Uyarılar kodun neden olduğu veya komut dosyasının çalıştırılması sırasında sorun çıkarmayabilecek öneri mesajlarıdır ve kodun çalıştırmasını durdurmaz. 34 | 35 | Derleme zamanında bildirilen başka bir hata mesajı türü ise `E_STRICT` mesajlarıdır. Bu mesajlar ortak çalışabilirliği sağlamak ve PHP'nin yaklaşmakta olan sürümleriyle uyumluluk sağlamak için kodunuzdaki değişiklikler önermek için kullanılır. 36 | 37 | ### PHP'nin Hata Raporlama Davranışını Değiştirme 38 | 39 | Hata raporlama şekli PHP ayarlarını değiştirerek ya da fonksiyon kullanarak değiştirilebilir. PHP'nin yerleşik fonksiyonlarından `error_reporting()` ile ön tanımlı hata seviyesi değerlerini kullanarak hata seviyesini belirleyebilirsiniz. Örneğin sadece uyarı ve hataları görmek ama bildirimleri görmek istemiyorsanız aşağıdaki gibi ayarlama yapabilirsiniz: 40 | 41 | {% highlight php %} 42 | error_reporting(E_ERROR | E_WARNING); 43 | {% endhighlight %} 44 | 45 | Ayrıca, hataların ekrana yazılıp (geliştirme ortamı için gerekli) yazılmamasını ve log dosyasına kaydedilmesini (canlı ortamlara daha uygun) ayarlayabilirsiniz. Daha fazla bilgi için [Error Reporting][errorreport] bölümüne bakabilirsiniz. 46 | 47 | ### Hata Yazdırmayı Önleme 48 | 49 | PHP'ye, hata kontrol operatörü `@` ile ilgili hataları saklamasını da söyleyebilirsiniz. Bu işleci bir ifadenin başlangıcına koyarsınız ve ifadenin doğrudan sonucu olan herhangi bir hata gizlenir. 50 | 51 | {% highlight php %} 52 | echo @$foo['bar']; 53 | {% endhighlight %} 54 | 55 | Yukarıdaki örnekte eğer `$foo['bar']` değeri varsa ekrana yazdırılır, ama `$foo` değişkeni yada 56 | `'bar'` elamanı null döner ve ekrana hiçbirşey yazmaz. Eğer hata kontrol operatörü kullanılmazsa, bu satır `PHP Notice: Undefined variable: foo` ya da `PHP Notice: Undefined index: bar` hatalarına sebep olur. 57 | 58 | Bu kullanım güzel birşeymiş gibi görünse de bazı istenmeyen durumlara da yol açabilir. PHP `@` barındıran satırları `@` barındırmayan satırlara göre daha yavaş işler. Erken (alt seviye) optimizasyon tartışmalı bir konu olabilir, ancak uygulamanız veya kütüphaneniz için performans özellikle önemliyse, hata kontrol operatörünün performans etkilerini anlamak önemlidir. 59 | 60 | İkinci önemli bir konu ise, hata kontrol operatörü oluşan hatayı **tamamen** gizler. Hata ekrana basılmadığı gibi herhangi bir log dosyasına da gönderilmez. Ayrıca PHP'nin hata kontrol operatörünü kapatma gibi bir ayarı veya özelliği de yoktur. Farkında olmadığınız daha az tehlikeli olduğunu düşündüğünüz bir hatanın farkında olduğunuz bir hatadan daha zararlı oluduğunu kabul edebiliriz. 61 | 62 | Eğer hata kontrol operaötürün kullanmadan yazabiliyorsanız, o yolu seçmeniz daha doğrdur. Yukarıda örnek olarak kullandığımız satır şöyle yazılabilir; 63 | 64 | {% highlight php %} 65 | echo isset($foo['bar']) ? $foo['bar'] : ''; 66 | {% endhighlight %} 67 | 68 | Hata kontrol öperatörünün kullanılmasının faydalı olduğu bir durum da `fopen()` fonksiyonu kullanılmasıdır. Dosyayı okumadan önce var olup olmadığını kontrol edebilirsiniz ama az da olsa `fopen()` çalışmadan önce dosyanın silinmesi ihtimali vardır. Bu durumda `fopen()` fonksiyonu false döner ve hata fırlatır. Bu PHP'nin çözmesi gereken bir konu ama şimdilik hata kontrol operatörünün kullanılmasının en haklı olduğu durum gibi duruyor. 69 | 70 | Daha önce de belirttiğimiz gibi PHP'nin ayarlarında hata kontrol operatörü kapatmanın hiçbir yolu yoktur. Ama [xDebug] eklentisinin `xdebug.scream` ayarı ile hata kontrol operatörünü etkisiz hale getirebilirsiniz. Bu ayar değişikliğini `php.ini` dosyasında aşağıdaki gibi yapabilirsiniz. 71 | 72 | xdebug.scream = On 73 | 74 | Çalışma anında bu değişikliği `ini_set` fonksiyonu ile aşağıdaki gibi de yapabilirsiniz. 75 | 76 | {% highlight php %} 77 | ini_set('xdebug.scream', '1') 78 | {% endhighlight %} 79 | 80 | "[Scream]" PHP eklentisi de benzer ayarı yapmanızı sağlar. Scream eklentisinin ayarı ise `scream.enabled` şeklindedir. 81 | 82 | Bu eklenti hata ayıklama yaparken ve ya hataların ekrana yazılmasının kapatıldığını düşündüğünüz durumlarda kullanabilirsiniz. Bu şekilde kullanırken dikkatli olmalısınız çünkü bazı kütüphaneler hata kontrol operatörü kapatıldığında çalışmayabilir. 83 | 84 | 85 | * [Error Control Operators](http://php.net/manual/en/language.operators.errorcontrol.php) 86 | * [SitePoint](http://www.sitepoint.com/) 87 | * [xDebug] 88 | * [Scream] 89 | 90 | [xDebug]: http://xdebug.org/docs/basic 91 | [Scream]: http://www.php.net/manual/en/book.scream.php 92 | 93 | ### ErrorException 94 | 95 | PHP mükemmel bir "exception odaklı" programlama dili olma yeteneğine sahiptir ve geçiş yapmak için sadece birkaç satır kod gerektirir. Temel olarak, "Exception" sınıfından türeyen "ErrorException" sınıfını kullanarak hataları "Exception" olarak atabilirsiniz. 96 | 97 | Bu, Symfony ve Laravel gibi çok sayıda modern uygulama çatıları tarafından uygulanan yaygın bir uygulamadır. Varsayılan olarak Laravel `app.debug` anahtarı açıksa, [Whoops!] Paketini kullanarak tüm hataları Exception olarak görüntüler, anahtar kapalıysa hataları gizler. 98 | 99 | Hataları geliştirme aşamasında Exception olarak atarak, bunları normal sonuçtan daha iyi bir şekilde ele alabilir ve geliştirme sırasında bir Exception görürseniz, durumu nasıl ele alacağınızla ilgili özel talimatlar içeren bir "catch" ifadesi içine alabilirsiniz. Çalışma anında yakaladığınız her Exceptiom, uygulamanızı daha da sağlam kılar. 100 | 101 | `ErrorException` hakkında daha fazla bilgiyi [ErrorException Class][errorexception] sayfasından bulabilirsiniz. 102 | 103 | * [Error Control Operators](http://php.net/manual/en/language.operators.errorcontrol.php) 104 | * [Predefined Constants for Error Handling](http://www.php.net/manual/en/errorfunc.constants.php) 105 | * [error_reporting](http://www.php.net/manual/en/function.error-reporting.php) 106 | * [Reporting][errorreport] 107 | 108 | [errorexception]: http://php.net/manual/en/class.errorexception.php 109 | [errorreport]: /#error_reporting 110 | [Whoops!]: http://filp.github.io/whoops/ 111 | -------------------------------------------------------------------------------- /_posts/05-05-01-PHP-and-UTF8.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: UTF-8 ile Çalışmak 3 | isChild: true 4 | anchor: php_and_utf8 5 | --- 6 | 7 | ## UTF-8 ile Çalışmak {#php_and_utf8_title} 8 | 9 | Bu bölüm orjinalde [Alex Cabal](https://alexcabal.com/) tarafından 10 | [PHP Best Practices](https://phpbestpractices.org/#utf-8) sayfasında yazılmıştır 11 | ve kendi tavsiyelerimizin temelinde kullanılmıştır. 12 | 13 | ### Dikkatli, Ayrıntılı ve Tutarlı Olun. 14 | 15 | Şu anki PHP alt seviyelerinde Unicode desteklemiyor. UTF-8 metinlerin işlenmesi 16 | için çeşitli yolları var, ama bu çok kolay değil ve bu web uygulamanızın hemen 17 | hemen her seviyesinde değişikliğe neden olacak. HTML'den SQL'e PHP'ye. Size 18 | pratik bir özet sunmayı amaçlıyoruz. 19 | 20 | ### PHP Seviyesinde UTF-8 21 | 22 | İki metni birleştirmek ve bir metni bir değişkene atama gibi basit metin 23 | işlemlerinde, UTF-8 için özel bir şey yapmanız gerekmiyor. Ama `strpos()` ve 24 | `strlen()` gibi çoğu metin fonksiyonlarında özel bir dikkat gerekmektedir. Bu 25 | fonksiyonların sıksık `mb_*` benzerlerine sahiptir. Örneğin, `mb_strpos()` ve 26 | `mb_strlen()` gibi. Bu `mb_*` fonskiyonları, metinleri, [Multibyte String Extension]'ı 27 | ile Unicode metinler üzerinde işlem yapabilecek hale getirmektedir. 28 | 29 | Ne zaman Unicode metinler üzerinde işlem yapacaksanız `mb_*` fonskiyonlarını 30 | kullanmalısınız. Örneğin, `substr()` fonksiyonunu UTF-8 metinler üzerinde 31 | kullanırsanız; sonuç olarak bazı bozuk karakterler ile karşılaşabilirsiniz. 32 | Kullanmanız gereken doğru fonksiyon `mb_substr()`dir. 33 | 34 | Zor kısmı `mb_*` fonksiyonlarını hatırlamak. Eğer unutursanız Unicode metinlerde 35 | metinlerin bozuk çıkma ihtimalleri var. 36 | 37 | Bütün metinler `mb_*` kullanmak zorunda değiller. Eğer yapmak istediğiniz şey 38 | için birden fazla yol varsa, bozuk karakterlerden kurtulmak için şansınız 39 | olabilir. 40 | 41 | `mb_internal_encoding()` fonksiyonunu her PHP dosyanızın başında (ya da her yere 42 | include ettiğiniz dosyanın başında) kullanabilirsiniz, ve `mb_http_output()` 43 | fonksiyonunu browser'a çıktı vermek için kullanabilirsiniz. Açıkça her kodunuzda 44 | encoding bilgisini tanımlamanız ileride karşınıza çıkacak bir sürü baş ağrısından 45 | sizi kurtaracaktır. 46 | 47 | Ek olarak, bir çok PHP fonksiyonu opsiyonel parametreler ile sizin metninizi 48 | seçtiğiniz bir encoding ile işleme tabi tutar. 49 | 50 | Her zaman UTF-8 olarak göstermelisiniz. Örneğin `htmlentities()` karakter 51 | encoding için bir opsiyonu bulunmaktadır, ve eğer bir metin ile ilişkili iseniz 52 | UTF-8 olarak belirtmelisiniz. Ayrıca, PHP 5.4.0'da `htmlentities()` ve 53 | `htmlspecialchars()` için varsayılan karakter encoding'i UTF-8'dir. 54 | 55 | Son olarak, eğer dağıtık bir uygulama kuruyorsanız ve `mbstring` eklentisinin 56 | açık olup olmadığından emin olamazsanız, [patchwork/utf8] Composer paketini 57 | kullanmayı deneyebilirsiniz. Bu paket eğer uygunsa `mbstring` kullanır. 58 | 59 | [Multibyte String Extension]: http://php.net/manual/tr/book.mbstring.php 60 | [patchwork/utf8]: https://packagist.org/packages/patchwork/utf8 61 | 62 | ### Veritabanı Seviyesinde UTF-8 63 | 64 | Eğer MYSQL kullanıyorsanız, yukarıda belirtilen önlemleri alsanız bile 65 | verilerinizin UTF-8 olamyan hallerini tutabilirsiniz. Verilerinizin veritabanına 66 | UTF-8 olarak kaydedildiğinden emin olmak için, tüm tablo ve veritabanlarınızın 67 | character set ve collation değerlerinin `utf8mb4` olduğundan emin olun ve 68 | PDO bağlantı metninde `utf8mb4` character set'ini kullanın. Örneği gözden 69 | geçirin. Bu _özellikle önemli_. 70 | 71 | Not olarak, tamamen UTF-8 desteği için `utf8mb4` kullanmak zorundasınız, 72 | `utf8` değil. Nedeni için okumaya devam edin. 73 | 74 | ### Browser Seviyesinde UTF-8 75 | 76 | PHP kodunuzun çıktısının UTF-8 formatında browser'a gittiğinden emin olmak için 77 | `mb_http_output()` fonksiyonu kullanın. 78 | 79 | The browser will then need to be told by the HTTP response that this page should be considered as UTF-8. The historic approach to doing that was to include the [charset `` tag](http://htmlpurifier.org/docs/enduser-utf8.html) in your page's `` tag. This approach is perfectly valid, but setting the charset in the `Content-Type` header is actually [much faster](https://developers.google.com/speed/docs/best-practices/rendering#SpecifyCharsetEarly). 80 | 81 | {% highlight php %} 82 | \PDO::ERRMODE_EXCEPTION, 104 | \PDO::ATTR_PERSISTENT => false 105 | ) 106 | ); 107 | 108 | // Değiştirdiğimiz metni UTF-8 olarak veritabanına kaydediyoruz 109 | // Veritabanı ve tablolarınız utf8bm4 formatında değil mi? 110 | $handle = $link->prepare('insert into ElvishSentences (Id, Body) values (?, ?)'); 111 | $handle->bindValue(1, 1, PDO::PARAM_INT); 112 | $handle->bindValue(2, $string); 113 | $handle->execute(); 114 | 115 | // Düzgün kaydedildiğini görmek için metni tekrar alıyoruz. 116 | $handle = $link->prepare('select * from ElvishSentences where Id = ?'); 117 | $handle->bindValue(1, 1, PDO::PARAM_INT); 118 | $handle->execute(); 119 | 120 | // Birazdan bilgiyi HTML olarak bastıracağız 121 | $result = $handle->fetchAll(\PDO::FETCH_OBJ); 122 | 123 | header('Content-Type: text/html; charset=utf-8'); 124 | ?> 125 | 126 | 127 | UTF-8 test sayfası 128 | 129 | 130 | Body); // This should correctly output our transformed UTF-8 string to the browser 133 | } 134 | ?> 135 | 136 | 137 | {% endhighlight %} 138 | 139 | ### Daha fazla bilgi 140 | 141 | * [PHP Manual: String Operations](http://php.net/language.operators.string) 142 | * [PHP Manual: String Functions](http://php.net/ref.strings) 143 | * [`strpos()`](http://php.net/function.strpos) 144 | * [`strlen()`](http://php.net/function.strlen) 145 | * [`substr()`](http://php.net/function.substr) 146 | * [PHP Manual: Multibyte String Functions](http://php.net/ref.mbstring) 147 | * [`mb_strpos()`](http://php.net/function.mb-strpos) 148 | * [`mb_strlen()`](http://php.net/function.mb-strlen) 149 | * [`mb_substr()`](http://php.net/function.mb-substr) 150 | * [`mb_internal_encoding()`](http://php.net/function.mb-internal-encoding) 151 | * [`mb_http_output()`](http://php.net/function.mb-http-output) 152 | * [`htmlentities()`](http://php.net/function.htmlentities) 153 | * [`htmlspecialchars()`](http://php.net/function.htmlspecialchars) 154 | * [PHP UTF-8 Cheatsheet](http://blog.loftdigital.com/blog/php-utf-8-cheatsheet) 155 | * [Handling UTF-8 with PHP](http://www.phpwact.org/php/i18n/utf-8) 156 | * [Stack Overflow: What factors make PHP Unicode-incompatible?](http://stackoverflow.com/questions/571694/what-factors-make-php-unicode-incompatible) 157 | * [Stack Overflow: Best practices in PHP and MySQL with international strings](http://stackoverflow.com/questions/140728/best-practices-in-php-and-mysql-with-international-strings) 158 | * [How to support full Unicode in MySQL databases](http://mathiasbynens.be/notes/mysql-utf8mb4) 159 | * [Bringing Unicode to PHP with Portable UTF-8](http://www.sitepoint.com/bringing-unicode-to-php-with-portable-utf8/) 160 | * [Stack Overflow: DOMDocument loadHTML does not encode UTF-8 correctly](http://stackoverflow.com/questions/8218230/php-domdocument-loadhtml-not-encoding-utf-8-correctly) -------------------------------------------------------------------------------- /styles/base/typography.less: -------------------------------------------------------------------------------- 1 | /** 2 | * Name Here 3 | * 4 | * @version 1.0 5 | * @package Name Here 6 | * @author New Media Campaigns 7 | * @copyright 2012 New Media Campaigns 8 | * @link http://www.newmediacampaigns.com 9 | * 10 | * Copyright (c) 2012 New Media Campaigns 11 | * 12 | * Permission is hereby granted, free of charge, to any person obtaining a copy 13 | * of this software and associated documentation files (the "Software"), to deal 14 | * in the Software without restriction, including without limitation the rights 15 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | * copies of the Software, and to permit persons to whom the Software is furnished 17 | * to do so, subject to the following conditions: 18 | * 19 | * The above copyright notice and this permission notice shall be included in all 20 | * copies or substantial portions of the Software. 21 | * 22 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 28 | * THE SOFTWARE. 29 | */ 30 | 31 | /** 32 | * Typography 33 | * 34 | * This LESS file defines the baseline, color, font-size, and other typographical 35 | * styles for text elements. 36 | */ 37 | 38 | /* Settings */ 39 | 40 | @import 'variables.less'; 41 | 42 | /* 43 | @baseline: @baseline; 44 | 45 | @body-color: @body-color; 46 | @body-font-family: @body-font-family; 47 | @body-font-size: @body-font-size; 48 | @body-accent-color: @body-accent-color; 49 | 50 | @header-color: @header-clor; 51 | @header-font-family: @header-font-family; 52 | @header-font-weight: @header-font-weight; 53 | */ 54 | 55 | /* Base */ 56 | 57 | html, body { 58 | font-family: @body-font-family; 59 | color: @body-color; 60 | font-size: @body-font-size; 61 | .lhs; 62 | } 63 | 64 | /* Block-level */ 65 | 66 | h1, h2, h3, h4, h5, h6, ul, ol, dl, p, blockquote, table, form, pre{ 67 | .mbs; 68 | } 69 | 70 | /* Headers */ 71 | 72 | .all-headers{ 73 | color: @header-color; 74 | font-family: @header-font-family; 75 | font-weight: @header-font-weight; 76 | } 77 | h1, .alpha{ 78 | .all-headers; 79 | font-size: @body-font-size * 2.5; 80 | .lhd; 81 | } 82 | h2, .beta{ 83 | .all-headers; 84 | font-size: @body-font-size * 1.75; 85 | .lhd; 86 | } 87 | h3, .gamma{ 88 | .all-headers; 89 | font-size: @body-font-size * 1.2; 90 | .lhd; 91 | .mbn; 92 | } 93 | h4, .delta{ 94 | .all-headers; 95 | font-size: @body-font-size * 1; 96 | .lhd; 97 | .mbn; 98 | } 99 | h5, .epsilon{ 100 | .all-headers; 101 | font-size: @body-font-size * 1; 102 | .lhs; 103 | .mbn 104 | } 105 | h6, .zeta{ 106 | .all-headers; 107 | font-size: @body-font-size * 1; 108 | .lhs; 109 | .mbn; 110 | } 111 | 112 | /* Headers (above scale) */ 113 | 114 | .giga{ 115 | .all-headers; 116 | font-size: @body-font-size * 6; 117 | line-height: @baseline * 4; 118 | } 119 | .mega{ 120 | .all-headers; 121 | font-size: @body-font-size * 5; 122 | line-height: @baseline * 3; 123 | } 124 | .kilo{ 125 | .all-headers; 126 | font-size: @body-font-size * 4; 127 | line-height: @baseline * 3; 128 | } 129 | 130 | /* Headers (below scale) */ 131 | 132 | .milli{ 133 | .all-headers; 134 | font-size: @body-font-size * 0.8; 135 | } 136 | 137 | /* Text */ 138 | 139 | a{ 140 | color: @body-accent-color; 141 | } 142 | a:link{ 143 | text-decoration: underline; 144 | } 145 | a:visited{ 146 | 147 | } 148 | a:hover{ 149 | text-decoration: none; 150 | } 151 | a:active{ 152 | 153 | } 154 | a:focus{ 155 | 156 | } 157 | small { 158 | font-size: 80%; 159 | } 160 | sup, sub { 161 | font-size: 80%; 162 | .lhn; 163 | } 164 | sup { 165 | vertical-align: super; 166 | } 167 | sub { 168 | vertical-align: sub; 169 | } 170 | 171 | .lead{ 172 | color: darken(@body-color, 20%); 173 | font-size: @baseline * 0.8; 174 | } 175 | 176 | blockquote{ 177 | border-left: 5px solid fade(#000, 10%); 178 | .mhs; 179 | .pls; 180 | color: lighten(@body-color, 20%); 181 | font-size: @baseline * 0.8; 182 | font-style: italic; 183 | 184 | :last-child{ 185 | .mbn; 186 | } 187 | small{ 188 | color: fade(#000, 50%); 189 | font-size: @baseline * 0.7; 190 | font-style: normal; 191 | } 192 | } 193 | pre, code, kbd{ 194 | background: #F8F8F8; 195 | border: 1px solid #EAEAEA; 196 | .border-radius(3px); 197 | margin: 0 2px; 198 | padding: 0 5px; 199 | font-family: Consolas, "Courier New", Courier, mono; 200 | font-size: @body-font-size * 0.9; 201 | color: @body-color; 202 | word-wrap: break-word; 203 | } 204 | pre{ 205 | .mhs; 206 | .pah; 207 | 208 | code{ 209 | border: none; 210 | .man; 211 | .pan; 212 | } 213 | } 214 | a code{ 215 | background: none; 216 | border: none; 217 | .pan; 218 | .man; 219 | } 220 | strong{ 221 | font-weight: bold; 222 | } 223 | em{ 224 | font-style: italic; 225 | } 226 | ol, ul, dl{ 227 | .mls; 228 | .pls; 229 | ol,ul { 230 | .mbn; 231 | } 232 | } 233 | dt{ 234 | font-weight: bold; 235 | } 236 | dd{ 237 | .mls; 238 | } 239 | 240 | .table{ 241 | border-collapse: collapse; 242 | border-spacing: 0; 243 | width: 100%; 244 | } 245 | .table th, .table td{ 246 | border-top: 1px solid fade(#000, 10%); 247 | padding: 8px; 248 | text-align: left; 249 | } 250 | .table thead th{ 251 | vertical-align: bottom; 252 | font-weight: bold; 253 | } 254 | .table thead tr:first-child th{ 255 | border-top: none; 256 | } 257 | .table-bordered{ 258 | border: 1px solid fade(#000, 10%); 259 | border-collapse: separate; 260 | border-left: none; 261 | .border-radius(4px); 262 | 263 | th, td{ 264 | border-left: 1px solid fade(#000, 10%); 265 | } 266 | thead:last-child tr:last-child th:first-child, 267 | tbody:last-child tr:last-child td:first-child{ 268 | .border-radius(0 0 0 4px); 269 | } 270 | } 271 | .table-striped{ 272 | tbody tr:nth-child(odd) td{ 273 | background: fade(@body-accent-color, 4%); 274 | } 275 | } 276 | 277 | /* ========================================================================== 278 | Alerts 279 | ========================================================================== */ 280 | 281 | .alert{ 282 | background: #FCF8E3; 283 | border: 1px solid #FBEED5; 284 | .border-radius(4px); 285 | .mbs; 286 | .pah; 287 | color: #C09853; 288 | } 289 | .alert-success{ 290 | .alert; 291 | background-color: #DFF0D8; 292 | border-color: #D6E9C6; 293 | color: #468847; 294 | } 295 | .alert-error{ 296 | .alert; 297 | background-color: #F2DEDE; 298 | border-color: #EED3D7; 299 | color: #B94A48; 300 | } 301 | .alert-info{ 302 | .alert; 303 | background-color: #D9EDF7; 304 | border-color: #BCE8F1; 305 | color: #3A87AD; 306 | } 307 | 308 | /* ========================================================================== 309 | Forms 310 | ========================================================================== */ 311 | 312 | label{ 313 | display: block; 314 | font-weight: bold; 315 | 316 | .req{ 317 | color: @body-accent-color; 318 | font-weight: bold; 319 | } 320 | } 321 | input.text, 322 | textarea, 323 | select, 324 | .radio-group, 325 | .checkbox-group{ 326 | .mbs; 327 | } 328 | input.text, textarea{ 329 | .no-form; 330 | background: #EEE; 331 | border: 1px solid #CCC; 332 | .border-box; 333 | .border-radius(4px); 334 | .inner-shadow(fade(#000, 10%) 0 1px 3px); 335 | height: @baseline * 1.5; 336 | .pah; 337 | width: 100%; 338 | } 339 | textarea{ 340 | height: @baseline * 6; 341 | } 342 | select{ 343 | min-width: 30%; 344 | } 345 | .checkbox-group label, 346 | .radio-group label{ 347 | font-weight: normal; 348 | } 349 | .error{ 350 | background-color: #F2DEDE !important; 351 | border-color: red !important; 352 | outline-color: red !important; 353 | color: red !important; 354 | } 355 | -------------------------------------------------------------------------------- /pages/Design-Patterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Design Patterns 4 | --- 5 | 6 | # Design Patterns 7 | 8 | Sizin web uygulamanızı oluşturmanız için bir çok kod ve proje yapısı mevcuttur ve az ya da 9 | çok düşünerek bu mimarileri kullanabilirsiniz. Ama genel desenleri kullanmak genellikle daha 10 | iyi fikirdir, çünkü kodunuzun daha temiz olmasını ve diğer geliştiriciler tarafından daha 11 | kolay anlaşılmasını sağlar. 12 | 13 | * [Architectural pattern on Wikipedia](https://en.wikipedia.org/wiki/Architectural_pattern) 14 | * [Software design pattern on Wikipedia](https://en.wikipedia.org/wiki/Software_design_pattern) 15 | 16 | ## Factory 17 | 18 | En çok kullanılan "design pattern"lerden birisi Factory Pattern'dir. Bu desende, bir sınıf 19 | basitçe kullanmak istediğiniz nesneyi oluşturur. Aşağıda bir örnekle bu deseni açıklayalım: 20 | 21 | {% highlight php %} 22 | vehicle_make = $make; 31 | $this->vehicle_model = $model; 32 | } 33 | 34 | public function get_make_and_model() 35 | { 36 | return $this->vehicle_make . ' ' . $this->vehicle_model; 37 | } 38 | } 39 | 40 | class AutomobileFactory 41 | { 42 | public static function create($make, $model) 43 | { 44 | return new Automobile($make, $model); 45 | } 46 | } 47 | 48 | // have the factory create the Automobile object 49 | $veyron = AutomobileFactory::create('Bugatti', 'Veyron'); 50 | 51 | print_r($veyron->get_make_and_model()); // outputs "Bugatti Veyron" 52 | {% endhighlight %} 53 | 54 | Bu kod bir Automobile nesnesini oluşturmak için bir factory kullanıyor. Kodunuzu 55 | bu şekilde kullanmanızın iki muhtemel yararı vardır. Birincisi, ilerde Automobile 56 | sınıfınızın ismini değiştirdiğinizde isim değişikliğini sadece Factory sınıfında 57 | yapmanız yeterli olacaktir. İkincisi, karmaşık işler yapan obje oluşturduğunuzda 58 | bütün işi factory sınıfında yapabilirsiniz, her seferinde işlemleri tekrarlamak 59 | yerine sadece yeni bir instance oluşturmanız yeterli olacaktır. 60 | 61 | Factory desenini kullanmak her zaman gerekli değildir. Örnek kod gereksiz 62 | karmaşıklık ekleyen çok basit bir factory örneğidir. Oldukça büyük ve karmaşık 63 | projelerde factory kullanarak kendinizi bir çok sorundan koruyabilirsiniz. 64 | 65 | * [Factory pattern on Wikipedia](https://en.wikipedia.org/wiki/Factory_pattern) 66 | 67 | ## Singleton 68 | 69 | When designing web applications, it often makes sense conceptually and architecturally to allow access to one and 70 | only one instance of a particular class. The singleton pattern enables us to do this. 71 | 72 | {% highlight php %} 73 | output = $outputType; 215 | } 216 | 217 | public function loadOutput() 218 | { 219 | return $this->output->load(); 220 | } 221 | } 222 | {% endhighlight %} 223 | 224 | The calling client class above has a private property which must be set at runtime and be of type 'OutputInterface' 225 | once this property is set a call to loadOutput() will call the load() method in the concrete class of the output type 226 | that has been set. 227 | {% highlight php %} 228 | setOutput(new ArrayOutput()); 234 | $data = $client->loadOutput(); 235 | 236 | // Want some JSON? 237 | $client->setOutput(new JsonStringOutput()); 238 | $data = $client->loadOutput(); 239 | 240 | {% endhighlight %} 241 | 242 | * [Strategy pattern on Wikipedia](http://en.wikipedia.org/wiki/Strategy_pattern) 243 | 244 | ## Front Controller 245 | 246 | The front controller pattern is where you have a single entrance point for you web application (e.g. index.php) that 247 | handles all of the requests. This code is responsible for loading all of the dependencies, processing the request and 248 | sending the response to the browser. The front controller pattern can be beneficial because it encourages modular code 249 | and gives you a central place to hook in code that should be run for every request (such as input sanitization). 250 | 251 | * [Front Controller pattern on Wikipedia](https://en.wikipedia.org/wiki/Front_Controller_pattern) 252 | 253 | ## Model-View-Controller 254 | 255 | The model-view-controller (MVC) pattern and its relatives HMVC and MVVM lets you break up code into logical objects that 256 | serve very specific purposes. Models serve as a data access layer where data is fetched and returned in formats usable 257 | throughout your application. Controllers handle the request, process the data returned from models and load views 258 | to send in the response. And views are display templates (markup, xml, etc) that are sent in the response to the web 259 | browser. 260 | 261 | 262 | MVC is the most common architectural pattern used in the popular [PHP frameworks](https://github.com/codeguy/php-the-right-way/wiki/Frameworks). 263 | 264 | Learn more about MVC and its relatives: 265 | 266 | * [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller) 267 | * [HMVC](https://en.wikipedia.org/wiki/Hierarchical_model%E2%80%93view%E2%80%93controller) 268 | * [MVVM](https://en.wikipedia.org/wiki/Model_View_ViewModel) 269 | --------------------------------------------------------------------------------