PHP - 类外的类调用函数

时间:2014-07-07 07:11:30

标签: php mysql oop

我正在开发一个俱乐部会员注册网络应用程序,当涉及到oop时,我是一个相当新手。我遇到的问题是我需要在类之外调用一个函数,但我知道你不能在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编写了应用程序,在其中我可以使用当前项目的函数内部课程。)

5 个答案:

答案 0 :(得分:0)

您可以使用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);
}

答案 1 :(得分:0)

如果你有一个调用不同文件的主文件(通过includerequire),那么你可以使用全局命名空间中存在的任何函数,只要该函数你可以使用call将始终存在于全局命名空间中。

例如,在您的类文件的顶部,您可以使用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代码。一个类可以只保存这样一个实例,你不必一直重复相同的参数。

另一个优点是您的全局命名空间不会受到特定功能的污染。

答案 2 :(得分:0)

您可以将类扩展到另一个类以访问子类中的父类函数和属性。声明为private的函数不能像这样访问。您还可以将另一个类的对象传递给一个类作为构造函数的参数。

如果你有一个类名父母:

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()

答案 3 :(得分:0)

我不确定您是否包含定义所需功能的文件。 我用我的symfony preject尝试了这个,效果很好。

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。

也许您需要包含我认为的文件。

答案 4 :(得分:0)

在我看来,这是一个解决方案: -

使您的文件(&#39; database_functions.php&#39;)成为包含所有功能的类。像..

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

现在,当您编写名为&#34; member&#34;的类时,请以扩展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();