![](/img/trans.png)
[英]PHP - Calling class functions from outside the class returns undefined function error
[英]PHP - Class calling functions outside the class
我正在開發俱樂部會員注冊Web應用程序,當涉及到時,我還是一個新手。 我遇到的問題是,我需要在類外調用函數,但是我知道您無法在PHP中做到這一點,我需要以某種方式解決它。
此代碼將演示我的問題是:
members.php
class member {
private $id;
private $member_num;
private $name;
...
...
public function __construct() {
$a = func_get_args();
$i = func_num_args();
if (method_exists($this,$f='__construct'.$i)) {
call_user_func_array(array($this,$f),$a);
}
}
private function __construct1($f_id) { // Construct object by id-number
// Code to retrieve the data from database
}
我已經在名為database_functions.php的單獨文件中編寫了數據庫操作的代碼,但是我無法將該文件包含在類中。 我需要知道的是如何訪問這些函數而不必在類中再次編寫它們? (我之前使用VB.Net編寫過應用程序,並且可以在其中使用類中當前項目的功能。)
您可以將require_once()
與該類的確切路徑一起使用,然后再使用包含的類的對象和函數名稱來調用外部類的函數。
if(file_exists($class_path))
{
require_once($class_path);
$cl_obj = new name_of_class();
$outer_class_result = call_user_func_array(array($cl_obj,$function_name),$parametrs);
}
如果您有一個調用不同文件(通過include
或require
)的主文件,那么您可以使用將在全局命名空間中存在的任何函數,只要在該類中就可以,只要您調用的函數始終存在於全局命名空間中即可。
例如,在類文件的頂部,您可以使用require_once
調用另一個文件。 (只是確保您不會兩次包含同一文件,使用include_once
和require_once
總是很好的。)
其他選擇是將您擁有的其他函數包裝在另一個類中,只要它有意義。 然后,類A可以保存帶有類B對象的字段,並根據需要調用B
的函數。
class classA {
private $BInstance;
function __construct($b) {
$this->BInstance = $b;
}
function some_call($input) {
if($this->valid_input($input)) {
$this->BInstance->transform($input);
}
}
}
這樣做的好處是,所有內容都抽象在類中。 一旦離開了類,您只需要知道可以使用類的哪些方法(函數),就不必擔心實現細節。 這樣做的直接好處是,您不必一直將相同的參數傳遞給相同的函數,例如,如果您需要數據庫處理程序來執行函數中的SQL代碼。 一個類可以只保存一個這樣的實例,而您不必一直重復相同的參數。
另一個優點是您的全局名稱空間不會受到特定功能的污染。
您可以將一個類擴展到另一個類,以訪問子類中的父類函數和屬性。 聲明為私有的函數不能那樣訪問。 您還可以將另一類的對象作為構造函數的參數傳遞給一個類。
如果您的班級名稱為parent:
class parent{
// properties and methods
}
然后,如果將其擴展到您的類,則可以訪問其功能:
class child extends parent{
// code
}
要么
$parent = new parent();
$child = new child($parent);
然后在子類中可以使用:
function __construct($parent) {
$this->connection = $parent;
}
然后,在子類中的其他函數中,您可以使用以下方法訪問父類方法
$parent->connection->function_name()
我不確定您是否包含定義所需功能的文件。 我用我的symfony投影儀嘗試過,效果很好。
test.php包含一個函數。
<?php
function double_number($value)
{
return $value*2;
}
?>
我將其包括在模型中:
include(__DIR__.'/test.php');
class HomeModel
{
...
public function __construct()
{
$this->preExecute();
echo double_number(5);
exit;
}
...
}
並輸出10。
也許您需要包含我認為的文件。
class mydbcls{
public function function_1(){}
public function function_2(){}
public function function_3(){}
//......
public function function_n(){}
}
class member extends mydbcls{
private $id;
private $member_num;
private $name;
...
...
public function __construct() {
$a = func_get_args();
$i = func_num_args();
if (method_exists($this,$f='__construct'.$i)) {
call_user_func_array(array($this,$f),$a);
}
}
private function __construct1($f_id) { // Construct object by id-number
// Code to retrieve the data from database
// Now you can access your database functions in this way
// $this->function_1();
}
現在您可以通過這種方式訪問數據庫功能
$this->function_1();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.