2017-02-21 24 views
0

Coming из JavaScript, я привык к наличию всех своих функций, вложенных в объекты, как так:Как визуализировать набор функций в PHP вложенный массив/объект

var app = { 
    something: { 
     something: { 
      some_variable:"something", 
      something: function() { 
       return this.some_variable; 
      } 
     } 
    } 
}; 
console.log(app.something.something.something()); // "something" 

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

В PHP, я делал это с помощью массивов:

$app=[ 
    "name"=>"my_app", 
    "database"=>[ 
     "password"=>"497624779", 
     "connect"=>function(){ 
      //connect to db here using $GLOBALS["app"]["database"]["password"] 
     }, 
     "update"=>function(){ 
      //update records, etc 
     } 
    ], 
    "page"=>[ 
     "data"=>[ 
      "page_1"=>[ 
       "title"=>"Home", 
       "icon"=>"", 
       "etc"=>"" 
      ], 
      "page_2"=>[ 
       "title"=>"", 
       "icon"=>"", 
       "etc"=>"" 
      ], 
      "page_3"=>[ 
       "title"=>"", 
       "icon"=>"", 
       "etc"=>"" 
      ] 
     ], 
     "loading"=>function($page_name){ 
      return $GLOBALS["app"]["page"]["data"][$page_name]["title"]." is loading..."; 
     } 
    ] 
]; 

Это означает, что я могу это сделать:

$app["database"]["connect"](); 
echo $app["page"]["loading"]("page_1"); // "Home is loading..." 

Как бы перенести это с помощью объектов, так что я могу это сделать :

$app->database->connect(); // connect function would use $this->password, not GLOBALS 
$app->page->loading("page_1"); 

к сожалению, все учебники там не показывают, как гнездо несколько объектов, как мой javascr Пример ipt выше. Мне нравится древовидная структура массивов для визуализации, но я не могу найти способ, чтобы определить объект таким образом - только примеры, как это:

$app=new stdClass(); 
$app->database=new stdClass(); 
$app->database->password="497624779"; 
//etc 

т.е. не очень визуальные вообще. Если я реорганизую весь свой код таким образом, я заблужусь в нем, если я не буду периодически выполнять var_dump объекта.

Смутный вопрос, я знаю. Может кто-то указать мне верное направление?

+0

Используется для создания объекта-прототипа. Вы не привыкли работать в объектно-ориентированном шаблоне из определения класса. Определите каждый класс самостоятельно, сохраните каждый из них в собственном файле. Не пытайтесь все это в одном большом месте. Также читайте об инъекции зависимостей. – k0pernikus

+0

И избегайте использования 'stdClass'. Определите свои собственные классы. – k0pernikus

ответ

0

В PHP вы должны использовать пространства имен и классы для организации своего кода.

Namespaces: http://php.net/manual/en/language.namespaces.php

\some\name\space\class::staticMethod() 

Классы & Объектов: http://php.net/manual/en/language.oop5.php

$obj = \some\name\space\class(); 
$obj->someMethod(); 
+0

Привет. Я заглянул в пространства имен, но получил ошибку, когда попытался вложить их так: 'namespace app {namespace {database}}'. Я надеялся, что это превратится в '\ app \ database :: connect()' или аналогичный – DaveHolt

+0

http://php.net/manual/en/language.namespaces.basics.php в файле 'file2.php' именно то, что ты ищешь. Вы читали этот http://php.net/manual/en/language.namespaces.nested.php? –

+0

ОК, поэтому, возможно, пространства имен - это путь вперед, но они разочаровывают. Я просто не могу их представить. Есть ли способ определить их, как в моих древовидных структурах выше? Или, по крайней мере, определить их стандартным образом, но ** просмотреть ** классы/пространства имен в качестве древовидной структуры? Все, о чем я забочусь, это возможность увидеть, где код подходит для проекта. Использование 'var_dump' в классе, к сожалению, не показывает никаких« детей », так сказать. – DaveHolt

-1

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

Это потому, что вы не можете определить вложенные объекты в PHP.

Однако вы можете расширить класс любое количество раз, вы можете использовать namespaces, и если вам нужно несколько наследований, Traits позволяет вам это сделать.

Кроме того, цепочка методов также является plausibe, возвращая экземпляр объекта в конце, если методы класса. Дополнительная информация здесь: How to create a fluent query interface?

+0

Черты действительно выглядят хорошо на самом деле. Я просто сделал еще один комментарий к другому ответу на визуализацию. Думаю, я хочу увидеть код в древовидной структуре. Если бы я пошел по этому маршруту, был бы способ заставить PHP вырвать логическую структуру всех этих объектов/отношений, чтобы я мог просматривать его в древовидном формате? – DaveHolt

 Смежные вопросы

  • Нет связанных вопросов^_^