php - 如何减少 PHP 代码?

标签 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');
    }
}

我想做的是从祖 parent 类中获取数据。

没问题,除了我需要经常获取数据,而且 php 代码变得非常庞大(真正的类名很长,getter 函数名很长)

这就是我正在写的内容:

databaseCore::getDataByIndex('name')

在 C 中,我会像这样使用预处理器宏:

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

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

最佳答案

简介

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

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

语言服务提供商:

您的A 服务器是容器的用途,即简单地存储数据。然后你扩展这个,并最终打破 is-a 关系。这是因为容器不是处理程序。 has-a 是要走的路。你可以inject a container通过 constructor

到那个 $handler

建议零售价:

因为你的C同时服务于3个职责,它肯定打破了单一职责原则。第一个是数据容器,第二个是执行B的东西,第三个是执行C的东西。

这也称为深度继承,这显然是一种不好的做法,直到它满足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'),因此您可能需要 read this article

关于php - 如何减少 PHP 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034703/

相关文章:

php - 如何将包含列表和插入值的下拉框作为 PHP 中 UPDATE 的默认值?

php - 如何从mysql表中选择所有数据,其中列是数组或单个,并且我的值与该数组的一项匹配?

php - 如果数据表类和记录是对象,那么连接呢?

java - 限制可以在 Java 中实现接口(interface)的类

java - 如何将其变为 OOP

java - 我是否应该将返回类型重命名为更通用的名称以便重用它?

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

PHP for 循环在 2 次循环后停止获取 MYSQL 表行

MATLAB 不显示用户创建的类私有(private)方法和属性的帮助

javascript - 如何在嵌套 PHP->JS->HTML 中使用引号