Sihirli PHP call_user_func ve call_user_method

3

Tarih : 18-11-2009 | Yazan : Hüseyin Bora | Kategori : PHP

PHP de kodlarken yapılan kolaylıklardan yararlanmama hatalarından biride requesten gelen parametrelere göre uzayan switch case ve else if yapılarıdır.
Bunu pek çok php betiğinde görürsünüz hatta en sık yapılardan biridir.
Temel amaç $_REQUEST[“page”] gibi bir veriye göre işlemi belirlemektir.

Çoğu PHP’ci bu işlemi şöyle yapar.

$param = $_REQUEST[“param”];

switch ($param) {

case “ekle”:
ekle()

break;

case “sil”:
sil()

break;

case “duzenle”:
duzenle();

break;

default:
listele();
}

Bu switch işlem yapılabilecek parametre sayısına göre uzar gider çoğu zaman benzer şekilde üç case ile bitmez. Bu yaklaşımın diğer bir olumsuz yönü de betiğe yeni bir özellik eklendiğinde switch ifadesine yeni bir case in eklenmesi gerektiğidir.

Örneğimizi call_user_func kullanarak yapalım,listele duzenle,sil fonksiyonlarının daha önceden yazıldığı düşünerek.

function ekle(){
echo " kayıt";
}
function duzenle(){
echo "düzenle";
}
...

Şimdi call_user_func fonksiyonunu kullanalım.

$param = $_REQUEST[“param”];

if(function_exists($param))
call_user_func($param);

else

listele();

kodlarımızın açıklamasını yapacak olursak adres satırından işlem bilgisi param alınınarak bir fonksiyonu işletmek için

Örnek localhost.com?param=ekle

eğer ekle fonksiyonu mevcutsa bu fonksiyonu işletiyoruz eğer paramdan gelen fonksiyon mevcut değilse listele fonksiyonunu çağırıyoruz.

call_user_func bir fonksiyonu call_user_method ise bir sınıfın üye metodunu işletir.
Örneğin ekle,duzenle,sil,listele metotlarının Kayıt sınıfı içerisinde olduğunu varsayalım.

class kayıt{
function save($param){
}
function delete($param){
}
function update($param){
}
function liste($param){
}
}

call_user_method kullanımı

$param = $_REQUEST[“param”];
$kayıt = new Kayıt();

if(method_exists($kayıt,$param))
call_user_method($param, $kayıt)

else

call_user_method(“liste”, $kayıt)

Örnektende anlaşılacağı gibi switch case ifadeleri ile onlarca uzayan giden satırlarla karşılık örnekteki kullanım daha verimlidir. Bu sayede yeni bir işlem eklendiğinde de switch case ifadesindeki gibi bir düzenleme yapmaya ihtiyaçda duyulmaz.

Son olarak php 5.3 den sonrası için call_user_method için uyarı alabilirsiniz php5.3 ve üst versiyonlar için call_user_method nesnel olarak kulanabilirsiniz.

Kullanımı aşağıdaki gibidir.

call_user_func(array(Çalıştırılacak Nesne, Nesnenin Metodu),Parametreler);

Şimdi son örenğimizi nasıl kullanıcaüımıza bakalım

$param = $_REQUEST[“param”];
$kayıt = new Kayıt();

if(method_exists($kayıt,$param))
call_user_func(array($kayıt, $param));

else

call_user_func(array($kayıt,"liste"));
call_user_method
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Sihirli PHP __set ve __get metotları

2

Tarih : 18-11-2009 | Yazan : Hüseyin Bora | Kategori : PHP, Yazılım Mimarileri

Bu makalede PHP de edindiğim bazı kolaylık ve deneyimleri aktarmaya çalışacağım
Profesyonel PHP programcılarının çoğu farklı bir dil üzerinde çalışıp PHP ye geçmiş kişiler olarak nitelendirdiğimizde örneğin Java, C# olabilir PHP yine de bu diller gibi düşünmeye başlar hâlbuki PHP tam anlamıyla bir betik dilidir ve benzer neyse yönelimli dillerden ayıran belirgin özellikleri vardır.

Ben ve çalışma arkadaşlarımın PHP üzerinde nesne yönelimli projeler geliştirirken ilk başlardaki PHP üzerindeki acemiliğimizden dolayı bir takım kodları Java da ya C# da yazarcasına geliştirmişiz. Bu günde pek çok PHP programcısının benzer hatalara düştüğünü görüyorum.

PHP’nin NYP yapısı diğer NYP dillerden ayrılan ve programcının işini kolaylaştıran bir yapıya sahip.
Örneğin NYP temellerinden Kılıflama(Encapsulation) bu prensip Java da Set ve Get metotları C# da ise set ve get propertyleri yazılarak gerçekleştirilir. PHP de de Set ve Get yaklaşımı kabul edilebilirse de bu konuda PHP de __get ___set isimlerinde iki sihirli metot tanımlanmıştır. Örneğin bir sınıfın içerisinde 5 adet private üye olsun Get ve Set metotlarını kullanmak istersek sadece Get ve Set için sınıfımız da 10 adet metot bulunması gerekir. PHP nin sihirli metotları ile bu iş basit 2 metot içerisinde halledilebilir.

Örnek

Class urun
{

private $id,$name,$prince,$paytyep,$order;

public function __set($n,$v)
{
$this->$n=$v;
}

public function __get($n)
{

return $this->$n;
}
}

Örnekte de görülebileceği gibi 10 metot ile yapılacak bu iş iki sihirli metot sayesinde basit ve sistem kaynaklarını daha verimli kullanır bir şekilde tasarlanmıştır.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

PHP Faces Programlanabilir Şablonlar

0

Tarih : 17-11-2009 | Yazan : Hüseyin Bora | Kategori : FDL, PHP Faces

Programlanabilir şablonlar @htmlpattern lerdir yapısal geliştirme çalışmaları sürmektedir.
Örnek kullanıldığı her yerde1 ile 12 arasındaki sayıları gösteren pattern
Sablon.ptrn dosyası

<faces>
<@htmlpattern name="yaz" useprefix="my">
<c:for var="$i" begin="1" to="12" step="1">
<div style="color:red;font-weight:bold;" > #{$i}  </div>
</c:for>
</@htmlpattern>
</faces>

View dosyası

<faces>
<@face file="sablon.ptrn"/>
<my:yaz/>
</faces>

Örneğin kullanıcı girişi için kullandığımız bir formumuz olsun formumuzu kullmak istediğimiz dosyaya include ederiz ve ismi ile etiketleriz

Sablon.ptrn dosyası

<faces>
<@import taglib="phpf.ui.*" prefix="f"/>
<@import taglib="phpf.core" prefix="c" type="static"/>
<@htmlpattern name="login" useprefix="my">
<f:form id="loginform">
<table>
    <tr>
        <td>User Name</td>
        <td><f:textbox id="name"/></td>
    </tr>
      <tr>
        <td>Password</td>
        <td><f:textbox id="pass"/></td>
    </tr>
    </tr>
      <tr>
        <td>Password</td>
        <td><f:button id="send" forname="loginform" text="Login" onclick="actionevent"/></td>
    </tr>
</table>
</f:form>
</@htmlpattern>
</faces>

View dosyası

<faces>
<@face file="sablon.ptrn"/>
<my:login/>
</faces>
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

PHP Faces da Ön ek ile kullanılabilir Şablonlar (Patternler)

0

Tarih : 17-11-2009 | Yazan : Hüseyin Bora | Kategori : FDL, PHP Faces

Daha öncede bahsettiğim gibi (Şablon)patternler view dosyalarında tanımlanan bir çeşit veri yapılarıdır. Pattern kullanımındaki amaç kod yazımını minimuma indirmektir.

Örneğin veri girişi için kullandığımız formlarda çeşitli alanlar vardır örneğin textbox ve çoğuna validation (doğrulama) işlemleri uygularız her etiket için benzer niteliklere değerler aktarırız ve bu böyle uzar gider.

Bu arada PHP faces a pattrenlere yeni eklenen bir özellikte useprefix niteliğidir bu sayede oluşturduğumuz pattern useprefix niteliğine verdiğimiz ön ek ile ilişkilendirilir.

UI Patternler OOP deki sınıflara benzerler her bir nitelik override edilerek(geçersiz kılınabilir)
Örneğin bir formumuz olsun ve bu formdan sunucumuza ad,soyad,dogumyeri bilgileri gönderilecek olsun ve hiçbir bilginin boş bırakılmasını istemiyoruz.

Patterns.ptrn dosyası

<faces>
<@import taglib="phpf.ui.*" prefix="f"/>
<@pattern name="text"  prefix="f" extends="textbox" useprefix="phpf"
     validator="validator"
     rule="required"
     messagefor="label"
     message="Lütfen bu alanı boş bırakmayın"/>
</faces>

Patterns.ptrn dosyamızı include ettiğimiz her dosyada phpf ön eki ile patternimize erişebiliriz

View dosyamız

<html>
    <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
    <@face file="patterns.ptrn"/>
    <f:form id="form">
        ad <phpf:text id="ad"/>
        </br>
        soyad<phpf:text id="soyad"/>
        </br>
        sehir<phpf:text id="sehir"/>
        <f:message id="label"/>
        <f:button id="btn" text="Gonder" onclick="actionevent" forname="form"/>
    </f:form>
</faces>
</body>
</html>
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

PHP Faces Pager Etiketi ile Sayfalama (Pagination)

0

Tarih : 09-11-2009 | Yazan : Hüseyin Bora | Kategori : PHP


Pager Etiketi sayfalama yapmak amacıyla kullanılır.İki farklı kullanım vardır birinci kullanım şeklinde entity niteliğine varlık sınıfının adı.
Limit niteliğine gösterilecek kayıt sayısı yazılır eğer FQL etiketinde olduğu gibi bir sonuc kümesi elde edilmek isteniyora resource niteliğine geri alınacak sounuc kümesinin adı yazılmalıdır.

Eğer php faces framework ü URI modunda kullanıyorsanız pager nesnesinin uri biçimde sayfalama oluşturması için pager etiketinin type niteliğine path değerini vermeniz gerekir.

Örnek Pager ve Grid bileşenlerinin birlikte kullanımı

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
<@import prefix="f" taglib="phpf.ui.*"/>
<@import prefix="db" taglib="phpf.db.*"/>
<f:grid id="grid" width="100%" bind="$liste" border="1">
<@item   key="no"  title="Urun no" />
<@item   key="ad" title="Urun adı"/>
<@item   key="fiyat" title="fiyat"/>
<@item  input="img"  key="resim" title="Resim"/>
<@item  input="link" title="Detay"  url="testet.php?edit=$no"/>
</f:grid>
<db:pager id="pager"  limit="3" entity="urun" resource="liste"
previous="Önceki" next="Sonraki"/>
</faces>
</body>
</html>

Pager etiketinin query niteliği FQL secim işleminden sonraki FQL cümlelerini kabul eder
Örnek Fiyat aralığı

<db:pager id="pager"  type="path" limit="3" entity="urun" resource="liste"
query="WHERE urun.fiyat >=50 AND urun.fiyat<=100"/>

Pager bileşeninin diğer kullanımı ise veritabanı sorgularını Kontrollcü içerisinde yapıp pager bileleşenine count niteliğne toplan kayıt sayısını ve limit niteliğinede sayfada gösterilecek kayıt sayısı verilmelidir.

Örnek
Görünüm

<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
<@import prefix="c" taglib="phpf.core" type="static"/>
<@import prefix="db" taglib="phpf.db.*"/>
<table border="1" align="center">
<thead>
<th>Urun NO</th>
<th>Urun Adı</th>
<th>Fiyat</th>
<th>Resim</th>
</thead>
<c:foreach var="#{$this.list}" item="$urun">
<tr>
<td>#{$urun.no}</td>
<td>#{$urun.ad}</td>
<td>#{$urun.fiyat}</td>
<td><img src="#{$urun.resim}"/></td>
</tr>
</c:foreach>
</table>
<db:pager id="pager" limit="5" count="100"/>
</faces>
</body>
</html>

Facete  Controller tarafı

<?php

import("phpf.controllers.facete");

import("dbf.persistence");

import("entity.*",true);

import("phpf.db.pager");
class Urunler extends Facete {

protected $list;

public function Urunler() {

parent::Facete();
$this->render("urunler.html");
}

public function prerender() {
$em = EntityManager::getInstance();
$query= $em->createQuery("Select count(u.no) from urun u");
$this->pager->setCount($query->execute()->getSingle());
$query= $em->createQuery("Select u from urun u GROUP BY u.no ".$this->pager->getLimitQuery());
$this->list =$query->execute()->getResultList();
}
}
?>

Pager bileşeninin QueryString den aldığı p değişkeni istenirse değiştirile bilir bunun için bilşen tanımı view dosyasında yapılırken request niteliğne işlenecek değişken adı yazılır.

<db:pager id="pager" limit="3" count="10" request="sayfa" type="path"/>
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)