php中根据类名怎么动态获取已定义的类对象并动态调用某个方法?

图中是类的定义,以及实例化对象,这个对象不定有多少个这里只举例写了两个$a $b,这些对象已经拥有了自己的数据。现在想要通过一个方法获取User类实例化了哪几个对象,获取多想列表,也就是获取$a 和 $b实例,然后动态去调用他们的Say()方法,让他们能输出自己的Age.

在 PHP 中,可以通过类名来动态获取已定义的类对象,然后再调用类的方法。可以使用以下两个函数来实现:
1. `class_exists()` 函数可以判断一个类是否已经定义。
2. `call_user_func()` 函数可以动态调用一个方法。
下面是示例代码:
```
// 判断类是否已定义
if (class_exists('ClassName')) {
// 实例化类对象
$obj = new ClassName();
// 动态调用方法
call_user_func(array($obj, 'methodName'));
}
```
在这个示例中,`ClassName` 是要动态获取的类名,`methodName` 是要调用的方法名。首先,使用 `class_exists()` 函数判断类是否已经定义,如果已经定义,则使用 `new` 关键字实例化类对象,并将其赋值给 `$obj` 变量。然后,使用 `call_user_func()` 函数动态调用方法。`array($obj, 'methodName')` 表示要调用 `$obj` 对象的 `methodName()` 方法。
需要注意的是,如果要调用的方法需要传递参数,可以在 `call_user_func()` 函数的第二个参数之后依次添加参数值。例如,如果要传递一个参数,可以这样调用:
```
call_user_func(array($obj, 'methodName'), $param1);
```
其中,`$param1` 是要传递的参数值。
温馨提示:内容为网友见解,仅供参考
第1个回答  2023-05-03

在 PHP 中,可以使用类似以下代码来动态获取已定义的类对象并动态调用某个方法:


/ 根据类名获取类对象

$className = 'MyClass'; // 假设要获取的类名为 MyClass

$obj = new $className(); // 利用变量动态实例化类

// 动态调用类方法

$methodName = 'myMethod'; // 假设要调用的方法名为 myMethod

$obj->$methodName(); // 利用变量动态调用类方法

其中,$className 是一个字符串变量,存储目标类的类名;$obj 是类对象,可以调用类中定义的各种方法;$methodName 同样是一个字符串变量,存储需要调用的方法名。需要注意的是,在动态调用类方法时,需要使用 $obj->$methodName() 这种格式,将方法名放在一个字符串变量中,并使用可变变量(Variable variables)的方式来调用方法。

第2个回答  2023-04-30
要实现这个功能,您可以使用SplObjectStorage容器来存储所有User类的实例。当创建一个新的User实例时,将其添加到容器中。然后可以遍历容器并调用每个对象的Say()方法。以下是代码示例:
<?php
interface Person {
public function Say();
}

class User implements Person {
public $Age = 18;

public function Say() {
echo 'age is '. $this->Age . PHP_EOL;
}
}

class UserManager {
private $users;

public function __construct() {
$this->users = new SplObjectStorage();
}

public function addUser(User $user) {
$this->users->attach($user);
}

public function sayAll() {
foreach($this->users as $user) {
$user->Say();
}
}
}

$userManager = new UserManager();

$a = new User();
$a->Age = 16;
$userManager->addUser($a);

$b = new User();
$b->Age = 19;
$userManager->addUser($b);

$userManager->sayAll();

此代码中,创建了一个UserManager类,用于管理所有User类的实例。通过addUser()方法将User实例添加到SplObjectStorage容器中。sayAll()方法遍历容器中的所有User对象并调用它们的Say()方法。当运行此代码时,将输出:
age is 16
age is 19

php中根据类名怎么动态获取已定义的类对象并动态调用某个方法?
在这个示例中,`ClassName` 是要动态获取的类名,`methodName` 是要调用的方法名。首先,使用 `class_exists()` 函数判断类是否已经定义,如果已经定义,则使用 `new` 关键字实例化类对象,并将其赋值给 `$obj` 变量。然后,使用 `call_user_func()` 函数动态调用方法。`array($obj, 'methodNam...

php在类方法里调用了一个未定义的属性,系统为什么会自动生成这个属性...
我看你的代码里面$name和$this->aaa都是定义了的,怎么会没有定义呢。你在实例化A类的时候带了参数进去,那么类里面的name变量就有了值。

php引用其他文件内的函数(php如何引用外部文件)
在调用Test类实例的doExternalFunction()方法时,外部的func()方法是可以运行的,因为它是全局的。但是建议不要这样使用, 因为Test::doExternalFunction()对func()函数有依赖,当项目比较大时,而func()和Test类没有同时引入到一个文件中来,会引 起错误。比较理想的情况是,使用回调函数的形式来调用外部函数,就像执行...

Ucenter源码解析之--index.php
加载对应的control文件,获取类名并实例化,调用方法前,判断类是否存在该方法,优先尝试'on.$a'方法,若不存在,则使用_call($method)调用。m实例化成相应对象,$a决定对应类的方法实现。测试$m=app, $a=add时,结果如右侧图。查阅\/control\/app.php下的'onadd()'方法,了解返回-1的原因。index...

phpstorm 有哪些奇技淫巧
Ctrl + N 根据输入的 类名 查找类文件Ctrl + G 在当前文件跳转到指定行处Ctrl + J 插入自定义动态代码模板Ctrl + P 方法参数提示显示Ctrl + Q 光标所在的变量 \/ 类名 \/ 方法名等上面(也可以在提示补充的时候按),显示文档内容Ctrl + U 前往当前光标所在的方法的父类的方法 \/ 接口定义Ctrl + B 进入...

call_user_func函数定义
在PHP中,call_user_func是一个强大的函数,它的作用是执行用户自定义的函数,动态传递参数。这个函数接受一个回调函数名作为其核心参数,可以是普通函数或者类的方法。对于类方法的调用,有两种方式:一是使用静态方式,通过数组array($classname, $methodname)传递,二是实例化对象后,通过数组array($...

PHP中的函数
1.在具体的Action方法里面,可以用C()对某些参数进行动态配置,主要指那些还没有使用的参数。具体用法如下:C('参数名称'); \/\/获取已经设置的参数值 C('参数名称','新的参数值'); \/\/设置新的值 2.D()函数的使用:先定义好模型类,如UserModel,然后就可以用D()函数对数据进行操作了。例如...

PHP&MySQL无需编程轻松创建数据库网站:Dreamweaver的高级使用多态性分析...
在编程世界中,多态性是一种核心概念,它赋予对象动态调用合适方法的能力。想象一下,有一个名为"figure"的基类,定义了一个"draw"方法。从这个基类派生出circle和rectangle类,它们各自重写了"draw"方法。此时,有一个函数,它接受一个参数"x",并期望根据传入的对象类型调用相应的draw方法。在PHP这类...

php反射在哪些场景有哪些作用?
反射是在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。 其用途如:自动加载插件,自动生成文档,...

php引用类型?
而在PHP中没有import这个函数,一般PHP中调用其他类是用到require(),具体PHP调用其他类的方法如下:1、首先应该先有一个文件名为tool.php的文件,在文件中声明一个类。2、然后需要有另一个文件名为main.php的文件,在文件中调用上面的类。方法如下。

相似回答
大家正在搜