Test Istanbul Turkiye Yazilim Kalitesi Raporu yayinlandi

www.testistanbul.org adresinden ulaşabileceğimiz gibi, test istanbul 2013 – 2014 yazılım kalitesi raporu ( TURKEY SOFTWARE QUALITY REPORT 2013 – 2014) yazyınlandı.

yazılım da test konusu ile ilgili güzel bir infografik içermektedir.

http://www.testistanbul.org/TurkeySoftwareQualityReport_2013_2014.pdf  adresinden görebileceğiniz döküman ilginizi çekecektir diye düşünüyorum.

class_exists ve spl_autoload

Eğer spl_autoload ile bir autoloader belirttiyseniz, daha sonra kodunuzun herhangi bir yerinde class_exists() ile o sınıfın olup olmadığını kontrol ediyorsanız, zaten kontrol etme işlemiyle birlikte sınıfı load etmiş oluyorsunuz.

Bunu http://www.php.net/manual/en/function.spl-autoload-register.php#95456 linkindeki yazıdan da görebilirsiniz.

 

Bir örnek kod da vermeye çalışacağım ilerleyen zamanlarda.

PHP – Sayfanin iframe icerisinde acilmasini engellemek

Bazı durumlar olur ki, sitenizin, veya bir web sayfanızın iframe içinde açılmasını istemezsiniz. Bu durumda ne yapabiliriz diye bir bakındım ve güncel browser’ların kullandığı bir yöntem gördüm.

Örneğimiz şöyle olacak :

1 adet test.html sayfası,
1 adet test.php sayfası.

test.html içeriği

test.php in iframe <br />
<iframe src = 'test.php'>

test.php içeriği :

<?php
header("X-FRAME-OPTIONS: DENY");

echo "hello world";

?>

Görüldüğü gibi, php dosyamızda bir adet header gönderiyoruz, ve burada Frame seçeneklerini DENY yani engellemesini söylüyoruz.
Böyle olunca örneğin chrome ve mozilla’da iframe içinde “hello world” yazmıyor, çünkü request’i deny üstteki header’dan dolayı ediyor.
Chrome ek olarak konsol’a bir uyarı da basıyor.
Ekran görüntüsü de chrome için şu şekilde oluyor. php-deny-iframe

PHP – singleton pattern vs clone

Class Test{
       /**
	 * Örnek Değişken
	 */
	public $sampleVariable = NULL;

	/**
	 * Singelton bir yapı kullanılmaktadır
	 * @var Test
	 */
	private static $_instance;
       /**
	 * Singelton yapıyı desteklemek için private constructor yarattım içi boş.
	 */
	private function __construct(){

	}

	/**
	 * Singelton yapıyı destekleyen getInstance metodu
	 * @return Test
	 */
	public static function getInstance(){
		if (self::$_instance == null) {
			self::$_instance = new Test();
		}
		return self::$_instance;
	}
}

Yukarıdaki kod basitçe bir singleton mimariyi gösteriyor.

Burada ben

 $test = new Test()

yaratamıyorum. Çünkü constructor method’un erişilebilirliği “private” olarak belirlenmiş.
Yani ancak bu sınıfı

$test = Test::getInstance()

diyerek kullanabilirim.

Peki gelin görün ki, unuttuğumuz bir şey var.

Php’de “clone” diye bir obje kopyalama özelliği var. Nedir bu?

$a = new stdClass();
$k = $a;

dediğimizde, $a->var = 5 dediğimizde, $k da aynı şekilde değişiyor. yani bu ikisi aynı objeyi işaret ediyor.

Ancak

$a = new stdClass();
$k = clone $a;

Yazdığımızda ise, artık $k, $a nın en son halinden kopyalanıp yeni bir obje olarak oluşturuluyor.

Yani ben ilk örnekte,

$test = Test::getInstance();

yazdıktan sonra bir yerlerde
$anotherTest = clone $test;
dersem, artık yeni bir obje türetebilmiş oluyorum.

Buyrun deneyin :

$test = Test::getInstance();
$anotherTest = clone $test;

$test->sampleVariable = 5;
$anotherTest->sampleVariable = 10;

var_dump($test);
var_dump($anotherTest);

Birbirinin aynısı olmayan, aynı objenin farklı 2 instance’ını singleton mimaride de yapabilmiş oldum.

Sonuç : Demek ki, PHP de singleton mimarisi güvenilir değildir. Class’ın içerisine ancak private bir __clone metoru tanımlayınca güvenli oluyor. (@edit adil ilhan’ın yorumuna istinaden)
Yine de güzel bir design patterni olarak beğeniyorum. Ancak bilinçli kullanmanızı tavsiye ederim.

phpunit – assert internal type error – CLI HAS STOPPED WORKING

phpunitteki bir test metodumda yanlışlıkla assertInternalType kısmında 2 parametre yerine tek parametre ile işlem yapmıştım.

$this->assertInternalType('string',$oid);

yazacağıma

$this->assertInternalType($oid);

yaazmışım.
$oid ise string tipinde rastgele bir veri.

Ancak phpunit bu kısımda bazen hata veriyor, bazen vermiyordu. Hata vermediğinde ilerleyen aşamalarda ise, CLI has stopped working diye windowsumda işlem duruyordu.
Bu herhalde bir bug.
Ancak hem windowsta ara sıra başıma geliyordu, hem de derdimi nasıl anlatacağımı bilmediğimden bug kaydı oluşturmadım.
Yazmam gerektiği gibi yazınca ise, artık problemin düzeldiğini gördüm.

Buradan sizinle paylaşmak istedim.