2012-04-07 2 views
0

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

<?php 
class BaseClass { 
    private $subclass = NULL; 
    function __construct() { 
     print "In BaseClass constructor<br>"; 
     $this->subclass = new SubClass(); 
    } 
    function sayhello() { 
    print 'hello from base class'; 
    } 
} 

class SubClass extends BaseClass { 
    function __construct() { 
     print "In SubClass constructor<br>"; 
     $this->sayhello(); 
    } 

    function saygoodbye($num) { 
    print 'goodbye from base class'; 
    } 
} 

$SUB = new SubClass(); 
?> 

Мое намерение сделать это должно было быть в состоянии получить доступ ко всему, используя $this->, например, как работает CodeIgniter. Это то, что у меня есть в файле index.php для моего частного API. Я хочу иметь возможность аутентифицировать запрос API перед вызовом call_user_func_array(). Мне также нужно подключиться к базе данных для проверки подлинности, но я хочу иметь возможность получить доступ к базе данных из подкласса. По сути, код определяет, какой метод API вызывается, затем создает экземпляр подкласса и, наконец, вызывает метод.

$get_contents = $_GET; 

$resource_name = $get_contents['_resource']; 
unset($_GET['_resource']); 

$resource_method = $get_contents['_resource_method']; 
unset($_GET['_resource_method']); 

//Load the resource class 
include 'core/resources/' . $resource_name . '.php'; 

//If set to true, each method will require an API key to be used 
$auth_required = array(); 
$auth_required['collections']['addcollection'] = TRUE; 

if(isset($auth_required[$resource_name][$resource_method]) && $auth_required[$resource_name][$resource_method] == TRUE) { 
    print 'requires auth'; 
} 

//Create a new instance of the resource 
$API = new $resource_name(); 

$method_params = $_GET; 

call_user_func_array(array(&$API, $resource_method), $method_params); 
+0

Причина, по которой вы должны позволить BaseClass иметь свойство экземпляра подкласса? – xdazz

+0

Какова возможная причина для подкласса, хранящегося в базовом классе? Это плохая практика и, похоже, не дает вам ничего, чего вы бы этого не сделали. – clexmond

+0

Это был один из способов, по которым я думал о создании REST API для моего сайта, но будет использоваться только мной. Первоначально у меня была настройка для создания нового экземпляра подкласса, тогда конструктор подкласса может вызвать конструктор базового класса. Затем для вызова метода подкласса я использовал call_user_func_array(). Я пытаюсь реализовать простую аутентификацию с помощью ключа API, который просто проверяет, существует ли он в базе данных. В основном подкласс содержит все отдельные методы, которые могут быть вызваны, и базовый класс содержит такие методы, как sendResponse(). – musubi

ответ

0

Я не вижу проблемы с эффективностью, предоставляя ваш текущий код. Это зависит от ПРАКТИЧЕСКИХ ситуаций. Если вы спрашиваете, разрешено ли его разрешение или нет, это также проблема дизайна. Возможности зависят от ДОМЕНА ПРОБЛЕМЫ. Поэтому вместо того, чтобы задавать такие вопросы, вы должны ознакомиться с design patterns.

Понимание шаблонов проектирования даст вам представление о том, как дизайн и архитектурные проблемы адресуются стандартным образом и как определенный язык программирования решает эти проблемы.

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