├── .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, =$this->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 | 
14 |
15 | {% highlight html %}
16 |
17 |
18 |
19 | {% endhighlight %}
20 |
21 | ## Düğme 2 (120x60)
22 |
23 | 
24 |
25 | {% highlight html %}
26 |
27 |
28 |
29 | {% endhighlight %}
30 |
31 | ## Geniş Dikdörtgen (728x90)
32 |
33 | 
34 |
35 | {% highlight html %}
36 |
37 |
38 |
39 | {% endhighlight %}
40 |
41 | ## Büyük Dikdörtgen (386x280)
42 |
43 | 
44 |
45 | {% highlight html %}
46 |
47 |
48 |
49 | {% endhighlight %}
50 |
51 | ## Orta Dikdörtgen (300x250)
52 |
53 | 
54 |
55 | {% highlight html %}
56 |
57 |
58 |
59 | {% endhighlight %}
60 |
61 | ## Dikdörtgen (180x150)
62 |
63 | 
64 |
65 | {% highlight html %}
66 |
67 |
68 |
69 | {% endhighlight %}
70 |
71 | ## Kare Düğme (125x125)
72 |
73 | 
74 |
75 | {% highlight html %}
76 |
77 |
78 |
79 | {% endhighlight %}
80 |
81 | ## Dikey Dikdörtgen (240x400)
82 |
83 | 
84 |
85 | {% highlight html %}
86 |
87 |
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 |
14 | query('SELECT * FROM table') as $row) {
16 | echo "- ".$row['field1']." - ".$row['field1']."
";
17 | }
18 |
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 | - = $row['field1'] ?>
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 |
--------------------------------------------------------------------------------