Merhabalar,
Olay güdümlü (EvendBased) programlama bize her alanda lazım olabilecek, ve bazı yerlerde kod kalabalığı yerine işlemleri bölebilmemize yarayabilecek bir metod, daha önce Csharp kategorisinde event based programming ile ilgili ufak bir örnek yapmıştım, bu örneği bir de php ile göstermek istedim, open source scriptlerin çoğu, hatta hepsi diyebiliriz event’ları plugin amaçlı kullanmaktadır. Aslında bi bakıma doğru bir yaklaşım çünkü modüleriteden farklı ama aynı zamanda modüleriteyi sağlayabilecek yapıyıbir arada ancak böyle yazabilirsiniz.

Abstract:

  • Anasayfa
    • Header
      • Header başlamadan önceki işlemler (BeforeHeader Event)
      • Gerçek header işlemleri
      • Header sonrası işlemler (AfterHeader Event)
    • Content
      • Content başlamadan önceki işlemler (BeforeContent Event)
      • Gerçek content işlemleri
        • Postlar
          • Post Öncesi işlem (BeforePost Event)
          • Post İşlemi
          • Post Sonrası işlemler (AfterPost Event)
        • Pagination
      • Content sonrası işlemler (AfterContent Event)

Bu event flaglari tam burada yapılacak işlem var mı diye kontrol edilip varsa çalışıtırılan, gerekirse kendisinden sonraki işlemi etkileyebilecek processleri yürüten kısımlardır. Bizim de kendi scriptlerimizde, olay noktalarımız ve bu noktalarda tetiklenmesi gereken diğer olayları kontrol eden bir mekanizmamız olsun istiyoruz. O halde. Öncelikle basit bir event.bind ve event.run metodları olan bir sınıf hazırlayalım

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
	class event
	{
		#callbacks array.
		private static $flags = array();
 
		/**
		* register a callback for an event point.
		*/
		public static  function register($event_point,$callback)
		{
			self::$flags[$event_point][] = $callback;
		}
 
		/**
		* run event_points callback at this time!
		*/
		public static function run($event_point)
		{
			if(isset(self::$flags[$event_point]))
			{
				foreach(self::$flags[$event_point] as $callback)
				{
					if(is_callable($callback))
					{
						call_user_func($callback);
					}
				}
			}
		}
	}
 
?>

sınıfımız basit olarak verilen fonksiyonu belirttiğimiz point name ile saklıyor ve run() denilen yerde o point name için verilmiş tüm callbackleri çalıştırıyor. aşağıdaki bir sayfamız olduğunu düşünelim,

0
1
2
        event::run('before_header');
	echo "burası header";
	event::run('after_header');

bu sayfamızda, headerdan önce ve sonra bir event point var, header oncesinde ve sonrasında yapaağımız işlemlerde artık headera dokunmadan “event” sınıfımızı kullanarak yapabiliriz (plugin mantığı yani)
şimdi bir event register örneği yapalım.

0
1
2
3
4
5
6
7
8
9
event::register('before_header',function()
	{
		echo "header başlamadan önce bu event çalıştı";	
	});
 
 
	event::register('after_header',function()
	{
		echo "header bittikten sonra bu event çalıştı";	
	});

php mantığını unutmayalım register() fonksiyonları run() dan önce yazılmalı, sistemlerimizi buna göre yapalım. pek açık olmasa da php bilginize bağlı olarak pek zor bir iş olmayacaktır sizin için, sorularınız varsa bu post altına alabilirim, Teşekkürler

İlk önce bu ihtiyaç sphinx ile doğdu onu söylim, Sphinxten aldığım ID’ler RANK ve ORDER moda göre zaten dizilmiş, fakat bunu mysql’e gönderdikten sonra bir ORDER işlemi yapmıyorsak, tablomuzun varsayılan dizilişine göre geliyor, yani elimizde ilk 10 oluyor, fakat bu ilk 10 arasındaki sıralamayı sphinx yapmış da biz bunu mysql’e gönderdikten sonra order değişiyor, sphinx gibi dizmek istediğimizde ne yapabiliriz diye araştırıyordum, ilk akla gelen her ID için tekrar veritabanına gitmek, tekrar gitmemek için bir çözüm de uniuon, ama ikisi de performansın taban yaptığı işlemler, mysqlde bunun çok güzel bir çözümü var,

0
FIELD()

php’deki array_search getirebilir akıllara ama fonksiyonun tam olarka nasıl çalıştığını anlamak için şunu deneyebilirsiniz

0
SELECT FIELD(1,0,2,3,1,5,6)

ilk değerin sonraki kaçıncı parametre olduğunu dönüyor, yani yukarıdakinin sonucu 4, 0 id gelirse bu 1, buna göre dizdiğimiz de gerçekten satır istediğimiz sırada geliyor, aklımızda Search to Item, countlarını tutarak bir populerite sistemi vardı, bu populeriteye bunu da eklediğimizde kesinlikle daha kaliteli sonuçlar alacağız.

Örnek bir php kodu

0
1
2
3
4
5
6
7
8
9
10
11
12
 $sp = new SphinxClient();
 $sp->SetServer('localhost',3312);
 $sp->SetMatchMode(SPH_MATCH_ANY);
 $sp->SetRankingMode(SPH_RANK_WORDCOUNT);
 $sp->SetLimits(0,10);
 
 $result = $sp->Query('hello world');
 
if($result['total_found'] > 0)
{
   $found_ids = implode(',',array_keys($result['matches']));
   $q_result = $db->query("SELECT * FROM items WHERE id in({$found_ids}) ORDER BY FIELD(id,{$found_ids})");
}

gerçek bir order oldu tşkler mysql (:
Bu fonksiyonu array_search’e benzetmemden dolayı bir deneme daha yaptım (:

0
SELECT FIELD('test','t','te','tes','test')

sonucun burda da 4 gelmesi fonksiyonu anladığımızı gösteriyor.

Son günlerde üzerinde çalıştığım bir projede Text Mining ile ilgili daha derin araştırmalar yapmaya ihtiyaç duyuyorum. İngilizcede Stop words elemek çok kolay, çünkü  büyük-küçük harf duyarlığı devre dışı kaldıktan sonra hiç bir programlama dilinde kelimeyi yakalama ihtimaliniz düşmez. Bu Türkçe için böyle değildir. Türkçe karakterler bazı programlama dillerinde özel işlemler gerektirebiliyor. örn php Mutlibyte String eklentisini sunuyor. işlemlerimizi bu kütüphane ile yaptığımız sürece unicode sorunu yaşamıyoruz. mb_string eklentisinin kurulumu için  şurayı ziyaret edebilirsiniz.Multibyte işlemler dışında yine istisnai durumlarımız olabildiği için bu eklentiği kullanmadan regular expression yardımıyla bir filter hazırladım. bu kütüphanemizin de programlanabilmesini sağladı ve tadından yenmez oldu. şimdi bir örnek verelim. Elemek istediğimiz kelime “bir” olsun. büyük-küçük harf duyarlılığını kaldırdığımızda  “BIR” kelimesi de elenecektir. Türkçede bu kelimeler aynı değil! bir ve BİR aynı olabilir ancak. Her kelime için ayrı bir istisna sinsilesi olabileceği için ben de regexpe başvurdum.

Statik Stopwords Datamız:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 class stopWords
    {
        public static $stopwords = array(
        'il[ae]',
        'ke[sş]ke',
        'z?([haeiu][haeiu]?)+',
        'mal',
        'aptal',
        'https?\:\/\/[^\s\"\<]+',
        'B[iİ]r',
        'the',
        'g[o]+l',
        'you',
        '[İi][cç]in',
        'his',
        'ilk',
        'iyi',
        'and',
        '[cç]ok',
        'yok',
        'gibi',
        'ama',
        'ma[çc]',
        'her',
        'var',
        'bizim'
        );
 
        public static function FILTER_STOP_WORDS($word)
        {
            foreach(self::$stopwords as $pattern)
            {
                if(preg_match('/^' . $pattern . '$/i',$word))
                {
                    return false;
                }
            }
            return true;
        }
    }
# 3. elemanımız çok komik her gülmeyi yakaladı, dışında kalan birşey bulamadım (: (örnek : zuahaha zhhhh zihihi hiihi haah eheheh ahehehaeh ) bunların hepsini silebildim.

Elbette liste bununla sınırlı değil siz geliştirip , gruplandırıp desenler arttırabilirsiniz bir metin filtreleme örneği de verelim

0
1
2
3
4
     $text = "Tufan attı ve goooooooooooool hahahaha zuahaha ";
    $words = explode(' ',$text);
    $words = array_filter($words,'stopWords::FILTER_STOP_WORDS');
    $text = implode(' ',$words);
   # cıktı : "Tufan attı"

gol kelimesini ben eledim projemde bilgidğin stop word kategorisine giriyor bu (: siz özelleştirip gelitşirebilirsiinz
iyi çalışmalar,

Merhaba arkadaşlar,
Object oritented temellerinden biri olan static değerler ve metodların contenxt içinde davranışları ile ilgili yazmak istedim. Staticler bildiğiniz gibi bize hem ramden kazanç sağlarken hem de global değişkenlerden arındırılmış okunaklı kodlar yazmamızı sağlıyor. Staticlerin kalıtıma girmemesinde bütün olay, yani her context için ayrı bir kopyası yerine 1 tanesi kullanılır her obje bu statice ulaşır. PHP 5.2 sürümü ve öncesinde Static Bindin işlemleri ancak reflection metodları ile yapılabilirken 5.3.x’te bu Object oriented gereklerini yerine getirmek amacıyla “static” constant eklenmiş, bu keyword static metodlarda “self” in yerine kullanıldığında called class içinde işlem yapıyor. madem static metodlar override edilebiliyor o zaman neden biz called class içinde yani contextin sahibi içinde ata sınıftan işlem yapamıyoruz ki değil mi ?.  İlk önce self ile yaşayacağımız zorlukları yazmak istiyorum.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 class BaseClass
 {
 public static $name = 'Base Class';
 
 public function imCalledFrom()
 {
  echo "I'm called from : ".__CLASS__.' my Class Name is '.self::$name;
 }
 }
 
 class ExtendedClass  extends BaseClass
 {
  public static $name ='Extended Class';
 }
 
 $a = new ExtendedClass();
 $a->imCalledFrom();

bu örneğin çıktısı :

I’m called from : BaseClass my Class Name is Base Class

oysa biz $name statiğini override etmiştik. imCalledFrom metodunu override etmedikçe bunu yapamayız gibi görünüyor. fakat kalıtıma ve polimorphizme uymayan bişeyler var. metodun context içinde çalışması için onu override etmek zorunda kalıyorsam çeşitlilik kalkıyor ortadan, nerde kaldı bunun contexti  diyoruz yani. __CLASS__ sabitinin Baseclass demesi normal tabi ki (Extended Class diyebilmesi için __CLASS__ yerine get_class($this) kullanabiliriz.) ama “self::$name”  override edilememiş mi yoksa o metoda girdikten sonra static context mi değişmiş ? şimdi onu test edelim.

ExtendedClassı şöyle değiştirleim

0
1
2
3
4
5
6
7
8
9
10
11
class ExtendedClass  extends BaseClass
    {
        public static $name ='Extended Class';
 
        public function myNameIs()
        {
            echo self::$name;
        }
    }
 
$a = new ExtendedClass();
$a->myNameIs();

bu işlem bize Extended Class çıktısını veriyorsa yanlış nerde ?? tek suçu static olması mı (: şimdi 5.3 versiyonunda getirilen “static” in bize sağladıklarını görelim. BaseClassı tekrar yazıyoruz.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class BaseClass
    {
        public static $name = 'Base Class';
 
        public function imCalledFrom()
        {
            echo "I'm called from : ".get_class($this).' my Class Name is '.static::$name;
        }
    }
 
    class ExtendedClass  extends BaseClass
    {
        public static $name ='Extended Class';
 
    }
 
    $a = new ExtendedClass();
    $a->imCalledFrom();

çıktısı

I’m called from : ExtendedClass my Class Name is Extended Class

evet bu aradığımız şey! şimdi bu işlemi 5.2 ve oncesinde nasıl yaparız onu bi inceleyelim.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 class BaseClass
 {
 public static $name = 'Base Class';
 
 public function imCalledFrom()
 {
 $called_class = get_class($this);
 
 # name statiğini alabilmek için.

 $class_vars = get_class_vars($called_class);
 $name =  $class_vars['name'];
 
 # alternatif
 eval('$name = '.$called_class.'::$name;');
 
 echo "I'm called from : ".get_class($this).' my Class Name is '.static::$name;
 }
 }
 
 class ExtendedClass  extends BaseClass
 {
 public static $name ='Extended Class';
 
 }
 
 $a = new ExtendedClass();
 $a->imCalledFrom();

çıktı yine beklediğimiz gibi oldu. örneği yazarken aklıma gelen eval() alternatifini de yazmak istedim istediğinizi kullanabilirsiniz.

http://gel.io/ah5 bu adresten daha detaylı inceleyip Enum işlemlerinde ihtiyaç duyduğum static binding ile ilgili örneğimi de inceleyebilirsiniz.

© 2012 Tufan Suffusion theme by Sayontan Sinha