2015-12-15 4 views
0

У меня есть старый сайт, чтобы вывести его на стандартный уровень, но я должен каким-то образом подходить к делу из-за проблем с синхронизацией и определенных ограничений, что мешает моему желанию реструктурировать весь сайт должным образом снизу вверх.Как узнать, какие объекты на странице используют определенный класс

Основная часть работы включает в себя обновление различных файлов include. Таким образом, они включают в себя файлы называются на страницу, которая использует класс для создания объекта, как обычно,

Проблемы:

Есть много страниц, и они не всегда закодированы (благодаря суб- стандартные предыдущие разработчики на сайте), поэтому иногда класс я хочу использовать в качестве объекта под названием $database, иногда на других страницах объект называется $dataBase, $connection, и т.д. и т.п.

есть несколько включает в себя, что я работая, и я чувствую, что необходимость создания нового объекта для каждого из них на каждой странице крайне неэффективна, e этот вопрос:

Могу ли я узнать из PHP, какие переменные объекта, если таковые имеются, используют определенный класс?

Иллюстрация:

index.php Page

require "class.sausages.inc.php"; 
$hotdog = new sausages(); 

$hotdog->somefunction(); 
//etc. etc. 

include "some_file_i_need_to_work_on.php"; 

include "/folder/some_other_file_I_work_on.php"; 

//etc. etc. 

Page index2.php

require "class.sausages.inc.php"; 
$hotdogs = new sausages(); 

$hotdogs->someOtherfunction(); 
//etc. etc. 

include "some_file_I_need_to_work_on_3.php"; 

include "/folder/some_other_file_I_work_on.php"; 

//etc. etc. 

Так мне нужно работать на включает в себя и так для каждого включаемого файла I не знаю точно$name объекта переменной, созданного в родительском файле include. Все, что у меня есть, это то, что он использует класс sausages.

Решение пытается

Я прочитал how to check if object of a class already exists in PHP?, который в значительной степени тот же вопрос, но решение отмеченное здесь является создание глобального, что я чувствую себя еще один слой и, честно говоря, я не совсем комфортно это эффективное решение.

То, что я пытаюсь избежать, это ситуация, когда каждый из них включает на определенной странице, должен генерировать свой собственный object, все из того же класса (обычно), установленного на родительской странице.

Как нет никаких guarentee в одном включении, если включено другое включение, я не думаю, что могу сгенерировать объект, который все может использовать вместе, или если могу, как я могу это сделать?

Что бы я хотел

Я хочу быть в состоянии найти способ установить в PHP:

имеет какой-либо объект был создан с помощью этого класса?

Да? Используйте этот объект в этом include.

нет? сгенерировать новый объект из файла класса.

Возможно ли это?

Примечания:

  • Есть около десятка включаемых файлов,

  • Есть много родительских страниц (50+). Я думаю, что редактирование каждого из них было бы неэффективным (но это будет сделано в будущем)

  • Некоторые родительские страницы содержат некоторые файлы include, некоторые из них содержат другие. В каких файлах (в зависимости от того, что я могу сказать до сих пор) не содержится никаких гарантий, которые включены.

  • Большинство, но не все родительские страницы уже установили объект класса.

  • PHP 5.6.16

+0

У вас может быть более легкая жизнь, если вы будете использовать интерфейсы –

+0

@bub Не могли бы вы проиллюстрировать, как интерфейсы мне помогут здесь? Как я уже сказал, это унаследованный сайт, который был изменен, снова и снова, разными людьми в течение длительного периода времени. Я хотел бы реструктурировать его с нуля, но это не то, что я могу сделать, на данный момент – Martin

+0

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

ответ

4

согласно:

http://php.net/manual/en/internals2.opcodes.instanceof.php

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

if ($hotdog instanceof sausages){ 
     // use $hotdog 
    } 

    else { 
     // create and use $hotdog 
    } 

Но это не расскажет вам ничего о других переменных.

Вы также можете использовать это:

http://php.net/manual/en/function.get-defined-vars.php

, чтобы получить список всех определенных Варс в массив. Вы можете затем цикл через массив, чтобы увидеть, если есть какие-то экземпляры класса, которые Вас интересуют.

foreach (get_defined_vars() as $var) 
    { 
     if ($var instanceof sausage) { 
      // use this var 
     } 
    } 

Это решение будет делать то, что вы хотите, однако следует отметить, что это, вероятно, безопаснее создать новый объект. Когда вы используете уже созданный объект внутри include, вы не знаете, какие другие операции были выполнены с этим объектом. К тому времени, когда вы начнете его использовать, колбасу можно очень хорошо обжарить, и она может не делать именно то, что вы хотите.

Вы также должны изучить singleton pattern.

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

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

  • определяет одноплодную метод внутри класса колбаски
  • поиска/заменить все из new sausages мест где с sausages::singleton()
  • внутри включаемой, вы можете смело использовать $ сосиски = колбаски :: одноплодные();

Это сделает намного более чистый код, чем попытка определить, есть ли какие-либо глобальные экземпляры колбас.

+0

Спасибо. 'instanceof' достаточно близко к тому, что я ищу, я бы объединил его с' get_defined_vars', чтобы увидеть, какие объекты являются объектами, как вы указываете. Я знаю, что объект, унаследованный от родителя, может быть непригоден, но кодирование для текущего сайта (в основном) не является истинным объектом и более использует их в качестве абстрактных классов. – Martin

+0

экземпляр является признаком плохой дизайн. Используйте интерфейсы. Будьте тверды! –

+1

Возможно, вы захотите снова прочитать первое предложение этой проблемы @bub – Karolis

0

Для заключения; Я закончил тем, что брал ответ Karolis' и создания поисковой системы для правильной переменной объекта, без необходимости провоцировать новый, если один уже определен:

В верхней части каждого из моих включает в себя:

foreach (get_defined_vars() as $varKey => $variable) { 
    if(is_object($variable) && $variable instanceof sausages) { 
     $$varKey = $variable; 
    } 
} 

//$$varKey = this is the instance object. 

Очевидно, что код для, если нет instanceof, не указан здесь, но этот код работает для меня до сих пор.