folder Tahribat.com Forumları
linefolder Asp - Php - Cgi - Perl
linefolder Php Static Değer Hep Aynı



Php Static Değer Hep Aynı

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozgunlu
    ozgunlu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 11/Kasım/2011
    Erkek

    <?php

     

    error_reporting(E_ALL | E_STRICT);

    require('UploadHandler.php');

    class CustomUploadHandler extends UploadHandler {

        public static $i = 1;

        protected function trim_file_name($file_path, $name, $size, $type, $error, $index, $content_range) {

                $name = uniqid() . microtime(true) . "_L" .self::$i;

                $name = str_replace('.', '', $name);

        self::$i += 1;

                return $name;

            }

    }

    $upload_handler = new CustomUploadHandler();

    ?>

     

    Farklı bir yerden fileupload yaparken çağırıyorum ve her seferinde çağrıldığında $i değer 1 olarak kalıyor. Her o metoda girdiğinde $i ' nin 1 artması gerekiyor, nerede yanlış yapıyorum acaba ?

    ozgunlu tarafından 15/Nis/16 10:41 tarihinde düzenlenmiştir

    Hello, i am nothing. I come from Neverland.
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek

    Hocam selamlar.

    Her defasinda new ile instance olusturuyorsunuz. Her instance olusturdugunuzda public static $i = 1 satiri calisir diye biliyorum.

    Boylece size hep 1 degeri dondurecektir.

    Ayrica bildigim kadariyla PHP de static oalrak tanimladiginiz class propertyleri onlari sonraki requestte sabit tutmaz.

    Yani su asagidaki kodu her refresh ettiginizde ayni sonucu alirsiniz 1 ve 2

    function X()
    {
    	static $x = 0;
    	$x++;	
    	echo $x;
    }
    
    x();
    x();

     

    Siz tam olarak nasil yapmak istiyorsunuz ? Eger her dosya icin ayri bir request gonderiyorsaniz bunu $_SESSION ile veya bir service olusturarak yapabilirsiniz. $_SESSION degerini reference olarak atayabilirsiniz.

    $_SESSION icin soyle bir ornek yaptim :

    class ClassName
    {	
    	private $counter = 0;
    	
    	public function __construct()
    	{
    		if(session_id() == '')
    		{
    			session_start();
    			$this->counter = &$_SESSION['counter'];
    		}
    		else
    		{
    			if(isset($_SESSION['counter']))
    			{
    				$this->counter = &$_SESSION['counter'];
    			}
    		}		
    	}
    	
    	public function Increase()
    	{
    		$this->counter++;		
    	}
    	
    	public function ShowCounter()
    	{
    		echo $this->counter;		
    	}
    }
    
    $c = new ClassName();
    $c->Increase();
    $c->ShowCounter();

     

    Bu yukaridaki kodda session_destroy calisirana kadar counter ++ oalcaktir.

     


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozgunlu
    ozgunlu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 11/Kasım/2011
    Erkek

     

    Javada böyle bişey olmuyordu, anlamadım ki ben yav.

    Galiba olay şu dediğin : PHP de static oalrak tanimladiginiz class propertyleri onlari sonraki requestte sabit tutmaz.

    Başka yerden post ederek çözdüm sorunu, SESSION gelmemişti aklıma. İyi oldu, teşekkür ederim.

    Yaptığım çözüm böyle benim :

    <?php
    error_reporting(E_ALL | E_STRICT);
    require('UploadHandler.php');
    class CustomUploadHandler extends UploadHandler {
    	public static $case_name, $objective, $layer;
    	
    	public static function init($name, $obj, $l) {
    		self::$case_name = $name;
    		self::$objective = $obj;
    		self::$layer = $l;
    	}
    	
        protected function trim_file_name($file_path, $name, $size, $type, $error, $index, $content_range) {
                $name = self::$case_name . "_" . self::$objective . "_L" . self::$layer;
                return $name;
            }
    }
    
    $case_name = $_POST["case_name"];
    $objective = $_POST["objective"];
    $layer = $_POST["layer"];
    
    CustomUploadHandler::init($case_name, $objective, $layer);
    $upload_handler = new CustomUploadHandler();
    
    ?>




    Hello, i am nothing. I come from Neverland.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek
    dhmm bunu yazdı

    Hocam selamlar.

    Her defasinda new ile instance olusturuyorsunuz. Her instance olusturdugunuzda public static $i = 1 satiri calisir diye biliyorum.

    Boylece size hep 1 degeri dondurecektir.

    Ayrica bildigim kadariyla PHP de static oalrak tanimladiginiz class propertyleri onlari sonraki requestte sabit tutmaz.

    Yani su asagidaki kodu her refresh ettiginizde ayni sonucu alirsiniz 1 ve 2

    function X()
    {
    	static $x = 0;
    	$x++;	
    	echo $x;
    }
    
    x();
    x(); 

    Örnek oluşturmakla static initializer tekrar çağrılmaz. Yanlış. Fakat Php her bir php dosyasını bir application olarak ele aldığından sınıfın bulunduğu php dosyası her include edildiğinde tekrar ilklenir. Her requestte de bu şekilde olmasının nedeni bu.

     

    Ayrıca @ozgunlu tasarım yanlış. Php instance'ı sonlandığı zaman o i değişkeninden eser kalmayacak. Bu işi veritabanından halletmeni tavsiye ederim ya da o fonksiyona i'yi parametre olarak gönder.


    Olaylara karışmayın!
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozgunlu
    ozgunlu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 11/Kasım/2011
    Erkek
    YeniHarman bunu yazdı
    dhmm bunu yazdı

    Hocam selamlar.

    Her defasinda new ile instance olusturuyorsunuz. Her instance olusturdugunuzda public static $i = 1 satiri calisir diye biliyorum.

    Boylece size hep 1 degeri dondurecektir.

    Ayrica bildigim kadariyla PHP de static oalrak tanimladiginiz class propertyleri onlari sonraki requestte sabit tutmaz.

    Yani su asagidaki kodu her refresh ettiginizde ayni sonucu alirsiniz 1 ve 2

    function X()
    {
    	static $x = 0;
    	$x++;	
    	echo $x;
    }
    
    x();
    x(); 

    Örnek oluşturmakla static initializer tekrar çağrılmaz. Yanlış. Fakat Php her bir php dosyasını bir application olarak ele aldığından sınıfın bulunduğu php dosyası her include edildiğinde tekrar ilklenir. Her requestte de bu şekilde olmasının nedeni bu.

     

    Ayrıca @ozgunlu tasarım yanlış. Php instance'ı sonlandığı zaman o i değişkeninden eser kalmayacak. Bu işi veritabanından halletmeni tavsiye ederim ya da o fonksiyona i'yi parametre olarak gönder.

    javadan farkı ne ki, değişkenden eser kalmıyor ?

    static variable' lar ram de class' lardan önce yaratılıp uygulama sonlanana kadar tutulmaz mı ?


    Hello, i am nothing. I come from Neverland.
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek
    YeniHarman bunu yazdı
    dhmm bunu yazdı

    Hocam selamlar.

    Her defasinda new ile instance olusturuyorsunuz. Her instance olusturdugunuzda public static $i = 1 satiri calisir diye biliyorum.

    Boylece size hep 1 degeri dondurecektir.

    Ayrica bildigim kadariyla PHP de static oalrak tanimladiginiz class propertyleri onlari sonraki requestte sabit tutmaz.

    Yani su asagidaki kodu her refresh ettiginizde ayni sonucu alirsiniz 1 ve 2

    function X()
    {
    	static $x = 0;
    	$x++;	
    	echo $x;
    }
    
    x();
    x(); 

    Örnek oluşturmakla static initializer tekrar çağrılmaz. Yanlış. Fakat Php her bir php dosyasını bir application olarak ele aldığından sınıfın bulunduğu php dosyası her include edildiğinde tekrar ilklenir. Her requestte de bu şekilde olmasının nedeni bu.

     

    Ayrıca @ozgunlu tasarım yanlış. Php instance'ı sonlandığı zaman o i değişkeninden eser kalmayacak. Bu işi veritabanından halletmeni tavsiye ederim ya da o fonksiyona i'yi parametre olarak gönder.

    Hocam ornek(instance) olusturmuyorum. Verdigim ornek bir fonksiyon sadece. Fonksiyonu x() x() ile iki kez cagiriyorum static degerin degismedigini gostermek icin. Sonuca php dosyasinin calistirilmasi bitene kdr o fonksiyonun icinde static degeri sifirlanmaz. Yanlissam duzeltin lutfen.


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek
    ozgunlu bunu yazdı
    YeniHarman bunu yazdı
    dhmm bunu yazdı

    Hocam selamlar.

    Her defasinda new ile instance olusturuyorsunuz. Her instance olusturdugunuzda public static $i = 1 satiri calisir diye biliyorum.

    Boylece size hep 1 degeri dondurecektir.

    Ayrica bildigim kadariyla PHP de static oalrak tanimladiginiz class propertyleri onlari sonraki requestte sabit tutmaz.

    Yani su asagidaki kodu her refresh ettiginizde ayni sonucu alirsiniz 1 ve 2

    function X()
    {
    	static $x = 0;
    	$x++;	
    	echo $x;
    }
    
    x();
    x(); 

    Örnek oluşturmakla static initializer tekrar çağrılmaz. Yanlış. Fakat Php her bir php dosyasını bir application olarak ele aldığından sınıfın bulunduğu php dosyası her include edildiğinde tekrar ilklenir. Her requestte de bu şekilde olmasının nedeni bu.

     

    Ayrıca @ozgunlu tasarım yanlış. Php instance'ı sonlandığı zaman o i değişkeninden eser kalmayacak. Bu işi veritabanından halletmeni tavsiye ederim ya da o fonksiyona i'yi parametre olarak gönder.

    javadan farkı ne ki, değişkenden eser kalmıyor ?

    static variable' lar ram de class' lardan önce yaratılıp uygulama sonlanana kadar tutulmaz mı ?

    Hocam @YeniHarman hocanin dedigi gibi  Javadan farki "Php her bir php dosyasını bir application olarak ele aldığından sınıfın bulunduğu php dosyası her include edildiğinde tekrar ilklenir"

    Tahminim Java'da degiskenin bulundugu class destruct/dispose olmadan static deger sabit kalir.


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek

    Şimdi şöyle oluyor:

    Öncelikle http, durumsuz (stateless) bir protokol. Yani her isteğe bir cevap veriliyor ve sonra kayboluyor (böyle olmasaydı, bir web sunucunun anlık cevaplama kabiliyeti çok düşük olurdu). E o zaman kullanıcının yaptığı her request'e cevap verildikten sonra her şey baştan başlıyor.

    Php, yorumlanan bir dil. Her php dosyası çağrıldığında web sunucu yazılımı mime tipine göre çeşitli şekillerde (cgi, fastcgi, modül) php yorumlayıcısını dürtüyor. Php yorumlayıcısı, dosyayı baştan yorumlayıp çıktı haline getirip (paketleyip) web sunucusuna bunu cevap olarak gönder diyor.

    Her php dosyası için tekrar bir yorumlama süreci geçtiğine göre tüm nesneler baştan ilkleniyor sonucunu çıkarıyoruz. Kısaca static x, tek seferlik. Bu bağlamda statik değişken kullanmanın bir mantığı kalmıyor. Çünkü ne aynı oturumda istekler arasında ne de ayrı oturumlarda C# gibi Java gibi (bunlar arakoda !derlenir!) davranış bekleyemiyoruz.

    Session'da saklamanın mantığı yok (yukarıdaki unique ad verme fonksiyonu gibi) çünkü session düştükten sonra (timeout olabilir, kullanıcı tarafından oturumum bitsin isteği gelebilir, sunucu çökebilir) yine başa döndük.

    Hadi, bir de her kullanıcıyla paylaşılsın dersek ne olacak? global variables uçalı çok oldu. Mecburen kalıcı (persistent) bir yere depolayalım ki hem session uçtuğunda üzülmeyelim hem de gerektiği durumda diğer kullanıcılarla da paylaşalım (örneğin bu konuyu xx kişi okuyor).


    Olaylara karışmayın!
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozgunlu
    ozgunlu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 11/Kasım/2011
    Erkek
    YeniHarman bunu yazdı

    Şimdi şöyle oluyor:

    Öncelikle http, durumsuz (stateless) bir protokol. Yani her isteğe bir cevap veriliyor ve sonra kayboluyor (böyle olmasaydı, bir web sunucunun anlık cevaplama kabiliyeti çok düşük olurdu). E o zaman kullanıcının yaptığı her request'e cevap verildikten sonra her şey baştan başlıyor.

    Php, yorumlanan bir dil. Her php dosyası çağrıldığında web sunucu yazılımı mime tipine göre çeşitli şekillerde (cgi, fastcgi, modül) php yorumlayıcısını dürtüyor. Php yorumlayıcısı, dosyayı baştan yorumlayıp çıktı haline getirip (paketleyip) web sunucusuna bunu cevap olarak gönder diyor.

    Her php dosyası için tekrar bir yorumlama süreci geçtiğine göre tüm nesneler baştan ilkleniyor sonucunu çıkarıyoruz. Kısaca static x, tek seferlik. Bu bağlamda statik değişken kullanmanın bir mantığı kalmıyor. Çünkü ne aynı oturumda istekler arasında ne de ayrı oturumlarda C# gibi Java gibi (bunlar arakoda !derlenir!) davranış bekleyemiyoruz.

    Session'da saklamanın mantığı yok (yukarıdaki unique ad verme fonksiyonu gibi) çünkü session düştükten sonra (timeout olabilir, kullanıcı tarafından oturumum bitsin isteği gelebilir, sunucu çökebilir) yine başa döndük.

    Hadi, bir de her kullanıcıyla paylaşılsın dersek ne olacak? global variables uçalı çok oldu. Mecburen kalıcı (persistent) bir yere depolayalım ki hem session uçtuğunda üzülmeyelim hem de gerektiği durumda diğer kullanıcılarla da paylaşalım (örneğin bu konuyu xx kişi okuyor).

    hocam OOP' nin ne faydası oluyor o zaman bu PHP' ye.

    Tamam bir sürü bişeye düzene sokuyoruz da 100% fit de olmuyor bu olay.

    Yani bir java mantığıyla ilerleyemiyorum php de. Class' larım var tamam ama beni nelerden kurtarıyor tam da böyle rahat değilim.

    Bana göre sadece maintanence ve readability' i bir derece artıyor.

    Procedural yaklaşınca da çok birşey kaybetmiyormuşum gibi geliyor (her ne kadar bırakmış olsam da).

    Yani biraz mükemmelliyetçi bir yapım, birşeyi 10 kere düşünüp 1 kere yazma taraftarıyım, en iyisini yakalamaya çalışıyorum ama konu php' ye gelince, her konusunda ayrı bir tartışma ile karşılaşıyorum.


    Hello, i am nothing. I come from Neverland.
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek
    ozgunlu bunu yazdı
    hocam OOP' nin ne faydası oluyor o zaman bu PHP' ye.

    Tamam bir sürü bişeye düzene sokuyoruz da 100% fit de olmuyor bu olay.

    Yani bir java mantığıyla ilerleyemiyorum php de. Class' larım var tamam ama beni nelerden kurtarıyor tam da böyle rahat değilim.

    Bana göre sadece maintanence ve readability' i bir derece artıyor.

    Procedural yaklaşınca da çok birşey kaybetmiyormuşum gibi geliyor (her ne kadar bırakmış olsam da).

    Yani biraz mükemmelliyetçi bir yapım, birşeyi 10 kere düşünüp 1 kere yazma taraftarıyım, en iyisini yakalamaya çalışıyorum ama konu php' ye gelince, her konusunda ayrı bir tartışma ile karşılaşıyorum.

    Bahsettiğimiz sıkıntı doğruda php'nin oop yeteneklerinden kaynaklanmıyor. Tamam, php $'sidir, ->'dir, getter setter olayıdır, arrayların pass by value olmasıdır gibi bir sürü rezilliği var ama değil işte:)

    İşte o mükemmeliyetçilik sıkıntılı bir durum. Bir işin kalitesi şöyle anlaşılır:

    1. İşini yapıyor mu?

    2. İşini yaparken sıkıntı çıkarıyor mu?

    Bir yazılım (diğer her şey gibi) oluşturulma amacını hatasız yerine getiriyorsa iyidir, getirmiyorsa değildir. Nasıl, neyle, ne zaman yazıldığı önemli değil. Gidip üç satır kodu illa sınıf içine kapsüllemenin, a->b->c->d...->n hiyerarşisi kullanmanın saçma olduğu açık.

    Deneyimle çözülebileceğine inanıyorum bu durumun. Daha iyi mimari tasarımı, daha iyi soyutlama gibi önemli şeyler sorunla karşılaşıp çözünce oluyor.


    Olaylara karışmayın!
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    ozgunlu bunu yazdı
    YeniHarman bunu yazdı

    Şimdi şöyle oluyor:

    Öncelikle http, durumsuz (stateless) bir protokol. Yani her isteğe bir cevap veriliyor ve sonra kayboluyor (böyle olmasaydı, bir web sunucunun anlık cevaplama kabiliyeti çok düşük olurdu). E o zaman kullanıcının yaptığı her request'e cevap verildikten sonra her şey baştan başlıyor.

    Php, yorumlanan bir dil. Her php dosyası çağrıldığında web sunucu yazılımı mime tipine göre çeşitli şekillerde (cgi, fastcgi, modül) php yorumlayıcısını dürtüyor. Php yorumlayıcısı, dosyayı baştan yorumlayıp çıktı haline getirip (paketleyip) web sunucusuna bunu cevap olarak gönder diyor.

    Her php dosyası için tekrar bir yorumlama süreci geçtiğine göre tüm nesneler baştan ilkleniyor sonucunu çıkarıyoruz. Kısaca static x, tek seferlik. Bu bağlamda statik değişken kullanmanın bir mantığı kalmıyor. Çünkü ne aynı oturumda istekler arasında ne de ayrı oturumlarda C# gibi Java gibi (bunlar arakoda !derlenir!) davranış bekleyemiyoruz.

    Session'da saklamanın mantığı yok (yukarıdaki unique ad verme fonksiyonu gibi) çünkü session düştükten sonra (timeout olabilir, kullanıcı tarafından oturumum bitsin isteği gelebilir, sunucu çökebilir) yine başa döndük.

    Hadi, bir de her kullanıcıyla paylaşılsın dersek ne olacak? global variables uçalı çok oldu. Mecburen kalıcı (persistent) bir yere depolayalım ki hem session uçtuğunda üzülmeyelim hem de gerektiği durumda diğer kullanıcılarla da paylaşalım (örneğin bu konuyu xx kişi okuyor).

    hocam OOP' nin ne faydası oluyor o zaman bu PHP' ye.

    Tamam bir sürü bişeye düzene sokuyoruz da 100% fit de olmuyor bu olay.

    Yani bir java mantığıyla ilerleyemiyorum php de. Class' larım var tamam ama beni nelerden kurtarıyor tam da böyle rahat değilim.

    Bana göre sadece maintanence ve readability' i bir derece artıyor.

    Procedural yaklaşınca da çok birşey kaybetmiyormuşum gibi geliyor (her ne kadar bırakmış olsam da).

    Yani biraz mükemmelliyetçi bir yapım, birşeyi 10 kere düşünüp 1 kere yazma taraftarıyım, en iyisini yakalamaya çalışıyorum ama konu php' ye gelince, her konusunda ayrı bir tartışma ile karşılaşıyorum.

    JSP dede benzer kod yazsan aynı tepkiyi verecektir. Sorun php değil yani. Yazdığın kod http için bu şekilde çalışması gerekiyor zaten.

     

    Böyle bir ihtiyaç için en mantıklısı memcached gibi bir teknoloji ile static değeri tutmak.

     

    DrKill tarafından 16/Nis/16 02:46 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
Toplam Hit: 1609 Toplam Mesaj: 17
php static variable