В PHP, как я могу обернуть процедурный код в классе? - PullRequest
4 голосов
/ 19 мая 2011

У меня есть большой кусок устаревшего php-кода, с которым мне нужно взаимодействовать, который выглядит следующим образом:

//legacy.php

function foo() {
}

function bar() {
}

Я хочу иметь возможность обернуть эти устаревшие функции в классе или каким-то образом require_once без загрязненияэто глобальное пространство имен или изменение исходного файла.

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

Вы можете использовать пространство имен или статические методы в классе:

// original file: foo.php
class Foo
{
  public static function foo() { }
  public static function bar() { }
}

// new file:
require 'foo.php';

class MyNewClass
{
  public function myfunc()
  {
    Foo::foo();
  }
}

$x = new MyNewClass();
$x->myfunc();

Оба требуют небольших изменений в файле. например, вызовы bar() должны быть изменены на Foo::bar() в вышеприведенном примере (класс со статическими методами).

ИЛИ, используя пространство имен:

namespace foo;

use \Exception;
// any other global classes

function foo() { }
function bar() { }

В вашем файле:

require 'foo.php';

foo\foo();
foo\bar();
1 голос
/ 19 мая 2011

Как уже упоминалось в комментариях, я бы настоятельно рекомендовал рассматривать это как возможность для рефакторинга.

Но если вы не можете этого сделать по какой-либо причине, ответ на ваш вопрос зависит от того,функции в исходном файле legacy.php вызывают друг друга внутренне.

Если нет, то да, довольно просто сделать что-то вроде этого:

<?php
class legacyFunctions {
require_once('legacy.php');
}
?>

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

Если вы используете PHP5.3, вы можете рассмотреть возможность использования пространства имен PHP , а не класса для этого, что решило бы проблему необходимостисоздать экземпляр класса.Хотя механизм будет почти таким же.

Однако, если ваши функции вызывают друг друга в устаревшем php-коде, то ничего из этого не будет возможно, по крайней мере, без внесения некоторых изменений в ваш прежний код для изменения вызовов функций.к их новым версиям.

...