PHP strtotime() behavior using days of the week as frames of reference (Windows & Linux)

Say you want to get a set of timestamps so that you can query a database for all records that fall between the start of this week, and the end of this week.

One would logically try something like:


 

That will, in theory, give you a date range of Monday at 00:00:00, and Sunday at 23:59:59. Unforunately, that is not always the case.It turns out trying to find relative time references with strtotime is wonky. Depending on which day it currently is, and what day you’re trying to use as a frame of reference, you will get different results when using ‘this monday’ or ‘tuesday next week’ etc… The results are unintuitive, but more importantly, inconsistent in most cases.

Since strtotime() lets us do lazy math to get timestamps (e.g. ‘this monday – 1 week’), all we need to do is find some date string that works consistently 7 days of the week, and then we can reliably find other timestamps relative to that string. Any date string that does not have the same results for all 7 days, cannot be used as a frame of reference, as its value will change depending on what day it is!

From the tables below, we can see that the following three strings can be safely used as frames of reference in strtotime():


 

My suspicion is that certain strings consider Sunday to be the start of the week, while others consider Monday to be the start of the week, and probably round the time up or down in different ways.

Note that I have arbitrarily chosen Monday – March 4th, 2013 through Sunday – March 10th, 2013 as the week to test. Though given how wonky strtotime()’s behavior is, there’s a possibility that the behavior shown below varies from one week to the next! However, I did test various times throughout each day (e.g. 00:00:00 and 23:59:59) and thankfully the results were consistent.

So going back to our problem of getting timestamps for the start and end of this week, the cleanest and most reliable solution is this:

 

 

Using Monday as a frame of reference
If today = Mon, March 4th Tue, March 5th Wed, March 6th Thu, March 7th Fri, March 8th Sat, March 9th Sun, March 10th
strtotime(“this monday”) = March 4th March 11th March 11th March 11th March 11th March 11th March 11th
strtotime(“monday this week”) = March 4th March 4th March 4th March 4th March 4th March 4th March 11th
strtotime(“next monday”) = March 11th March 11th March 11th March 11th March 11th March 11th March 11th
strtotime(“monday next week”) = March 11th March 11th March 11th March 11th March 11th March 11th March 18th
strtotime(“last monday”) = February 25th March 4th March 4th March 4th March 4th March 4th March 4th
strtotime(“monday last week”) = February 25th February 25th February 25th February 25th February 25th February 25th March 4th
Using Tuesday as a frame of reference
If today = Mon, March 4th Tue, March 5th Wed, March 6th Thu, March 7th Fri, March 8th Sat, March 9th Sun, March 10th
strtotime(“this tuesday”) = March 5th March 5th March 12th March 12th March 12th March 12th March 12th
strtotime(“tuesday this week”) = March 5th March 5th March 5th March 5th March 5th March 5th March 12th
strtotime(“next tuesday”) = March 5th March 12th March 12th March 12th March 12th March 12th March 12th
strtotime(“tuesday next week”) = March 12th March 12th March 12th March 12th March 12th March 12th March 19th
strtotime(“last tuesday”) = February 26th February 26th March 5th March 5th March 5th March 5th March 5th
strtotime(“tuesday last week”) = February 26th February 26th February 26th February 26th February 26th February 26th March 5th
Using Wednesday as a frame of reference
If today = Mon, March 4th Tue, March 5th Wed, March 6th Thu, March 7th Fri, March 8th Sat, March 9th Sun, March 10th
strtotime(“this wednesday”) = March 6th March 6th March 6th March 13th March 13th March 13th March 13th
strtotime(“wednesday this week”) = March 6th March 6th March 6th March 6th March 6th March 6th March 13th
strtotime(“next wednesday”) = March 6th March 6th March 13th March 13th March 13th March 13th March 13th
strtotime(“wednesday next week”) = March 13th March 13th March 13th March 13th March 13th March 13th March 20th
strtotime(“last wednesday”) = February 27th February 27th February 27th March 6th March 6th March 6th March 6th
strtotime(“wednesday last week”) = February 27th February 27th February 27th February 27th February 27th February 27th March 6th
Using Thursday as a frame of reference
If today = Mon, March 4th Tue, March 5th Wed, March 6th Thu, March 7th Fri, March 8th Sat, March 9th Sun, March 10th
strtotime(“this thursday”) = March 7th March 7th March 7th March 7th March 14th March 14th March 14th
strtotime(“thursday this week”) = March 7th March 7th March 7th March 7th March 7th March 7th March 14th
strtotime(“next thursday”) = March 7th March 7th March 7th March 14th March 14th March 14th March 14th
strtotime(“thursday next week”) = March 14th March 14th March 14th March 14th March 14th March 14th March 21st
strtotime(“last thursday”) = February 28th February 28th February 28th February 28th March 7th March 7th March 7th
strtotime(“thursday last week”) = February 28th February 28th February 28th February 28th February 28th February 28th March 7th
Using Friday as a frame of reference
If today = Mon, March 4th Tue, March 5th Wed, March 6th Thu, March 7th Fri, March 8th Sat, March 9th Sun, March 10th
strtotime(“this friday”) = March 8th March 8th March 8th March 8th March 8th March 15th March 15th
strtotime(“friday this week”) = March 8th March 8th March 8th March 8th March 8th March 8th March 15th
strtotime(“next friday”) = March 8th March 8th March 8th March 8th March 15th March 15th March 15th
strtotime(“friday next week”) = March 15th March 15th March 15th March 15th March 15th March 15th March 22nd
strtotime(“last friday”) = March 1st March 1st March 1st March 1st March 1st March 8th March 8th
strtotime(“friday last week”) = March 1st March 1st March 1st March 1st March 1st March 1st March 8th
Using Saturday as a frame of reference
If today = Mon, March 4th Tue, March 5th Wed, March 6th Thu, March 7th Fri, March 8th Sat, March 9th Sun, March 10th
strtotime(“this saturday”) = March 9th March 9th March 9th March 9th March 9th March 9th March 16th
strtotime(“saturday this week”) = March 9th March 9th March 9th March 9th March 9th March 9th March 16th
strtotime(“next saturday”) = March 9th March 9th March 9th March 9th March 9th March 16th March 16th
strtotime(“saturday next week”) = March 16th March 16th March 16th March 16th March 16th March 16th March 23rd
strtotime(“last saturday”) = March 2nd March 2nd March 2nd March 2nd March 2nd March 2nd March 9th
strtotime(“saturday last week”) = March 2nd March 2nd March 2nd March 2nd March 2nd March 2nd March 9th
Using Sunday as a frame of reference
If today = Mon, March 4th Tue, March 5th Wed, March 6th Thu, March 7th Fri, March 8th Sat, March 9th Sun, March 10th
strtotime(“this sunday”) = March 10th March 10th March 10th March 10th March 10th March 10th March 10th
strtotime(“sunday this week”) = March 10th March 10th March 10th March 10th March 10th March 10th March 17th
strtotime(“next sunday”) = March 10th March 10th March 10th March 10th March 10th March 10th March 17th
strtotime(“sunday next week”) = March 17th March 17th March 17th March 17th March 17th March 17th March 24th
strtotime(“last sunday”) = March 3rd March 3rd March 3rd March 3rd March 3rd March 3rd March 3rd
strtotime(“sunday last week”) = March 3rd March 3rd March 3rd March 3rd March 3rd March 3rd March 10th

PHP Trait Kullanımı

PHP 5.4 ile gelen trait PHP’ye multi-inheritance özelliği getirdi. PHP’de 5.4 ten önce sınıflar sadece single-inheritance alabiliyordu. PHP trait bu duruma çok iyi bir çözüm oldu. Daha esnek bir yapı getirdi.

PHP’de trait nasıl kullanılır?
trait bir kendi başına bir sınıf gibidir. Ama bu trait lerden nesneler kuramıyoruz. Sadece yeni sınıflarda genişletebiliyor yeni metodlar ve alanlar ekleyebiliyoruz. Bir sınıfta istediğimiz kadar trait, bir trait ‘ide istediğimiz kadar sınıfın içinde kullanabiliyoruz. Bir sınıf içinde trait kullanmak için use anahtar kelimesini kullanıyoruz. Namespace ile karıştırılmamalıdır.
diyagram_1
Örnek bir trait kullanımı

Çıktı:

Yukarıdaki multi-inheritance için basit bir örnekti. Bir çok sınıf bir çok trait için bir örnek yapalım.

diyagram_2

Çıktı:

PHP – Soyut Sınıflar

webpage_coding_web_programming_html_script_php_code_website_application_java_css_development_editor_flat_design_icon-512

Soyut sınıflar içerisinde en az bir soyut metot bulunduran sınıflardır. Genel amaçları bir çok işi ortak yapan ortak sınıfları bir araya toplamaktır. Aşağıda buna uygun bir örnek verilmiştir.

Soyut sınıf denilmesinin sebebi soyut metotların sınıf içerisinde bir görev yapmaması miras yolu(kalıtım) ile kendinden türeyen sınıflara devretmesidir. Soyut sınıflar kendi içlerinde soyut metotlar dışında somut metotlarda bulundurabilir. Bu metotlar ezilmezler(override).

Metotlar ve veri alanları soyut sınıfta protected ve public olarak tanımlanmalıdır ki türeyen sınıfta kullanılabilsin. Sadece soyut sınıfta kullanılan bir veri alanı ise private olarak ta kullanılabilir.

Soyut sınıfta tanımlanmış bir durumda türeyen sınıfta ezilirken(override) erişim türünde kısıtlama yapılamaz. Örneğin; soyut sınıfta public olarak tanımlanan bir alan türetilmiş sınıfta public olmak zorundadır. Soyut sınıfta protected olarak tanımlanan bir alan protected veya public olmak zorundadır. Genişletilebilir ama daraltma yapılamaz.

Bir sınıfın soyut olarak tanımlanması için class deyiminin önüne abstract deyimi getirilir. Soyut sınıfta metotların soyut olarak belirlenmesi için erişim tipinin önüne veya function deyiminin önüne abstract deyimim getirilmeli ve gövdesiz bir metot olmalıdır. Soyut sınıfın hiç soyut metodu yoksa o sınıf soyut metot olarak işlem görmez.

Soyut metotlarda sınıf dışında bir değişkene atama yapılamaz. Yani new ile bir sınıf kurulumu yapılamaz.

Bir örnek verelim.

Yukarıda Soyut adında bir soyut sınıf tanımladık. Soyut sınıfımızı extends ile genişletelim. Ortak iş yapan 2 sınıf oluşturalım.

Yukarıdaki örnekte Soyut sınıfından Telefon ve Dogalgaz isminde 2 tane somut sınıf türettik. Soyut sınıfından kurucuyu(__construct) ve Ödeme fonksiyonlarını eziyor, Ödenen metodunu ise kalıtım ile miras alıyoruz.

Ödenen metodu 2 sınıfta da aynı işi yapmaktadır. Kurucu metot ve Ödeme metodu kendi sınıflarının belirledikleri görevi yerine getirmektedir.

Sınıflarımızı kurup sonuçları görelim.

sonuçlar:

Aynı parametreleri girmemize rağmen soyut sınıflar sayesinde sonuçlar farklı çıktı.

Google haritalar kullanımı – Gmaps.js

Şirketiniz veya kendiniz için google mapsi kullanarak konumunuzu adresinizi göstermek isteyebilirsiniz ama malesef ki google maps ile bunu yapmak artık zorlaştı bunun için açık kaynak lı bir eklenti yardımıyla istedigimiz işlemleri kolayca yapabiliyoruz..

Peki bunu nasıl kullanıcam?

http://hpneo.github.io/gmaps/
Eklentiye ulaşmak için yukarıdaki linke tıklayarak örneklere ve kaynak dosyasına ulaşabilirsiniz.

http://hpneo.github.io/gmaps/examples/markers.html

Yukarıdaki örnek en çok kullanılan örneklerden biri.

Github kullanmayan arkadaşlar için indirme linki aşagıda yer almakta.

Google maps indir

Sublime Text Personal Settings

Favorite Snippets

Close_windows_when_empty — Closes the whole window if there are only empty tabs open when you hit cmd + w.

 

Folder_exclude_patterns — Set up folder exclusion for commonly used directories in your projects.

Font_ — Set type preferences for readability. Obviously, a monospaced font like Source Code Pro from Adobe would be best.

Highlight_line — Highlights the currently selected line based on styles in your theme. Incredibly useful if you use multi-pane layouts.

Highlight_modified_tabs — Another theme-based preference, but still useful. If you have multiple tabs open, one with un-saved changes will be highlighted.

Match_ — On creation of an opening bracket/brace/etc, a closing one is inserted.

Scroll_ — Allows you to scroll past the end of a file, which is necessary, especially if you hate extra empty lines at the end of a file like I do. Scroll speed to 2 is also helpful if you’re impatient with large files.

Translate_tabs_to_spaces — Simple. Add this. And if you’re still using tabs in your code, quit it.

Complete Preferences:

 

Ubuntu 14.04’e Linux, Apache, MySQL, PHP (LAMP) paketinin kurulması

LAMP Nedir?

LAMP terimini açmak gerekirse, Linux işletim sisteminde Apache Web Sunucusunun bulunması, Verilerin Mysql ile tutulması ve dinamik içeriğin PHP ile oluşturulmasıdır.

En büyük avantajlarından birisi bu dördünün de açık kaynak olmasıdır.

Bu anlatımdaki kurulum Ubuntu 14.04.1’de denenmiştir

Adım 1 – Apache Kurulumu

Apache dünyada en popüler web sunucudur. Ubuntu’nun paket yöneticisi olan apt ile kurulum yapacağımız için işimiz çok basit olacak.

Öncelikle paket veritabanını güncelleyelim

Apache2’yi kuralım

Kurulumdan sonra Apache2’nin çalışma durumunu öğrenmek için herhangi bir web tarayıcısından

adresini kullanabilirsiniz.

Adım 2 – MySQL Kurulumu

MySQL, bir veritabanı yönetim sistemidir.

Bu sefer MySQL’in yanında yardımcı(helper) paketler de kuracağız. Diğer paketlerle bağlantımızı sağlayacak.

Kurulum sırasında MySQL için şifre soracaktır.

Şimdi MySQL için biraz güvenlik önlemleri alalım. Eğer sadece geliştirme ortamı için kurulum yapıyorsanız aşağıdakileri incelemenize gerek yok diğer adıma geçebilirsiniz. Sadece production ortamı içindir.

MySQL sistem tablolarını oluşturtalım

Güvenlik amaçlı basit bir script çalıştıracağız. Girişleri olabildiğince kısıtlayacağız.

Script sırasında root şifresi isteyecektir. Kurulumda girdiğiniz şifreyi girin.

Remove anonymous users ? : Üye oluşturmaya gerek kalmadan giriş yapılmasını sağlar. Production ortamı için Yes diye cevaplayalım.

Disallow root login remotely ? : root kullanıcısının SADECE “localhost”‘dan giriş yapabilmesini sağlayacağız. Böylece root şifresi bilinse de sadece ana makineden giriş yapılabilir. Bu yüzden Yes diye cevaplayalım.

Remove test database and access to it ? : Varsayılan olarak MySQL, ‘test’ isminde bir veritabanı oluşturabilir ve herkesin erişebilmesini sağlar. Production ortamı için gereksiz olacaktır, bu yüzden Yes diye cevaplayalım.

Reload privilege tables now ? : İşlemlerin tam çalışması için yetki tablolarının güncellenmesi gerekiyor. Yes diye cevaplayalım.

Adım 3 – PHP Kurulumu

PHP, dinamik verilerin gösterimi, SQL veritabanlarından bilgilerinin alınması ve işlemlerin yönetilmesini sağlayacaktır.

PHP ile beraber helperları da yükleyelim

Apache, varsayılan olarak dizin arama işlemlerinde index.html index.cgi index.pl index.php index.xhtml index.htm dosyaları sırayla aranmaktadır. index.php‘yi biraz öne alacağız.

Bunun için dir.conf dosyasını düzenleyelim.

sudo nano /etc/apache2/mods-enabled/dir.conf index.html’den hemen sonra alabilirsiniz.

PHP’nin çalışması için Apache’nin yeniden başlatılması yani Apache’nin konfigürasyon dosyalarına tekrar bakması gerekiyor.

PHP Modüllerinin Kurulması

Yüklenebilir PHP5 Modülleri için şu şekilde arama yapabilirsiniz

Yükleyeceğiniz modülleri belirledikten sonra şöyle kurulum yapabilirsiniz

## Adım 4 – PHP’nin Test Edilmesi PHP‘yi test etmek için çok basit bir PHP kodu yazacağız.

BONUS – PHPMyAdmin Kurulumu

PHPMyAdmin’i kuralım

Web server olarak apache2‘yi seçin

dbconfig-common’un düzenleme yapmasına izin verin

MySQL ve PHPMyAdmin şifresini girin

Kurulum bittikten sonra Apache’ye PHPMyAdmin dosyasını ekleyeceğiz.

En alta Include ekleyeceğiz.

Apache’yi yeniden başlatalım

Kontrol amaçlı aşağıdaki adrese gidebilirsiniz

BONUS – Sanal Sunucu Oluşturma

Projelerinizde sürekli localhost/ kullanmak yerine projenize özel sanal sunucu oluşturabilirsiniz.

Örneğin AwesomeProject projeniz için

Çalışma Dizini: /var/www/awesomeproject/public_html

Log Dizini : /var/www/awesomeproject/logs

Site Adresi : http://awesomeproject/

Bu şekilde daha düzenli ve rahat olacaksınız.
Klasörlerin oluşturulması

Yetkilerin verilmesi

Örnek Sayfa Oluşturulması

Sanal sunucuyu test etmek için örnek bir sayfa oluşturacağız. Sanal sunucumuz içerisinde bir index.html dosyası oluşturalım.

İçerisine

Sanal Sunucu: projeadi
Sanal Sunucu Dosyasının Oluşturulması

Sanal sunucu dosyası oluşturalım.

İçerisine aşağıdakileri yapıştırabilirsiniz fakat projeadi yazdığım yerleri kendinize göre düzenleyin.

Dosyayı kaydedin ve kapatın.

Yeni sanal sunucunun çalışması için aktifleştirmemiz ve Apache’yi yeniden başlatmamız gerekiyor

I) PHP Nesne Tabanlı Programlama

Bu bölümde, PHP hakkında nesne tabanlı programlama (OOP – object-oriented programming) üzerine bilgi vermeye çalışacağım.

PHP 5 ile OOP yapısı tamamen desteklenir oldu. OOP’da temel programlama kavramları şunlardır:

  • Abstraction (Soyutlama)
  • Polymorphism (Çok biçimlilik)
  • Encapsulation (Sarmalama)
  • Inheritance (Kalıtım)

Soyutlama, problemi çözerken ilgili metodların belli parçalar halinde yazılarak kodların basit ve anlaşılır hale getirilmesidir diyebiliriz. Çok biçimlilik ise, yazdığımız nesnenin yada fonksiyonun farklı veri yada giriş değerleri ile kullanılabilmesidir. Sarmalama ise, yazdığınız sınıf içerisindei metodların dışarıdan erişilebilir olup olmamalarını sağladığımız bir çeşit güvenlik katmanıdır diyebiliriz.  Son olarak Kalıtım ise, var olan sınıfların kalıtım (miras alınarak) yeniden/istenildiği kadar oluşturululabilmesi.

Nesneler

Nesneler (class) PHP OOP yapısının temel taşıdır. Aslında zaten OOP yapısının temelinde de nesneler vardır. Günümüzde OOP yapısını destekleyen diller için de bu öğreneceklerimiz çoğunlukla geçerli olacaktır.

Nesneler yani class’lar, sizin yarafınızdan yapmak istediğiniz programın amacına uygun olarak yazılır yada başkası tarafından önceden yazılmış nesneler baz alınarak kullanılabilir. Bu nesneler kalıtım olayı ile oluşturulup kullanılır.

Yukarıdaki minik örnekten yola çıakrsan sınıfımızın isminin Simple olduğunu ve

ile yazılmaya başlandığını görebiliriz. Elbette bu örnekte sadece nesnemizin adı tanımlanıyor, içerisinde hiçbir metod olmadığından bir işe yaramayacaktır…

bölümünde ise $object değişkenimize  new Simple() diyerek (miras alma) nesnemizin bir örneğini oluşturuyoruz. Eğer sınıfımızın içinde metodlarımız olsaydı artık bunları alt satırlarda $object değişkenimizin alt metodları/fonksiyonları gibi kullanabilirdik.

Nesne İçerisindeki Değişkenler

Nesne içerisinde değişken kullanımını ve erişimi kısa ve basit bir örnek ile sizlere zenim hazırlamak için açıklamaya çalışacağım. Aşağıdaki örneği inceleyelim;

Burada, Person isminde bir sınıfımız var ve içerisinde $name adından public yapıda bir değişkene sahip. Değişkenlerin alabilecekleri yapıları (OOP’un sarmalama özelliğidir) daha sonra göreceğiz.

Yukarıda, sınıfırmızdan türetip ($p1), sınıf üyesi olan name değişkenine bir değer atıyoruz. Daha sonra aynı işlemi $p2 ile türetip yine name değişkenimize başka bir değer atıyoruz.

Daha sonra kodumuzu çalıştırdığımızda $p1 ve $p2 içerisindeki name değerlerini ekrana yazıyoruz.

Burda bilinmesi gereken, gördüğünüz gibi aynı değişkene erişiyoruz ama neden farklı farklı değerler alabiliyor? Çünkü sınıfı 2 ayrı değişkende create ediyoruz ve ikisi için de bellekte farklı yer açılıyor. Yani birbirinden bağımsız olarak çalışıyorlar.

Metodlar

Metodlar, fonksiyonları içerisinde barındıran sınıfların gövdesidir diyebiliriz. Metodlar, OOP’un sarmalama (encapsulation) özelliği ile erişim yapısı istediğimiz gibi şekillendirilebilir. Özellikle büyük projelerde ve sınıflarda sarmalama özelliğini iyi kullanmak ve planlamak gerekir.  Her zaman olduğu gibi bi örnek üzerinde bunları irdelersek daha faydalı olacaktır…

Yukarıdaki örnekte Circle isminde bi sınıfımız ve içinde 2 metodumuz var.

Burada ise sınıfımız içerisinde bulunan değişkenimiz var (member field). public etiketi ise ona sınıf dışından da erişebileceğimzi anlamına geliyor.

Burada setRadius isminde bir metodumuz var. Normal bir PHP fonksiyonu farkı yok, ancak sınıflar içerisinde tanımlanan fonksiyonlara method diyoruz. $this değişkeni ise özel bir değişkendir. Sınıf içerisindeki değişkenlerimize (member fields) ulaşmak için kullanıyoruz.

Burada ise area metodumuz gerekli hesaplamaları yaparak return ile sonucu döndermekte.

Burada, metodlara genel bir bakış yapmış olduk.

Erişim Belirteçleri

Yukarıda bahsi geçen public tanımını hatırlıyorsunuz umarım, şimdi o konu üzerinde konuşacağız. PHP 5′de 3 tane erişim tipi vardır. public, private ve protected.

public, her yerden erişilebilir anlamına gelir. Hem sınıf içindeki metodlar erişir hem de sınıftan miras alıp oluşturduğumuz değişken üzerinden erişilebilir yani kalıtım yolu ile aktarılırlar.
private, bu erişim belirteci sadece sınıfın içinden erişilebileceği anlamına gelir. Bu öğeler kalıtım yoluyla aktarılmaz.
protected, bu erişim belirteci sadece sınıfın içinden erişilebileceği fakat alt sınıflara aktarılabileceği anlamına gelmektedir (extends ile)

extends

Eğer sınıfımız başka bir sınıfın alt sınıfı olacaksa extends anahtar sözcüğü ile aktarılır.

Şimdi, bir örnek ile görelim.

Burada, koda baktığımızda çoğu şeyi biliyoruz tek bilmediğimiz extends bölümü olabilir.

Burada Derived sınıfı Base sınıfından türetiliyor. Bunun anlamı Base sınıfı içerisindeki değişkenler ve var olsaydı metodları Derived sınıfına aktarıyor manasına gelmekte. Yukarıda erişim belirteclerini hatırlarsak ve bu kodu çalıştırdığımızda Base sınıfındaki değişkenler içinde sadece private $is_defined = “yes”; bölümünün Derived içerisine aktarılmadığını görüyoruz. Bu da sarmalama konusunun ne olduğunu bize açıklamış oluyor.

Kısaca, public heryerden ulaşılır ve aktarılır extends ile… private, sınıf içinden ulaşılır sadece ve extends ile aktarılabilir… protected ise sınıf içinden ulaşılır ancak extends ile aktarılamaz.

Yapılandırıcı

Yapılandırıcılar, sınıfların miras alındıkları anca otomatik tetiklenecek metoddur. Hemen örnekleyelim;

Yukarıdaki örnekte görüldüğü gibi Song sınıfımızı miras aldığımız bölümde new Song(“Bad romance”); şeklinde parametre gönderebiliyoruz. Bu parametre de yapılandırıcı (__construct) içerisinde echo ile ekrana basılıyor. Elbette __construct metodu, parametresiz ayda bir yada birden fazla parametre çeklinde olabilir. İhtiyacımıza göre düzenleyebiliriz.

__toString() Metodu

Sınıfımızı create edip print yada echo ile ekrana basmak istersek __toString Metodu varsa eğer otomatikman devreye giriyor. Çok kullanılan bir tanım olmasa da sınıfımızı test/debug ederken işimize yarar. Örnek;

Kalıtım

Nesneye yönelik programlamanın temellerinden olan kalıtım (inheritance), yeni sınıflar yazarken elimizde var olan eski sınıfları kullanmamızı sağlar. Yeni sınıfın bir çok özelliği eski yazılan sınıfla aynıdır. Kalıtım yoluyla yeni sınıfta bu üyeleri (metodları) tekrardan yazmaya gerek kalmaz. Bazı üyeler ise farklıdır (Eğer tüm üyeler aynı olsa yeni sınıf yazmaya gerek kalmazd!). Eğer bu üyelerin tanımlamaları superclass’ta (üst sınıfta) mevcutsa, bu durumda bunlar farklılastırılır (overriding). Eğer yeni eklenecek üyelerin prototipleri superclasst’ta mevcut değilse bunlar direkt olarak yeni sınıfa (subclass) eklenebilir.

Kalıtım, yazılımın yeniden kullanılması ihtiyacına büyük ölcüde katkıda bulunur. Zaten kalıtım kavramının ortaya cıkmasının sebebi, özellikle büyük çaplı yazılım geliştirme çalışmalarında aynı kod parcalarının tekrar tekrar kullanılmasını önlemek ve yeni sınıfları var olanların üstüne inşa etmektir. Gerçek hayattaki nesne modeli de buna uygundur.

Yukarıdaki örnekte önemli olan nokta, Deriven’ın yapılandırıcı bölümündeki parent::__construct(); satırıdır. Burdan görülüyor ki, parent:: ile superclass’a ulaşabiliyoruz ve onun yapılandırıcısını tetikleyebiliyoruz. Umarım parent anahtar kelimesinin de ne iş yaptığını anlamış olduk.

Şimdi, biraz daha derin bir örnek yapalım,

Şimdi, burada yeni birkaç tanım kullandık. Öncelikle 2 sınıfımızın olduğunu hatırlayalım Being, Animal ve Cat. Animal sınıfı Being sınıfından kalırım alır, Cat sınıfı da Animal sınıfından kalıtım almakta.

Being sınıfı abstract tanımlanmıştır. Abstract (soyut) nedir? Az sonra…

Yine burada Animal sınıfını abstract olarak yine diğer bir abstract olan Being sınıfından extends ile miras alıyoruz.

Burada ise artık dışarıdan erişip kullanacağımız ana sınıfımızı tanımlıyoruz. Tabi Cat sınıfından türeterek…

Kodu çalıştırdığımızda göreceğimiz şey söyledir;

Soyut Sınıflar (abstract)

Soyutlama (Abstraction) sayesinde bir nesne, spesifik tanımlamalar ve sadece o nesneye ait olabilecek detaylardan kaçınarak, ayrıntılarda boğulmadan kullanılabilir.

Soyutlama: Her zaman ve her sartta kullanılmaya uygun, mümkün olan bütün kosullar ve oluşabilecek hatalar göz önünde bulundurularak yazilmis ve özel olmayip genel olarak kullanilabilen fonksiyonlar kullanimi olarak tanimlayabiliriz.

Devamını okumak için tıklayınız

Bir örnek verirsek;

Çalıştırdığımızda çıktısı şu şekilde olacaktır;

Soyutlama konusunda internet üzerindeki diğer yazıları okumanızı tavsiye ederim.

Arayüzler (Interfaces)

Nesne arayüzleri, bir sınıfın gerçeklemesi gereken yöntemlerin belirtildiği kodu, bu yöntemlerin nasıl yönetileceğini tanımlamaksızın oluşturmanıza imkan sağlar.

Arayüzler, standart sınıflardan farklı olarak hiçbir yöntemin içeriği tanımlanmaksızın interface anahtar sözcüğü kullanılarak tanımlanırlar.

Bir arayüzdeki tüm yöntemler, arayüzün doğası gereği public olarak bildirilmelidir.

implements işleci

Bir arayüzü gerçeklemek için, implements işleci kullanılır. Arayüzdeki tüm yöntemler bir sınıf içersinde gerçeklenmelidir; aksi takdirde bir ölümcül hata alırsınız. Bir sınıfın, birden fazla arayüz tanımlaması arayüzler virgülle ayrılarak sağlanabilir.

Örnek verirsek;

Burada öncelikle genel programlama yapısı gereği interface tanımlamaları standart olarak “I” harfi ile başlar. Elbet şart değildir ama okunurluk ve alışkanlıklar olarak öyle kullanılsa iyi olur.

arayüzümüzü tanımlıyoruz ve içine do_inform metod başlığımızı tanımlıyoruz. Bilindiği üzere interface’de sadece metod başlıkları tanımlanır, metodun gövdesi implement edilen sınıfta yazılır. Örnektede bu şekilde, echo metodu implement edilen sınıfımızın içindeki metodda yer almakta.

Çok Biçimlilik (Polymorphism)

Çok biçimlilik (Polymorphism), kalıtım (Inheritance) ile iç içe geçmiş ilk bakışta karışık gibi görünen, hatta ne gerek var bunlara dedirten, bir yapıya sahiptir. Fakat işin içerisine girdikten sonra ne gibi kolaylıklar ve güzellikler sağladığını görünce dil tasarımcılarına hakkını teslim etmek kaçınılmaz oluyor. En genel anlamda, oluşturduğumuz nesnelerin gerektiğinde kılıktan kılığa girip başka bir nesneymiş gibi davranabilmesine çok biçimlilik diyebiliriz.

Örneklersek;

Çok biçimlilik konusunda yine internetteki başka kaynaklardan yararlanın.

PHP Türkçe karakterleri ingilizceye Çevirmek

Aşağıdaki kodları kullanarak türkçe karakterleri temizleyebilirsiniz.

Sonuç: Turkce-Metin

PHP 5.4.30 ve 5.5.14 Versiyon Güncellemesi

PHP geliştirme ekibi 5.4.30 ve 5.5.14 yeni güncelleme versiyonlarını yayınladı.

Bu son güncellemede daha çok güvenliğin ve hataların üzerinde durulmuş.

Pek fazla aman aman bir değişiklik yok gibi. Sadece bir önceki sürümlerde tespit edilen uyumluluk sorununu çözüyor.

Tabi güncellenen hata ve güvenlik riskleri güncelleme yapmanıza değer içerikler.

Değişikliklere PHP.net ChangeLog adresinden göz atabilirsiniz.

PHP İconv Kullanımı

Çoğu yazılımcının belki de en kolay ve En çok yorulduğu sorunlardan biri de “Karakter Hatası” sorunudur, Bu sorunu kısaca özetlemek gerekir ise : “Her şeyi hazırlarsınız ama veritabanına içeriği girdiğiniz de bir de ne göresiniz, Türkçe karakterler ya bozuk yada Türkçe karakterden sonrası alınmamış.” İşte tam da bu sorunun 5 harfli bir çözümü var “İconv !”

İlk olarak, Bir o kadar basit olan İconv kullanımını size kısaca anlatacağım.

Şeklinde kısaca özetlenebilir, 1. satıra (“UTF-8”) -> Verinin Karakter Seti
2. Satıra (“ISO-8859-9”) ise Karakter setinin dönüştürüleceği karakter seti yazılır. En sona ise, Verinin kaynağı değişken yazılır.

Diceksiniz ki, Nereden bilelim hangi karakter seti ? Zaten 2 seçenekden biri olur genelde, İlk olarak

Deneyin, Olmaz ise

Şeklinde deneyin, Eğer hala olmuyor ise MYSQL bağlantı tipiniz de sorun olabilir.