簡體   English   中英

PHP-類之外的類調用函數

[英]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);
}

如果您有一個調用不同文件(通過includerequire )的主文件,那么您可以使用將在全局命名空間中存在的任何函數,只要在該類中就可以,只要您調用的函數始終存在於全局命名空間中即可。

例如,在類文件的頂部,您可以使用require_once調用另一個文件。 (只是確保您不會兩次包含同一文件,使用include_oncerequire_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。

也許您需要包含我認為的文件。

我認為這是一種解決方案:

使您的文件('database_functions.php')成為包含所有函數的類。 喜歡..

class mydbcls{
  public function function_1(){}
  public function function_2(){}
  public function function_3(){}
  //......  
  public function function_n(){}
}

現在,當您編寫名為“成員”的類時,以擴展mydbcls的方式編寫它。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM