2010-09-10 32 views
0

我在/myDir/myClass.php中有一個名爲myClass的類。當用戶輸入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 2010-09-10 18:17:24

+2

@bob POST的內容將不會被改變。 – Artefacto 2010-09-10 18:25:14

+0

$ classname = str_replace(「。php」,「」,basename($ _ GET ['path'])); – bob 2010-09-10 18:50:45

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


} 

$x = new myClass(); 
+0

...但我不想添加instance_of_myClass = new myClass();因爲那樣我就無法延續上課 – bob 2010-09-10 17:52:05

0

如果你不與

$classINstance = new myClass(); 

創建一個實例然後,你沒有一個類的實例。這與擴展課程無關。

您擴展一個類(我假設你的意思是繼承?),然後創建一個擴展父類的新類。要使用這個類,您還需要使用new運算符創建一個新實例。

至少如果您沒有使用static關鍵字爲類創建靜態方法。

我有一個快速搜索,也許有看看這個問題接受的答案。 Lookd喜歡一個很好的總結,可以幫助你:

OOP

或者我只是不明白你的意思;)

+0

迷人的線程! http://stackoverflow.com/questions/2035449/why-is-oop-hard-for-me – bob 2010-09-10 18:59:19

0

我不明白你想要做什麼,但也許這個wi我將盡力幫助:

如果你想創建的myClass的實例,但不希望new myClass無處不硬編碼的,你可以使用某種形式的factory(維基百科)。

+0

這是我正在尋找 – bob 2010-09-10 18:19:25

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); 
    } 
} 

編輯:我看了一遍,我有一個問題: 你爲什麼要用戶輸入http://yourl/YourClass.php ???

應包括類;從來沒有用過直接加載到瀏覽器。

+0

我可以結合這個想法與工廠模式? – bob 2010-09-10 18:31:01

+0

「從來沒有用過直接加載」 - 你似乎知道你在說什麼,但我爲什麼?我試圖轉向純粹的OO範式,所以我說好,我將把所有頂級控制器作爲一個類的實例。 – bob 2010-09-10 18:55:54

+1

因爲你的班級是你的藍圖。如果你創建一個新的發明,你寧可銷售產品,而不是藍圖。所有的類都應該在一個文件中實例化:index.php。你引導一些預先工作,然後班級做這項工作,甚至輸出你的網頁。 – baklap 2010-09-10 19:08:29