正如标题所说,我开始学习PHP的面向对象方面。在这方面,我做了一些小的“练习”,将我的一个php函数“翻译”成了oo模式的php。我问你的善良的人有没有关于我的困境可以给我的建议。
非oo PHP示例:
<?php
function pristup($servername, $username, $password, $dbname, $sql){
$conn=new mysqli($servername, $username, $password, $dbname);
if($conn->connect_error){
die("Neuspela konekcija: ".$conn->connect_error);
}
$result = $conn->query($sql);
if ($result == TRUE) {
//echo "Uspela konekcija";
} else {
echo "Neuspešno izvršavanje upita: " . $conn->error;
}
return $result;
$conn->close();
}
?>
以面向对象的方式完成的示例:
<?php
class konekcija{
private $servername;
private $username;
private $password;
private $dbname;
private $sql;
//Setter functions
public function setServername($par){
$this->servername = $par;
}
public function setUsername($par){
$this->username = $par;
}
public function setPassword($par){
$this->password = $par;
}
public function setDBname($par){
$this->dbname = $par;
}
public function setSQL($par){
$this->sql = $par;
}
//Getter functions
public function getServername() {
return $this->servername;
}
public function getUsername() {
return $this->username;
}
public function getPassword() {
return $this->password;
}
public function getDBname() {
return $this->dbname;
}
public function getSQL() {
return $this->sql;
}
//Function that executes query.
public function pristup($server_name, $user_name, $pass_word, $db_name, $sql_query){
$conn=new mysqli($server_name, $user_name, $pass_word, $db_name);
if($conn->connect_error){
die("Neuspela konekcija: ".$conn->connect_error);
}
$result = $conn->query($sql_query);
if ($result == TRUE){
echo "Uspela konekcija";
}
else{
echo "Neuspešno izvršavanje upita: " . $conn->error;
}
return $this->$result;
$conn->close();
}
}
$kon = new konekcija(); //Creation of an object.
//Setting values.
$kon -> setServername("localhost");
$kon -> setUsername("root");
$kon -> setPassword("");
$kon -> setDBname("test");
$kon -> setSQL("CREATE TABLE example(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)"
);
//Getting values and inserting them into class method.
$kon -> pristup($kon->getServername(), $kon->getUsername(), $kon->getPassword(), $kon->getDBname(), $kon->getSQL());
?>
这有效。我问的是代码有什么好处?有没有更好/更成熟的方式这样做?任何建议将被认真考虑。 PS:我得到了“注意:未定义的属性:konekcija ::第1行的C:\ xampp \ htdocs \ www \ klase \ tab_klass.php”为什么会发生这种情况?
答案 0 :(得分:2)
只是简单的例子:
<?php
// class konekcija{ - ONLY ENGLISH!
class SimpleDB{
private $conn;
//Setter functions - NOOO!
//Getter functions - NOOO!
// hide all data inside class instance
public function __construct($server_name, $user_name, $password, $db_name){
$this->conn=new mysqli($server_name, $user_name, $password, $db_name);
if($this->conn->connect_error){
die("ERROR: " . $this->conn->connect_error);
}
}
function __destruct() {
$this->conn->close();
}
//Function that executes query.
// public function pristup( - ONLY ENGLISH!
public function execute($sql_query){
$result = $this->conn->query($sql_query);
if ($result == TRUE){
echo "Uspela konekcija";
} else {
echo "Neuspešno izvršavanje upita: " . $conn->error;
}
return $result;
}
}
$kon = new SimpleDB("localhost", "root", "", "test");
$SQL = "CREATE TABLE example(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
$kon->execute($SQL);
?>
- 为什么只有英文?
首先,因为99%的 好 开发人员知道/使用英语,尽管它们并不是母语。如果在代码中仅使用英语单词,那么理解代码会更容易,因此99%的 优秀的 开发人员将帮助您完成代码。中学,它是关于一致性的:while($running) doJob();
比while($zapushen) rabotat()
(俄语学生风格,是的)更容易阅读。
- 为什么要删除getter / setter?
使用getter / setter是一种非常常见的做法,但它会破坏OOP的全部含义。使用它们,我们就像把它们翻出来一样。该对象本身必须能够执行必要的操作,但我们好像说&#34;不!向我们提供数据,我们更了解如何与他们合作!&#34;。
有时候getter / setter是一个必要的邪恶,所以不要过度编码,但从长远来看,它们只会造成伤害。我不会强烈要求你完全放弃getter / setter,但最好再考虑一下你可以替换它们的行为。
此外,我将帖子移至codereview.stackexchange.com/questions/183916 / ...一位用户建议在codereview上使用范例MVC。经过简短的阅读后,与这个例子相比,这个特定的例子有什么好处,你会怎么做&#34;翻译&#34;你的MVC范例的例子?
首先,MVC不是范例,它是一种模式。而这种模式主要是针对用户界面的某种形式。至少,尝试将其用于数据库并不是一个很好的解决方案。在我看来,这个人对MVC感到兴奋并将其用于其他目的。
我个人不喜欢在这里尝试应用MVC。而且,我根本不喜欢这种模式。也许我和他一起工作了一点,也许我没有看到任何好的例子,但我不喜欢它。我特别喜欢像use \ MyApp \ Database \ Model as Connection;
这样的代码。如果它是连接,那么为什么称它为模型?只是为了命名这个MVC?在这个例子中,对我来说存在许多有争议的问题。
总的来说,我会说从长远来看,任何范式,模式等的正确应用都会带来好处。我们应用它们越复杂,项目应该越大,所以它们的所有好处都将被揭示出来。对数据库的一个查询不是一个好项目,即使对于OOP,更不用说不同的模式了。
是否有申请/学习MVC的愿望? - 做更复杂的项目,例如,某种组织者。
关于日志记录和错误的一小部分补充。
我会抛出异常。但是伐木怎么样?好吧,我会做这样的事情:
interface IQuery{
public function execute($sql);
}
class SimpleDB implements IQuery{
......
public function execute($sql_query){
$result = $this->conn->query($sql_query);
if($result === FALSE){
throw new EMyCustomException($conn->error);
}
return $result;
}
}
class LoggedDB implements IQuery{
private $db;
public function __construct($DB){
$this->db = $db;
}
public function execute($sql_query){
try{
return $this->db->execute($sql_query);
} catch (EMyCustomException $e) {
// perform logging
throw $e; // rethrow
}
}
}
$db = new LoggedDB(new SimpleDB(......));
$db->execute("not a valid sql here");
至于我,这是一个更好的方法,特别是对于初学者。