如何减少PHP代码?

时间:2013-08-03 16:05:05

标签: php oop

我必须一次又一次地编写相同的代码,我想知道是否有更好的方法或快捷方式

我使用的是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代码变得非常庞大(真正的类名很长,并且getter-Functionname非常长)

这就是我写的:

databaseCore::getDataByIndex('name')

在C中,我会使用这样的预处理器 -

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

是否有一种简单的方法可以减少我必须编写的代码量?

2 个答案:

答案 0 :(得分:7)

介绍

首先,您同时打破了Liskov Substitution PrincipleSingle-Responsibility Principle

因此,你将一遍又一遍地面对类似的问题。

LSP:

您的A服务器是容器的用途,它可以简单地存储数据。然后你扩展这个,最终打破is-a关系。这是因为容器不是hanlder。 has-a是要走的路。您可以$handler通过constructor

inject a container read this article

SRP:

由于您C同时担任3项职责,因此肯定会打破Single Responsibility Principle。第一个是data container,第二个是B,第三个是C

这也称为deep inheritance,这显然是一种不好的做法,直到它满足SRPLSP

一个示例,说明如何在粘贴SRPLSPDI的同时减少代码重复。

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'),您可能需要{{3}}

答案 1 :(得分:0)

您可以将$data更改为protected并将其用作

$this->data['name'];