değişken önceden tanımlanmasını, önceki noktaya değişken hareketli

1 Cevap php

Tamam, burada gerçekten şaşırıp anlaşma.

I use my cms with design patterns. Where's the last final output(in design template's main file: 'design.php'):

<div>{CONTENT_HEADER}</div>
<div style='float:left;width:25%'>{CONTENT_LEFT}</div>
<div style='float:left;width:50%'>{CONTENT_CENTER}</div>
<div style='float:left;width:25%'>{CONTENT_RIGHT}</div>
<div>{CONTENT_FOOTER}</div>

CONTENT_XXXX generater düşünce site modülleri olduğu durumlarda:

ob_start("gz_handler");
<....... LOAD ALL THE HEADER MODULES .......>
$output0 = ob_get_contents();
ob_end_clean();

ob_start("gz_handler");
<....... LOAD ALL THE LEFT SIDE MODULES .......>
$output1 = ob_get_contents();
ob_end_clean();

ob_start("gz_handler");
<....... LOAD ALL THE CENTER SIDE MODULES .......>
$output2 = ob_get_contents();
ob_end_clean();

ob_start("gz_handler");
<....... LOAD ALL THE RIGHT SIDE MODULES .......>
....
// That's I talk about, but this is just for static html, not variables
// Push to header finalizers to override default <title></title>
$header_finalizers_array['change_head_title_attr_to'] = $thread_data['topic_title'];
<....... END OF ALL THE RIGHT SIDE MODULES .......>
$output3 = ob_get_contents();
ob_end_clean();

ob_start("gz_handler");
<....... LOAD ALL THE FOOTER MODULES .......>
$output5 = ob_get_contents();
ob_end_clean();

define("CONTENT_HEADER", finalize_output($output0,$header_finalizers_array));
define("CONTENT_LEFT", finalize_output($output2,$left_finalizers_array));
define("CONTENT_CENTER", finalize_output($output3,$center_finalizers_array));
define("CONTENT_RIGHT", finalize_output($output4,$right_finalizers_array));
// No need finalizations, because there are no more parts, which call content changes
define("CONTENT_FOOTER", $output5);

Tüm vakaların% 95 ok. Ancak, SADECE (sağ taraf modülleri örn.) SONRAKİ SİDE tanımlanmış olacaktır (sol taraf modüller) Ben değişkenin içeriğini ALMAK İÇİN gereken bazı durumlar vardır

Benim koduyla, ben ex bunu değiştirmek mümkün, bunu istiyorum o zaman 'başlığı modülleri' site başlıklarını tanımlayabilirsiniz ama. sağ tarafı, ben güçlü olduğum için diziye eklemek tüm yan içeriği istemci tarayıcısına baskı ÖNCE değişkenlere generater olacak ama sonra idam edilecek veri gereksinimi, değiştirin.

Tüm bu sadece fonksiyon 1 hattı ile yapılabilir:

function finalize_output($output="",$fin_array=array()) {
   <...>
   $output = preg_replace("#<title>.*</title>#i", "<title>".$fin_array['change_head_title_attr_to']."</title>", $output, 1);
   <...>
}


Now about my problem.

How to do the same with VARIABLES:

LEFT SIDE modülleri IN Ben bir cümle var (SORUN: $object):

if(isset($object)) {
  $best_product = sqlArray(sqlQuery("SELECT * FROM tableA WHERE b='$object'"));
 <..All the rest code of BEST's product..>
}

RIGHT SIDE modülleri IN ben sencence var (SORUN: $object):

<... Print LAST 10 PRODUCTS ***>
$res = sqlquery("SELECT * FROM tableA ORDER BY id DESC LIMIT 100);
while($data = sqlarray($res)) { <..PRINT PRODUCT INFO..> }

$new = rand(0,secured($_POST['user_input_new_products']));
for($i=1;$i<=$new;$i++) {
  $price_diff_old_new1 = change_products_to_sql('fish_$i', 19.99);
  $price_diff_old_new2 = push_product_to_sql('crab_$i', 16.99);
  if($i==$new) {
    $object = $price_diff_old_new1+$price_diff_old_new2;
  }
}

THIS IS JUST EXAMPLE CODE OF WHAT I NEED TO DO(so don't go to details), but THE POINT IS THAT, that I need somehow to submit the variable to earlier point of source: One of solutions would be " USE GOTO ", but is it variable will be remebered.

Yani:

echo "JOB IS STARTED";
  LABEL HOME:
   <INCLUDED FILE : procuts.php >
      if(isset($object) && check_is_number($object)) {
       $a = $object;
      }
      if(isset($break_me) && $break_me) {
        GOTO FINAL;
      }
   <END OF INCLUDE>
   ...

 <INCLUDED FILE : upload.php >
    $object = 999;
    $break_me = true;
    GOTO HOME;
  <END OF INCLUDE>
}
 LABEL FINAL: 
echo "JOB IS DONE";

VE, WITHOUT GOTO bunu yapmanın başka bir yolu var olduğunu (GOTO çözeltisi (mümkün olur?))?


Ben şahsen bu kadar kod mümkün değildir düşündüm ama Php mümkün 5.3.0 beri, ben kodlu olması olası hale gelir. Misfortunelly Ben şirket kendi sunucularında Php 5.3.0 kullanacağız emin değilim, bu yüzden başka çözümler olduğunu umuyoruz.

Ayrıca ben bile hala GOTO Orada yardımcı olacak emin değilim.

1 Cevap

I suggest rethinking your architecture.

Hiçbir suç, ama kod bana oldukça dağınık görünüyor.

Bir kaç şey işaret etmek:

  • Eğer Design Patterns kullanmak dedi, ama sadece desen Template View gibi görünüyor. Her iki durumda da uygun olacağını, MVC kullanıyor gibi görünüyor, ne de bir Two-Step View yok.
  • Kullanmadığınız herhangi belirli bir nedeni yoktur OOP? Bu usul kodlama kötü bir şey olduğunu değil, ama doğru encapsulation of things that conceptually go together ve separation of concerns app çok daha rahat yapacaktır.
  • değişken adları anlamlı değildir. Bir $output0 gerçekten içinde ne olduğu hakkında bir şey söyler. Neden $object bir sayı tutun nedir? push_to_sql() ve change_to_sql() hem ses: Aynı işlev adları için de geçerlidir. Ben bir araçları insert ve bir vasıta update sanırım, ama semantik çok daha net olabilir.
  • Neden variables için içerik blokları tutan atama constants? Bu adım, siz de şablon görünümünde değişkenleri kullanmak gibi tamamen gereksiz.

Şimdi, ben senin soru açıklamasındaki örnek kod kullanılan anlamak, bu yüzden üretim kodu için geçerli değil noktaları ele eğer benimle ayı. Ama yine de, sizin modüller diğer etkilemeden yeniden düzenlenebilir olamayacağını basit gerçeği bir code smell gösterir. Modüller müstakil olmalıdır.

Ama şimdi konuya dönelim.

Eğer kaynak bir önceki noktaya değişken göndermeniz gerektiğini söylüyorlar. Nedenini anlamaya yeterli örnek kod anlamıyorum. Ama ayrı bir fonksiyon içine modüller arasında paylaşılır edilecektir Big Ball of Mud current architecture, you could refactor tüm kod tutmak zorunda. Ardından gerekli tüm veri yüklenebilir ve içerik blokları render işlevleri içine enjekte edilir. Bu şekilde, istediği gibi onları etrafında itmek gerekir.

Eğer mevcut mimari tutmak zorunda yoksa, kendinize bir iyilik yapın ve yukarıda bağlantılı desenleri bakabilirsiniz. Çoğu PHP frameworks, onları kullanmak ve biri üzerine app göç düşünebilirsiniz. Ayrıca, kodunuzu geliştirmek, bu bir göz QA tools ve bu siteleri kontrol: