2013-08-03 134 views
4

我不得不一次又一次地寫相同的代碼,我想知道是否有更好的方法,或快捷如何減少PHP代碼?

我使用PHP,我有3類:

class A{ 
    private $data = array(....); 
    protected function get($index){ 
     return $data[$index]; 
    } 
} 

class B extends A{ 
} 

class C extends B{ 
    public function doSth(){ 
     echo A::get('index'); 
    } 
} 

我想要做的是從祖父母級獲取數據。

沒有問題,只是我需要得到的數據很多時候,那PHP代碼獲取的極端巨大的(真正的類名很長,而消氣Functionname很長)

這我正在寫:

databaseCore::getDataByIndex('name') 

在CI會使用預處理器,萬客隆像這樣:

#define DATA(x) databaseCore::getDataByIndex((x))

有沒有簡單的方法來減少我必須寫的代碼量?

+1

使用$此variqble在靜態方法中擴展類 – Orangepill

+0

你可以只使用數據,同時編寫調用,並在你走之前使用它,使用Find'n'Replace替換它與真實的東西。只是一個想法。 – MightyPork

+3

如果因爲太長而抽象掉函數名稱,爲什麼不縮短呢? –

回答

7

介紹

首先,你打破了Liskov Substitution PrincipleSingle-Responsibility Principle同時,

因此,你會一次又一次地面臨類似的問題。

的LSP:

A服務器容器的目的,是簡單的存儲數據。然後你擴展這一個,並最終打破is-a的關係。這是因爲一個容器不是一個容器。 has-a是要走的路。您可以inject a container$handler,通過constructor

的SRP:

由於您C服務3職責的同時,絕對打破了Single Responsibility Principle。第一個是data container,第二個是B,第三個是C

這也被稱爲deep inheritance,這顯然是一種不好的做法,直到它滿足SRPLSP

舉例說明如何減少代碼重複,同時堅持SRP,LSPDI

class Container 
{ 
    protected $container = array(); 

    public function setName($name) 
    { 
     $this->container['name'] = $name; 
    } 

    public function getName() 
    { 
     return $this->container['name']; 
    } 

    public function setAge($age) 
    { 
     $this->container['age'] = $age; 
    } 

    public function getAge() 
    { 
     return $this->container['age']; 
    } 
} 

class Handler 
{ 
    protected $pdo; 

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

    public function fetchSomething(Container $container) 
    { 
      $query = "SELECT * FROM `table` WHERE `name` =:name AND `age` =:age"; 
      $stmt = $this->pdo->prepare($query); 
      $stmt->execute(array(
       ':name' => $container->getName(), 
       ':age' => $container->getAge() 
     )); 

      return $stmt->fetch(); 
    } 
} 


$container = new Container(); 

$container->setName($_POST['name']); 
$container->setAge($_POST['age']); 

$handler = new Handler($pdo); 

$stuff = $handler->fetchSomething($container); 

print_r($stuff); 


所以,你將獲得在這裏?重用能力,從而減少代碼重複。


既然你也做DBcore::get('foo'),你可能想read this article

+1

+1爲DI模式 – DanFromGermany

+0

你怎麼能夠找到我的問題並提供一個解決方案,我給你的這些小信息讓我印象深刻。 – maja

0

你可以改變$dataprotected和使用它像,

$this->data['name'];