Пространство имен PHP и Включает () с классами

На основе моего опыта никогда не было желательно позвонить GC.Collect () в производственном коде. В отладке, да, это имеет, это - преимущества, чтобы помочь разъяснить потенциальные утечки памяти. Я предполагаю, что моя фундаментальная причина состоит в том, что GC был записан и оптимизирован программистами, намного более умными тогда я, и если я добираюсь до точки, что я чувствую, что должен назвать GC.Collect (), это - подсказка, что я ушел путь куда-нибудь. В Вашей ситуации это не кажется, что у Вас на самом деле есть проблемы памяти, просто что Вы заинтересованы, какую нестабильность набор принесет к Вашему процессу. Наблюдение, что это не вычистит объекты, все еще используемые, и что это адаптируется очень быстро и к повышению и к понижению требований, я думал бы, что Вы не должны будете волноваться об этом.

10
задан David Snabel-Caunt 11 September 2009 в 09:52
поделиться

3 ответа

Как насчет eval () ?

Новый A.php

$lines = file('a_original.php');
array_unshift($lines, 'namespace AO;?>');
$string = implode(chr(13).chr(10), $lines);
eval($string);

class A extends AO\A
{   
    public function hello()
    {
        parent::hello();
        echo "hello world from Class A Extended\n";
    }
}
-4
ответ дан 4 December 2019 в 05:45
поделиться

Вы можете расширить класс, не изменяя его существующее поведение:

class A {
  public function foo(){

  }
}

class MySubClassOfA extends A {
  public function bar(){

  }
}

Вы можете добавить свои собственные методы в MySubClassOfA, то есть bar (). Вы можете вызвать метод foo в MySubClassOfA, и его поведение будет таким же, если вы не определите метод с именем foo в MySubClassOfA.

3
ответ дан 4 December 2019 в 05:45
поделиться

Думаю, у вас нет другого выбора, кроме как добавить одну строку кода « namespace xxx; » поверх всех ваших файлов. Может оказаться полезным следующий сценарий PHP CLI.

<?php
function convert($namespace, $srcdir, $dstdir)
{
  try
  {
    $files = glob("$srcdir/{*,.*}", GLOB_BRACE);

    if ( ! file_exists($dstdir) && ! mkdir($dstdir) )
    {
      throw new Exception("Cannot create directory {$dstdir}");
    }

    if ( ! is_dir($dstdir) )
    {
      throw new Exception("{$dstdir} is not a directory");
    }

    foreach ( $files as $f )
    {
      extract(pathinfo($f)); // then we got $dirname, $basename, $filename, $extension

      if ( $basename == '.' || $basename == '..' )
      {
        continue;
      }

      if ( is_dir($f) )
      {
        $d = $dstdir. substr($f, strlen($srcdir));
        convert($namespace, $f, $d);
        continue;
      }

      print "processing {$f} ... ";

      if ( ($s = file_get_contents($f)) === FALSE )
      {
        throw new Exception("Error reading $f");
      }

      if ( preg_match("/^\s*namespace\s+\S+;/m", $s) )
      {
        print "already has namespace, skip";
      }
      else
      {
        $lines   = preg_split("/(\n|\r\n)/", $s);
        $output  = array();
        $matched = FALSE;

        foreach ( $lines as $s )
        {
          $output[] = $s;

          // check if this is a PHP code?
          if ( ! $matched && preg_match('/<(\?(php )*|%)/', $s) )
          {
            $matched = TRUE;
            print "insert namespace ... ";
            $output[] = "namespace {$namespace};";
          }
        }

        if ( file_put_contents("{$dstdir}/{$basename}" , implode("\n", $output)) === FALSE )
        {
          throw new Exception("Cannot save file {$dstdir}/{$basename}");
        }

        if ( ! $matched )
        {
          print ("not a PHP file, skip.");
        }
        else
        {
          print "done!";
        }
      }

      print "\n";
    }
  }
  catch (Exception $e)
  {
    print 'Error: '. $e->getMessage() .' ('. $e->getCode() .')' ."\n";
  }
}

extract($_SERVER);

if ( $argc < 4 )
{
?>
Usage: php -F <?=$argv[0]?> <namespace> <source_dir(s)> <dst_dir>
Convert PHP code to be namespace-aware
<?
  return;
}
else
{
  for ( $i = 2; $i < $argc - 1; $i++ )
  {
    convert($argv[1], $argv[$i], $argv[$argc-1]);
  }
}
?>
1
ответ дан 4 December 2019 в 05:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: