PHP Усталёўка класа аб'ектаў у базе дадзеных

Маё пытанне заключаецца ў тым, як я павінен ўставіць аб'екты класа PHP ў базу дадзеных? Калі ў мяне ёсць

Cat.php

class Cat{
private $name;

public function setName($name){
 $this->name = $name
}

public function database(){
....$this->name;
 //Insert stuff into db 
}

}

somefile.php

if($_POST['catname']){
  //This way?
  $obj1 = new Cat();
  $obj1->setName($_POST['catname']);
  $obj1->database();

  //Or this way
  //Insert Cat directly into the db without creating an object of Cat


}

And i want to insert this cat into the database. Would it be best to create a function within cat that gets $this->name or before i create the object should i just insert it into the database?

1
Які тып базы дадзеных? Я б сказаў, што стварыць Сериализуемый інтэрфейс, а затым рэалізаваць writeObject і readObject метады на любы клас, які серыялізацыі.
дададзена аўтар crush, крыніца
Я выкарыстоўваю MySQL ў цяперашні час
дададзена аўтар tiggles, крыніца

6 адказы

Самы просты спосаб зрабіць гэта было б сериализовать клас у радок.

$string = serialize($cat);

http://php.net/manual/en/language.oop5.serialization.php

Але такім чынам вы будзеце ствараць шмат накладных выдаткаў у вашай базе дадзеных.

Лепшы спосаб зрабіць гэта будзе мець адпаведныя палі ў табліцы і проста захаваць адпаведныя значэння. Вы можаце лёгка стварыць функцыю, якая чытае/захоўвае свой клас у табліцу. Гэта зробіць вашы дадзеныя значна больш партатыўнымі і зменным.

3
дададзена
Гэта будзе «просты» падыход, я думаю.
дададзена аўтар crush, крыніца
Не вельмі дарэчы, але, безумоўна, самы просты: P
дададзена аўтар ZorleQ, крыніца

Вы можаце выкарыстоўваць Серыялізацыя , і калі ў вас ёсць добры автозагрузчик, вам не прыйдзецца турбавацца аб класе не існых, калі вы десериализируетесь.

Таксама зьвярніце ўвагу на 2 магічныя функцыі, якія вы можаце выкарыстоўваць:

__sleep() - custom code to use when serializing an object

__wakeup() - custom code when unserializing an object

<�Моцны> PS:

замяніць:

$obj1->setName = $_POST['catname'];

з

$obj1->setName($_POST['catname']);

Літаратура:

2
дададзена
+1 Для автозагрузчика.
дададзена аўтар crush, крыніца
Добра, я буду глядзець у серыялізацыі больш. Добры ўлоў. я ўнёс змены
дададзена аўтар tiggles, крыніца

Звычайна існуе некалькі слаёў у праекце і адзін з гэтага пласта з'яўляецца DAO (Data Access Object). У гэтым класе вы звязаць дадатак з базай дадзеных. гэты пласт павінен захаваць аб'ект у базу дадзеных з дапамогай метаду эканоміі, напрыклад, ...

На наступны дзень вы хочаце змяніць базу дадзеных вы проста перапісаць гэты пласт

Каб быць сапраўды ідэальным, аб'ект, які прысутнічае ў DAO пласце адрозніваецца ад мадэлі аб'екта (CAT): гэта пастаянны аб'ект, які выглядае як табліцы ў базе дадзеных

0
дададзена

У ідэале, сам аб'ект павінен мець справу з захаваннем сябе ў базу дадзеных. Такім чынам, ваша логіка не трэба ведаць, што кошка ёсць, ці там, дзе яна ратуе сябе. <�Код> кошка клас павінен быць самадастатковым, і гэта азначае, што калі вы хочаце змяніць тыпы БД або што-небудзь яшчэ ў будучыні, вы можаце зрабіць гэта ў класе, не закранаючы вашу логіку.

0
дададзена
Я не ўпэўнены, што гэта добры спосаб ... і па двух прычынах: 1. На наступны дзень вы змяніць базу дадзеных, вы павінны дакранацца аб'ектаў мадэлі, якія не вельмі добра. 2. ён ідзе супраць аднаго прынцыпу ААП: Адзіная Адказнасць Прынцыпу ... Што вы думаеце?
дададзена аўтар mlwacosmos, крыніца
@mlwacosmos Ваша прапанова з некалькіх слаёў, безумоўна, сапраўдны падыход, але я сапраўды спрабаваў атрымаць ОП, каб акуратна аддзяліць іх логіку ад іх ўзроўню дадзеных без ўскладняць шляхам дадання дадатковых слаёў або шаблонаў праектавання. Калі ОП была толькі невялікая жменька класаў на маленькі праект, я думаю, што мой падыход справядлівы
дададзена аўтар dKen, крыніца
Адзін са спосабаў я ведаю, каб выкарыстоўваць функцыі ўнутры класа без стварэння асобніка гэтага аб'екта з'яўляецца выкарыстанне бацькоўскага аператара. Нешта накшталт Cat :: баз дадзеных (); Не ўпэўнены, калі гэта тое, што ваш запытаная хоць
дададзена аўтар TheSnooker, крыніца

Вы павінны мець асобны аб'ект, які прымае асобнік ката і змяшчае дадзеныя ў базу дадзеных. Вы можаце мець метад getVitalData </​​код>, які прадастаўляе ўсе дадзеныя, якія павінны ўвайсці ў базу дадзеных (магчыма, у канчатковым рахунку, больш, чым проста імя).

Кожны клас павінен мець адзін адказнасці

0
дададзена

Паглядзіце на серыялізацыі і десериализируется, вы можаце захоўваць сериализованную радок у базе дадзеных, калі гэта неабходна - вось кароткі прыклад.

<?php
class Cat {
    protected
        $name;
    public function getName() {
        return $this->name;
    }
    public function setName($name) {
        $this->name = $name;
        return $this;
    }
}

$cat = new Cat;
$cat->setName('Tiddles');

$string = serialize($cat);
$cat    = unserialize($string);

var_dump($cat);

/*
    object(Cat)#2 (1) {
      ["name":protected]=>
      string(7) "Tiddles"
    }
*/

Энтані.

0
дададзена