2010-09-10 2 views
0

У меня есть класс myClass в /myDir/myClass.php. Когда пользователь вводит URL-адрес:php - автоматически создать экземпляр myClass

http://mysite.com/myDir/myClass.php, 

Я хочу автоматически создать экземпляр myClass. Какую технику я могу использовать для этого? идея заключается в том, чтобы использовать каталог myDir как верхний уровень программ, которые пользователь может вызывать напрямую, но я не хочу добавлять instance_of_myClass = new myClass();, потому что тогда я не смогу расширить класс. Имеет ли это смысл?

class myClass 
{  
    __construct() 
    { 
    echo "hello World"; 
    $this->myClass_report(); 
    } 
    myClass_report() 
    { 
     // some code here 
    } 


} 

ответ

3

.htaccess:

#if You have access, omit RewriteBase and put the rule in http.conf, 
#with a/in the beginning of the pattern. 
RewriteBase/
RewriteCond $0 !=index.php 
RewriteRule .* index.php?path=$0 [QSA,B] 

index.php

//check if the file exists and it's allowed 
if (!check_if_allowed_path(realpath($_GET['path']))) { 
    //access denied; check e.g. against the document root or 
    //something more complex 
} 
//or use autoload instead 
include $_GET['path']; 
$classname = basename($_GET['path'], '.php'); 
$instance = new $classname(); 
+0

это звучит так, как я то, что я ищу, но будут ли мои столбчатые переменные падать? – bob

+2

@bob Содержимое POST не затронуто этим. – Artefacto

+0

$ classname = str_replace (". Php", "", basename ($ _ GET ['path'])); – bob

0
class myClass 
{  
    __construct() 
    { 
    echo "hello World"; 
    myClass_report(); 
    } 
    myClass_report() 
    { 
     // some code here 
    } 


} 

$x = new myClass(); 
+0

... но я не хочу добавлять instance_of_myClass = new myClass(); потому что тогда я не смогу расширить класс – bob

0

Если вы не создаете экземпляр с

$classINstance = new myClass(); 

Тогда у вас нет экземпляра класса. Это не имеет никакого отношения к расширению класса.

Вы расширяете класс (предположим, вы имеете в виду наследование?), То вы создаете новый класс, который расширяет родительский класс. Чтобы использовать этот класс, вы также создаете новый экземпляр с новым оператором.

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

У меня был быстрый поиск, возможно, взгляните на этот принятый вопрос. Lookd нравится хорошее резюме, которые могли бы помочь вам:

OOP

Или я просто не понял, что ты имел в виду;)

+0

увлекательная тема! http://stackoverflow.com/questions/2035449/why-is-oop-hard-for-me – bob

0

Я не понимаю, что вы пытаетесь сделать, но, возможно, это wi помогу:

Если вы хотите создать экземпляр myClass, но не хотите new myClass быть жестко закодированы везде, вы могли бы использовать factory (википедии) некоторого вида.

+0

это то, что я ищу – bob

0

Используйте фабричную модель:

<?php 
//Factory.php 
include_once('Box.php'); 

class My_Factory 
{ 
    private $this->outcome; 

    public function __construct() 
    { 
    this->outcome = $this->doSomeWeirdShitToSetupTheFactoryAndBlueprintSomething(); 
    } 

    private function doSomeWeirdShitToSetupTheFactoryAndBlueprintSomething() 
    { 
    //1+1 
    } 

    public function giveMeAnInstanceOfOutcome() 
    { 
    return new My_Box($this->outcome); 
    } 
} 

Edit: Я прочитал ее еще раз и у меня есть один вопрос: Почему вы хотите, чтобы пользователь типа http://yourl/YourClass.php ???

Должны быть включены классы; никогда не использовались для загрузки непосредственно в браузер.

+0

Могу ли я объединить эту идею с заводским рисунком? – bob

+0

«никогда не использовалось для загрузки напрямую» - вы, кажется, знаете, о чем говорите, но я уверен, почему? Я пытаюсь перейти к чистой парадигме ОО, поэтому я сказал «ОК», я сделаю все контроллеры верхнего уровня в качестве экземпляров класса. – bob

+1

Потому что ваш класс - ваш план. Если вы создадите новое изобретение, вы скорее продадите продукт, чем план. Все ваши классы должны быть созданы в одном файле: index.php. Вы загружаете некоторые предварительные инструкции, а затем классы выполняете работу и даже выводите свою страницу. – baklap

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