PHP Ölümcül hata, model içinde yöntemini istemek için çalışırken birden çok kez

3 Cevap php

The error message

[23-Mar-2010 08:36:16] PHP Fatal error: Cannot redeclare humanize() (previously declared in /Users/tmclssns/Sites/nadar/nadar/trunk/webapp/application/filer/models/Filer/Aggregate.php:133) in /Users/tmclssns/Sites/nadar/nadar/trunk/webapp/application/filer/models/Filer/Aggregate.php on line 133

Ben grafikler oluşturmak için çeşitli yöntemler içeren bir "Filer" modeli var. Üreten grafikler ile ilgili orada her yöntem yöntemi adı soneki "Graph" vardır. Bazı performans sorunları var, ben bunun yerine her isteği üzerine onları render önceden grafikleri (cron kullanarak) işlemek için deneyin. Aşağıdaki kod ben ile geldi budur:

public function generategraphsAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        $config = Zend_Registry::get('config');
        $id = $this->_getParam('filerid');

        $filer = new Filer($id);
        $filer_methods = get_class_methods($filer);

        foreach ($filer_methods as $filer_method) {
            if (preg_match('/^(.*)Graph$/i', $filer_method, $matches)) {
                $path = $config->imaging_caching_dir . "/$id/{$matches[1]}.png";
                $filer->$matches[0]($path);
            }
        }

        // var_dump(get_class_methods($filer)); die;
    }

Var_dump () elde edilen sonuç, uncommented zaman gibidir:

array
  0 => string '__construct' (length=11)
  1 => string 'find_by_name' (length=12)
  2 => string 'getPartner' (length=10)
  3 => string 'getSlots' (length=8)
  4 => string 'getGroups' (length=9)
  5 => string 'grouplist' (length=9)
  6 => string 'getAggregates' (length=13)
  7 => string 'getVolumes' (length=10)
  8 => string 'getAggregateVolumes' (length=19)
  9 => string 'getShelves' (length=10)
  10 => string 'getAutoSupportHistory' (length=21)
  11 => string 'getAutoSupportMail' (length=18)
  12 => string 'getOrphans' (length=10)
  13 => string 'getAll' (length=6)
  14 => string 'getDiskRevOverview' (length=18)
  15 => string 'getDiskTypeOverview' (length=19)
  16 => string 'getDiskTypeSizeFunctionOverview' (length=31)
  17 => string 'getLicenses' (length=11)
  18 => string 'removeGroup' (length=11)
  19 => string 'addGroup' (length=8)
  20 => string 'hasGroup' (length=8)
  21 => string 'aggdefaultGraph' (length=15)
  22 => string 'aggbarGraph' (length=11)
  23 => string 'voldefaultGraph' (length=15)
  24 => string 'volbarGraph' (length=11)
  25 => string 'replicationGraph' (length=16)
  26 => string 'getReplicationData' (length=18)
  27 => string 'humanize' (length=8)
  28 => string 'getFiler' (length=8)
  29 => string 'getOptions' (length=10)
  30 => string 'getCifsInfo' (length=11)
  31 => string 'getCifsStats' (length=12)
  32 => string '__get' (length=5)
  33 => string 'tr' (length=2)
  34 => string 'trs' (length=3)
  35 => string 'fieldList' (length=9)

GenerategraphsAction () yöntemi doğru 'grafik yöntemleri bulur:

array
  0 => string 'aggdefaultGraph' (length=15)
  1 => string 'aggdefault' (length=10)

array
  0 => string 'aggbarGraph' (length=11)
  1 => string 'aggbar' (length=6)

array
  0 => string 'voldefaultGraph' (length=15)
  1 => string 'voldefault' (length=10)

array
  0 => string 'volbarGraph' (length=11)
  1 => string 'volbar' (length=6)

array
  0 => string 'replicationGraph' (length=16)
  1 => string 'replication' (length=11)

Ancak ilk grafiği oluşturulur zaman, bu, yukarıda listelenen PHP önemli bir hata üretir. Herkes bu bir çözüm ile gelebilir? Ben de bir kaç şey referans geçmek ya geçmek için çalıştı (Filer modeli, $ current_filer = new Filer ($ id beyan re gibi) ve unset () onu tekrar istekten sonra, ama aynı hata sonuçlandı) fazla başarılı olamadı .

Başvurulan yöntem "insancıl" Ben şu anda yapıyorum herhangi bir şey için kullanılan, ancak birkaç başka yerlerde kullanılan çünkü Modeline ait değildir. Tabii ki, yöntemini kaldırarak şu anda gerçekten bir seçenek değildir, ve bu model de ben sadece etrafında Humanize yöntemini taşırsanız, bir sonraki birinde bir hata üretecektir varsayalım böylece diğer bazı yöntemler içerir.

Referans için, Humanize () yöntemi:

public function humanize ($kbytes, $unit = null) {
       // KiloByte, Megabyte, GigaByte, TeraByte, PetaByte, ExaByte, ZettaByte, YottaByte
       $units = array('KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
       if (null !== $units) {
           $i = array_search(substr($unit, -2), $units);
           if (! $i) {
               $i = floor((strlen($kbytes) - 1) / 3);
           }
       } else {
           $i = floor((strlen($kbytes) - 1) / 3);
       }
       $newSize = round($kbytes / pow(1024, $i), 2);
       return $newSize . $units[$i];
   }

Sunulan yardım için şimdiden teşekkür ederiz.

3 Cevap

Ben senin parenthesise yanlış ve fonksiyon Humanize bildirimi dolayısıyla bir süre döngü içinde yeniden bildirilmiş bekliyoruz.

Elbette iki yerde bu fonksiyonu tanımlayan dosyayı dahil sürece?

Ben neden, ilk yöntem aggdefaultGraph içinde, bir çağrı başka bir model için yapılan bulundu:

Filer_Aggregate::sums($this->aggregates);

Filer_Aggregate model içinde, ancak bir çağrı Filer modele tekrar yapılır:

$dataset[] = array('The rest: '.Filer::humanize($rest), $rest, 'rest', 'white', array_shift($colors));

İşte o Redeclare hatayı gösterir nedeni budur. Şimdi bu konuya bir çözüm bulmak gerekiyor.

public static function sums ($aggregates) {
    function humanize(&$item, $key) {
        $item = Filer::humanize($item);
    }

    $sums = array('size_total' => 0, 'size_usable' => 0, 'size_snapshot_reserve' => 0,
                  'size_snapshot_used' => 0, 'size_snapshot_free' => 0,
                  'size_active_fs_used' => 0, 'size_active_fs_free' => 0,
                  'size_active_fs_reserved' => 0);
    foreach ($aggregates as $aggregate) {
        if ($aggregate->state !== 'online') continue;
        $sums['size_total'] += $aggregate->size_total;
        $sums['size_usable'] += $aggregate->size_usable;
        $sums['size_snapshot_reserve'] += $aggregate->size_snapshot_reserve;
        $sums['size_snapshot_used'] += $aggregate->size_snapshot_used;
        $sums['size_snapshot_free'] += $aggregate->size_snapshot_free;
        $sums['size_active_fs_used'] += $aggregate->size_active_fs_used;
        $sums['size_active_fs_free'] += $aggregate->size_active_fs_free;
        $sums['size_active_fs_reserved'] += $aggregate->size_active_fs_reserved;
    }
    $humanSums = $sums;
    array_walk($humanSums, 'humanize');
    return array($sums, $humanSums);
}

Fonksiyon içinde fonksiyon suçlu.