我想知道如果我可以在父函数中调用子对象。像这样:
class Parent {
public function A() {
<< I want to call the object here >>
// Some code
}
}
Class Child extends Parent {
public function B() {
// Some code
}
}
$Child = new Child();
$Child -> B();
这两个类在不同的文件中。 My Child类正在使用函数B()与我的数据库建立连接。在我的Parent的类A()中,我试图插入从填写表单中收到的数据,但我需要连接到数据库,我不知道如何调用该对象。注意:当我将两个函数放在同一个类中时,我的代码正常工作。
我没有找到解决方案,所以我会尝试发布我的真实代码:
class db_connect extends Model
{
private $dbname = "...";
private $dbuser = "...";
private $dbpass = "...";
private $dbhost = "...";
public $dbc;
public function Connect()
{
$this->dbc = mysqli_connect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
if($this->dbc === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}}
}
所以这是来自Above的Class Child,而Connect()是B()。
现在是父母
class Model
{
public $query;
public $result;
public function proccess_data($marca,$model,$pret,$descriere){
<< I am trying to make a connection here from config.php using the function Connect() >>
$this->query = "INSERT INTO autoturisme (autoturism_id, marca, model, pret, descriere) " .
"VALUES (NULL, '$marca', '$model', '$pret', '$descriere')";
$this->result = mysqli_query(<<Also here I would need the connection>>, $this->query)
or die(mysqli_error(<<And here>>));
if($this->result == 1){
echo "<br/>Your data were processed";
} else {
echo "<br/>We are sorry but an error occurred";
}
$this->close_db();
}
在 mysqli_query 中,我需要一个参数作为mysqli,这是与我的数据库的连接。该参数位于Child的类 $ dbc 中,并在函数Connect()中调用: $ this-&gt; dbc 。 mysqli_error 也是如此。希望这会让事情更加清晰:)。
答案 0 :(得分:3)
考虑到你已经标记了这个oop我会咬人。
db_connect
没有理由延伸称为Model
的东西。更不用说没有理由打电话给Model
并没有告诉任何人任何东西的东西,因此对于任何东西都是一个非常糟糕的名字。
其次,据我所知,没有理由将mysqli
包裹起来。你可以通过包裹这样的物体获得什么。 mysqli
带有一个开箱即用的面向对象的接口。
最后,当你摆脱那个奇怪的继承树时,你应该将数据库连接注入到需要它的类中。类似的东西:
class Car
{
// why do you need a `$query` member when you are not going to use it?
// same for `$result`
private $dbConnection;
public function __construct(mysqli $dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function add($marca, $model, $pret, $descriere)
{
$query = 'INSERT INTO autoturisme';
$query.= ' (marca, model, pret, descriere)';
$query.= ' VALUES';
$query.= ' (?, ?, ?, ?)';
$stmt = $this->dbConnection->prepare($query);
$stmt->bind_param('ssss', $marca, $model, $pret, $descriere);
if (!$stmt->execute()) {
throw new \Exception('We are sorry but an error occurred');
}
}
}
$mysqli = new mysqli('localhost', 'user', 'pass', 'dbname');
$car = new Car($mysqli);
try {
$car->add('BMW', '325', 'dunnowhatthismeans', 'description?');
} catch(\Exception $e) {
echo $e->getMessage();
}
另请注意,您的代码很可能容易受到SQL注入攻击。
答案 1 :(得分:2)
理想情况下,您不应该从父类的实例调用子函数。这是不应该做的事情。
相反,您可以覆盖子类中的函数,然后从子类的实例中调用该方法。
答案 2 :(得分:2)
您可以尝试切换它,因此父类建立与数据库的连接,并为子类提供访问该连接的方法。这是伪代码,粗略地显示了它将如何工作。
class Parent {
// method to run SQL statement
runSQL(SQL) {
// connect to database (or do it in constructor) and run the SQL
}
}
class Child extend Parent {
public function B() {
...
parent::runSQL("SELECT...")
}
}