PHP5面向对象编程

时间:2011-05-28 23:19:43

标签: php oop

我已经开始在PHP中使用OO编程构建一些应用程序,但是我不确定我是否采用标准方式。

下面是一个例子,如果我有一个书类

    class book{

            private $name;
            private $id;
            private $isbn;
    }

有两种情况,一种,我想在我的数据库中添加一本全新的图书......

我应该a)在我的新课程中使用一个函数来创建新书...即

    $book = new book;

    $book->addAsNew($name, $isbn);

或者我应该B)完全独立于添加新书的类的功能吗?

其次..打开我的书类时,我应该有A)构造函数

    function __construct( $bookId ){

            //Call mysql DB and set $name and $isbn var based on $bookId

    }

    ...

    $book = new book( $bookId );
我应该b)有一个单独的功能..

    class book{

            private $name;
            private $id;
            private $isbn;

            public initiated = 0;

            function initiate( $bookId ){

                    //Load $name and $isbn from DB based on $bookId

                    $initiated = 1;
            }
    }

    ...

    $book = new book;

    $book = initiate( $bookId );

大多数程序员都会采用标准方式吗?还是主要由程序员自行决定?

3 个答案:

答案 0 :(得分:6)

您也可以向构造函数添加参数,因此您可以编写

book = new Book($name, $isbn). 

但是在这种情况下,我会选择像你一样拥有一个具有单独属性的类,并创建一个单独的工厂类或函数来实例化图书对象。

B也是如此。不要将DB查询放在这个类中。创建一个可以充当工厂的单独BookData对象。它可以查询数据库并返回书籍对象。当然,如果你觉得工厂类太复杂了,你也可以创建一个函数,但是嘿,想要去OO。 ; - )

答案 1 :(得分:1)

您正在做的是创建模型和数据映射器,请参阅:

  1. http://www.devshed.com/c/a/PHP/Implementing-the-Data-Mapper-Design-Pattern-in-PHP-5/
  2. http://www.doctrine-project.org/ - http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/getting-started-xml-edition.html
  3. 因此,您的图书类是一个模型,该模型需要存储在某个地方。伪代码将是:

    $book = new Book();
    $book
        ->setName($name)
        ->setId($id)
        ->setISBN($isbn);
    
    $bookDataMapper = new BookDataMapper();
    $bookDataMapper->save($book);
    

答案 2 :(得分:1)

你可以做到这两点!

从构造函数调用

function __construct( $bookId = null) {
   if ($bookId) {
      $this->initiate($bookId);
   }
}

从OOP的角度来看,这很好,因为它可以防止空对象。

empty object:一个对象,它不是真正的实时对象,但只存在于代码中。

但是因为$ bookId参数是可选的,所以仍然可以使用空对象,允许您使用书类创建新书(记录)。