“Hiç uğraşamam…”

twitter.com/brsyuksel

mysqli.so-2.php

Bu Trabzon’da yapacak birşey bulamazsınız, böyle benim gibi yaklaşık 1.5 yıldır herhangi bir şekilde uğraşmadığınız dille vakit geçirmeye başlarsınız. Can sıkıntısından ötürü olsa gerek, bir anlık esintiyle PHP’yi tekrar işin içine sokmak istedim. Bir daha ister miyim? İstemem.

Zamanında yapıp yayınladığım, tekrar dönüp bakınca “Bu nasıl olmuş da 2. seçilmiş?” dediğim mysqli.so.php’yi geliştirdim, geliştirirken de __call(), __callStatic(), __get(), __set(), gibi “Sihirli Yöntemler” kullanarak biraz eğlendim. Ortaya çorba misali bir koda sahip mysqli.so-2.php çıktı.

mysqli.so-2.php

  1.  
  2. <?php
  3. class mysqli{
  4.         private $data=array();
  5.         private $pre="mysql_";
  6.  
  7.         const MYSQLI_BOTH="MYSQL_BOTH";
  8.         const MYSQLI_NUM="MYSQL_NUM";
  9.         const MYSQLI_ASSOC="MYSQL_ASSOC";
  10.        
  11.         private $finfo = array(
  12.                 "thread_id" => array(NULL,"array_unshift","mysql",NULL,FALSE),
  13.                 "insert_id" => array(NULL,"array_unshift","mysql",NULL,FALSE),
  14.                 "error" => array(NULL,"array_unshift","mysql",NULL,FALSE),
  15.                 "errno" => array(NULL,"array_unshift","mysql",NULL,FALSE),
  16.                 "affected_rows" => array(NULL,"array_unshift","mysql",NULL,FALSE),
  17.                 "num_rows" => array(NULL,"array_unshift","result",NULL,FALSE),
  18.                 "lengths" => array(NULL,"array_unshift","result",NULL,FALSE),
  19.                 "query" => array("result","array_push","mysql","this",FALSE),
  20.                 "select_db" => array("dbase","array_push","mysql","function",FALSE),
  21.                 "fetch_assoc" => array(NULL,"array_unshift","result","function",FALSE),
  22.                 "fetch_array" => array(NULL,"array_unshift","result","function",FALSE),
  23.                 "fetch_row" => array(NULL,"array_unshift","result","function",FALSE),
  24.                 "fetch_object" => array(NULL,"array_unshift","result","function",FALSE),
  25.                 "fetch_field" => array(NULL,"array_unshift","mysql","function",FALSE),
  26.                 "data_seek" => array(NULL,"array_unshift","result","function",FALSE),
  27.                 "field_seek" => array(NULL,"array_unshift","result","function",FALSE),
  28.                 "free_result" => array(NULL,"array_unshift","result","function",FALSE),
  29.                 "get_client_info" => array(NULL,NULL,NULL,"function",TRUE),
  30.                 "ping" => array(NULL,"array_unshift","mysql","function",FALSE),
  31.                 "change_user" => array(NULL,"array_push","mysql","function",FALSE),
  32.                 "real_escape_string" => array(NULL,"array_push","mysql","function",FALSE),
  33.                 "set_charset" => array(NULL,"array_push","mysql","function",FALSE),
  34.                 "stat" => array(NULL,"array_unshift","mysql","function",FALSE),
  35.                 "close" => array(NULL,"array_unshift","mysql","function",FALSE)
  36.         );
  37.  
  38.         public function __construct($host,$username,$passwd,$dbname=NULL,$port=NULL,$socket=NULL){     
  39.                 $conn_addr=(isset($host))?((isset($port))?$host.":".$port:((isset($socket))?$host.":".$socket:$host)):((isset($socket))?":".$socket:NULL);
  40.                 try{
  41.                         $this->data["mysql"] = mysql_connect($conn_addr,$username,$passwd);
  42.                         if($dbname!=""){
  43.                                 $this->data["dbase"]=mysql_select_db($dbname);
  44.                         }
  45.                 }
  46.                 catch(Exception $e){
  47.                         echo $e->getMessage();
  48.                 }
  49.         }
  50.        
  51.         public function __call($func,$arg){
  52.                 if(array_key_exists($func,$this->finfo) && function_exists($this->pre.$func)){
  53.                         if(isset($this->finfo[$func][1]) && isset($this->finfo[$func][2])){
  54.                                 $this->finfo[$func][1]($arg,$this->data[$this->finfo[$func][2]]);
  55.                         }
  56.                         try{
  57.                                 if($this->finfo[$func][3]=="function" || !isset($this->finfo[$func][3])){
  58.                                         return call_user_func_array($this->pre.$func,$arg);
  59.                                 }
  60.                                 elseif(isset($this->finfo[$func][3]) && isset($this->finfo[$func][0])){
  61.                                         self::__set($this->finfo[$func][0],call_user_func_array($this->pre.$func,$arg));
  62.                                         return $this;
  63.                                 }
  64.                         }
  65.                         catch(Exception $e){
  66.                                 echo $e->getMessage();
  67.                         }
  68.                 }
  69.         }
  70.  
  71.         public function __callStatic($func,$arg){
  72.                 return ($this->finfo[$func][4]) ? self::__call($func,$arg) : FALSE;
  73.         }
  74.  
  75.         public function __get($property){
  76.                 return (!isset($this->finfo[$property][3])) ? self::__call($property,array()) : FALSE;
  77.         }
  78.  
  79.         public function __set($property,$value){
  80.                 if(!array_key_exists($property,$this->finfo)){
  81.                         $this->data[$property] = $value;
  82.                 }
  83.         }
  84. }
  85. ?>
  86.  

Şöyle bir inc_mysqli.php dosyası hazırlandıktan sonra:

  1.  
  2. <?php
  3. if(!extension_loaded("mysqli")){
  4.         require_once ‘mysqli.so-2.php’;
  5. }
  6. ?>
  7.  

.htaccess dosyanıza şöyle bir satır ekleyerek mysqli.so-2.php’yi rahatlıkla kullanabilirsiniz.
php_value auto_prepend_file /dosya/yolu/inc_mysqli.php

PHP defterini bir kez daha kapatırken söylemek istediğim şeyler varsa onlar da şunlardır:
1 – En başarılı kod, en okunaklı koddur. Bakınız: Satır 39. Aslında, Satır Hepsi(!)
2 – Python’a “Merhaba” derken PHP’ye “Elveda” dediysen, giderken dönüp ardına bakmamalısın.
3 – Olur da işin düşer PHP’de birşeyler yazman gerekirse, baştan kabul edeceğin şey acı çekeceğin olmalıdır.


mysqli.so-2.php’yi indirmek için tıklayın.

*Eminim Manuel Lemos beni takip ediyordur.

Tags: ,
Posted in PHP · Aralık 6th, 2009 · Comments (0)

No comments yet

Leave a Reply

Bağlantılar

Etiketler

çember özel yöntem isimleri apache2screen apache2screen.deb bele kuvvet bi_rle4 brute-force classic classes classmethod descriptors getanurse ic.lnx icontacts ileri c programlama image imagedraw kaba kuvvet kelime tahmin libnotify math math.cos math.sin matruşka matryoshka memory leak mesafe metaclass mysqli new-style classes oauth php5 property pynotify Python singleton special method names staticmethod steganografi steganography super twittell TwittellOAuth wchar yeni stil sınıflar __mro__

Meta