Php Static Değer Hep Aynı
-
<?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 -
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.
-
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(); ?>
-
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.
-
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ı ?
-
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.
-
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.
-
Ş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).
-
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.
-
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.
-
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.