首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能在PHP中直接使用函数返回值作为动态类名?

在PHP中,不能直接使用函数返回值作为动态类名的原因是因为PHP的解析器在编译阶段需要确定类名,而函数返回值只能在运行时才能确定。这导致了一个问题,即解析器无法在编译阶段确定要加载的类。

PHP的解析器在编译阶段会扫描代码,解析类的定义并将其加载到内存中。如果在类的定义中使用了函数返回值作为类名,解析器无法在编译阶段确定要加载的类,因为函数返回值只能在运行时才能确定。

为了解决这个问题,PHP提供了一种间接的方式来使用函数返回值作为动态类名。可以先将函数返回值赋给一个变量,然后将该变量作为类名使用。例如:

代码语言:php
复制
$className = getClassName(); // 调用函数获取类名
$obj = new $className(); // 使用变量作为类名创建对象

这样,通过将函数返回值赋给一个变量,就可以在运行时确定要加载的类。

需要注意的是,使用函数返回值作为动态类名可能会增加代码的复杂性和可读性,因此在实际开发中应谨慎使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

php面向对象程序设计入门教程

不可扩展,html与php不分离 面向对象:自己作为指挥者,指挥别人去做。具有可扩展性,html和php代码分离 2.什么是对象?...具有属性和方法对象的抽象的描述 5.的定义 定义角度: 静态描述: 就是我们熟悉的变量 动态描述(对象的功能):把动态描述写成函数,在对象声明的函数叫做方法 所有的都是从属性 和方法 两个方面去声明...成员属性:在直接声明的变量. 可以使用PHP的标量类型和复合类型,所以也可以是其他实例化的对象,在使用资源和空类型(null)没有意义....static,那么唯一的访问形式就是”对象引用- 属性”(没有$符号),和”对象引用- 方法名()”. 8.特殊的对象引用”$this” 在对象的外部门可以实例化对象,用对象的引用来访问对象的成员...属性 和 $this- 方法.只能在成员方法中使用 9.构造方法和析构方法(魔术方法) 构造方法: ①如果声明的时候没有显示的声明它,中都会默认存在一个没有参数列表并且内容为空的构造方法.如果显示的声明它

46010

PHP 静态属性和静态方法

1、基本使用 前面介绍的 PHP 类属性和方法都要在实例化后才能调用(常量属性除外),除此之外,PHP 还提供了静态属性和静态方法,所谓「静态」指的是无需对进行实例化,就可以直接调用这些属性和方法,...同理,我们也不能在静态方法通过 $this 引用对象属性和方法。...静态属性支持动态修改 为了以示区别,这里通过了大写字母设置静态属性变量,这不是强制的,因为静态属性和常量不同,可以在运行时进行修改,只是它的作用域是整个,而不是某个对象: Car::$WHEELS...,在上述代码,我们将静态方法 printCar 调整为通过 sprintf 函数返回格式化字符串,然后在魔术方法 __toString 方法调用,作为该非静态方法的返回值。...为什么第二个打印的结果是父 Car 而不是子类 LynkCo01?

4.3K10
  • 复杂变量测试php7.1.20可能存在的漏洞

    如果小括号前有数字或者字母的话就会die()掉整个程序,大概意思就是防止直接使用函数,例如不能直接使用system('ls')这样子。...Usage 官方文档还给出了一个非常有意思的 Note: {% colorquote success %} Note: 函数、方法、静态变量和常量只有在 PHP 5 以后才可在 {$} 中使用。...然而,只有在该字符串被定义的命名空间中才可以将其值作为变量来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者常量以及静态变量的值。...其实在 php ,我们可以查阅 php 文档知道有 {% colorquote success %} PHP 的变量用一个美元符号后面跟变量来表示。变量是区分大小写的。...在 php ,可以接受函数返回值作为变量,而phpinfo()的返回值为TRUE,所以先将phpinfo()执行了,将返回值返回作为了变量

    81740

    浅谈PHP8的类型定义以及几个新特性

    随着PHP8的发布,作为动态类型语言的PHP也有了更大的进步。 此处浅谈一下PHP8的类型定义以及几个新特性 本文仅介绍重点,详细内容可以参考 PHP 官方。...array{ //do something } 范例:mixed = array|bool|callable|int|float|null|object|resource|string (PHP写类型默认为...mixed { //do something } 其他 顺带提一下php8比较喜欢的几个更新 Match表达式 你可以称它为switch表达式的大哥,match可以返回值,不需要break语句,可以组合条件...新的 match 类似于 switch,并具有以下功能: Match 是一个表达式,它可以储存到变量亦可以直接返回。 Match 分支仅支持单行,它不需要一个 break; 语句。...->country; 对象获取 $object = new stdClass; var_dump($object::class); // "stdClass" static return type

    37910

    php学习之类与对象的构造方法使用技巧

    成员方法的基本语法 class { 成员属性; 访问修饰符 function 成员方法(形参){ 方法体 return; } } 说明: 成员方法定义在 成员方法前面可以有访问修饰符,写默认是...在一个,构造方法有且只有一个,定义多个会报错 在php4可以使用作为构造方法,在php5也支持 ?...注意: 一旦自定义了一个构造方法,默认的构造方法就会被覆盖,这时创建对象的时候就会使用自定义的构造方法 一个只能有一个构造方法 this只能在的方法中使用,而不能在的外部使用 构造方法小结: 构造方法的名相同也可以使用关键词...析构函数基本使用: 基本语法: class { public function __destruct(){ 函数体 } } 说明: 析构函数都是public修饰符 __destruct关键词,不能修改...,我们可以使用析构函数,显式销毁对象时,在析构函数释放资源 垃圾回收机制 在php,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启用垃圾回收器将对象销毁 当程序退出前,php也将启用垃圾回收器

    59020

    细说php入门学习

    变量命名规范 有数字,字母和下划线组成 不能以数字开头 支持中文., 但不推荐 变量要有意义 可变变量 将一个变量的值,作为另一个变量使用 $name = '山鸡'; $山鸡 = '乌鸡'; $乌鸡...全局变量 不能在局部环境中使用 ​ ②. 局部变量 不能在全局环境中使用 ​ 特殊情况下: ​ ①....$GLOBALS[ 变量 ] ​ 可以在任意环境中使用, 该变量 只能是全局环境的变量 ​ ⑤. global 变量 ​ 该变量可以在函数外部直接使用 $a = 10; //全局变量 function...函数技巧 变量技巧 可变变量: 将一个变量的值 作为另一个变量使用 引用变量 函数技巧 可变函数: 将一个变量的值 作为函数名 来使用 引用函数: 通过 &符 将内存地址赋予 // 引用函数例...只能在 使用 一般用于内操作属性 或 方法 伪对象使用方法 ———- (以下内容与方法是在写 的内部的!!!

    3.7K20

    Go 函数式编程篇(三):匿名函数和闭包

    一、匿名函数的定义和使用 匿名函数是一种没有指定函数名的函数声明方式(与之相对的,有名字的函数被称为具名函数),在很多编程语言中都有实现和支持,比如 PHP、JavaScript(想想 Ajax 请求的实现...) // 2、定义时直接调用匿名函数 func(a, b int) { fmt.Println(a + b) } (1, 2) 为什么可以将匿名函数赋值给一个普通变量呢?...支持闭包的语言都将函数作为第一对象(firt-class object,有的地方也译作第一级对象、一等公民等,都是一个意思),Go 语言也例外,这意味 Go 函数和普通 Go 数据类型(整型、字符串...注:所谓第一对象指的是运行期可以被创建并作为参数传递给其他函数或赋值给变量的实体,在绝大多数语言中,数值和基本类型都是第一对象,在支持闭包的编程语言中(比如 Go、PHP、JavaScript、Python...等),函数也是第一对象,而像 C、C++ 等不支持匿名函数的语言中,函数能在运行期创建,所以在这些语言中,函数不是不是第一对象。

    69310

    PHP命名空间(Namespace)初探

    对于命名空间,官方文档已经说得很详细[查看],在这里做了一下实践和总结。 命名空间一个最明确的目的就是解决重名问题,PHP不允许两个函数或者出现相同的名字,否则会产生一个致命的错误。...php namespace Article; ?> 复制代码 为什么要说第一个命名空间呢?因为同一脚本文件可以创建多个命名空间。...> 复制代码 可以看到,在MessageBoard空间中调用article空间里的Comment时,使用了一种像文件路径的语法: \空间\元素 除了之外,对函数和常量的用法是一样的,下面为两个空间创建了新的元素...官方文档说得非常好,直接拿来套了。 非限定名称 ,或包含前缀的名称,例如 $comment = new Comment();。...> 复制代码 字符串形式调用问题 上面的动态调用的例子,我们看到了字符串形式的动态调用方式,如果要使用这种方式要注意两个问题。 1. 使用双引号的时候特殊字符可能被转义 <?

    1.7K10

    PHP 7 新特性

    > 以上程序执行输出结果为: 的第一条日志 六、PHP Closure::call() PHP 7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数...> 以上程序执行输出结果为: 723 -64 十、PHP 7 异常 PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境实现零成本的断言,并且提供抛出自定义异常及错误的能力。...7 use 语句 PHP 7 可以使用一个 use 从同一个 namespace 中导入函数和常量: 实例 // PHP 7 之前版本需要使用多次 use  use some\namespace\...> 以上程序执行输出结果为: 3 3 0 十四、PHP 7 Session 选项 PHP 7 session_start() 函数可以接收一个数组作为参数,可以覆盖 php.ini session...7 废弃特性 PHP4 风格的构造函数PHP4 函数可以与同名,这一特性在 PHP7 中被废弃,同时会发出一个 E_DEPRECATED 错误。

    1.6K40

    PHP基础之面向对象篇

    对象名=new ();对象名=new ; //两种方式都可以 对象如何访问(使用)对象的属性? 对象在内存存在形式 对象在内存如何存在? 用下面代码说明: 如果我们这样写,我们认为会输出:是构造函数小可爱18,但是,最后只会输出是构造函数。这位为什么呢? 之前我们说过,构造函数也是函数,也会开一个新栈。这里他会把name和age当成一个新的变量。...只能有一个构造函数(不能重载) 的构造方法小结: ①再PHP4,构造方法名和名相同,PHP5之后可以和名相同也可以是__construct()。 ②构造方法没有返回值。...析构函数 什么是析构函数? 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。在PHP5引用。...> 变量内部有两种 ::变量或者self::变量。 这里需要注意的一点是,访问静态变量和是否创建对象无关,你创建对象,也可以访问。

    65830

    3分钟短文:看傻眼!Laravel给数据库造假竟成工具链

    数据库也一样,数据库表就好比是地,种地我们得有种子,才能在命令行这样使用php artisan migrate --seed 或者让数据库一切从头开始,旧的数据清空,然后填充: php artisan...Tom Hanks' 'email' => 'tomhanks@gmail.com', ]); } } 看到这儿大家应该熟悉了吧,原生的数据库CRUD操作,直接指定表...为什么这么写?,方法方法,函数函数的!没错,就是一个代码片段,laravel约定的东西, 你这么写,在执行数据填充和测试的时候,它就起作用!就这么神奇。 那如何控制填充条数呢?...::class, 500)->create(); 怎么理解呢,就是我们创建了模型工厂 ContactFactory,然后使用 factory 快捷函数进行实例化调用,并使用工厂内的数据, 对每个模型发起...Happy coding :-) 是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

    1.1K20

    3分钟短文:看傻眼!Laravel给数据库造假竟成工具链

    数据库也一样,数据库表就好比是地,种地我们得有种子,才能在命令行这样使用php artisan migrate --seed 或者让数据库一切从头开始,旧的数据清空,然后填充: php artisan...Tom Hanks' 'email' => 'tomhanks@gmail.com', ]); } } 看到这儿大家应该熟悉了吧,原生的数据库CRUD操作,直接指定表...为什么这么写?,方法方法,函数函数的!没错,就是一个代码片段,laravel约定的东西, 你这么写,在执行数据填充和测试的时候,它就起作用!就这么神奇。 那如何控制填充条数呢?...::class, 500)->create(); 怎么理解呢,就是我们创建了模型工厂 ContactFactory,然后使用 factory 快捷函数进行实例化调用,并使用工厂内的数据, 对每个模型发起...Happy coding :-) 是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

    1.2K00

    C++笔试面试题整理

    const修饰函数返回值:如果给“指针传递”的函数返回值加const,则返回值不能被直接修改,且该返回值只能被赋值给const修饰的同类型指针。...常引用声明方式:const类型标识符 &引用=目标变量; 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?...格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 } 好处:在内存产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。...而虚函数实现的是在基通过使用关键字virtual来申明一个函数为虚函数,含义就是该函数的功能可能在将来的派生定义或者在基的基础之上进行扩展,系统只能在运行阶段才能动态决定该调用哪一个函数,所以实现的是动态的多态性...1、继承是在编译时刻静态定义的,且可直接使用, 2、继承可以较方便地改变父的实现。

    2.6K40

    【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性

    void 函数 ---- PHP 标量类型与返回值类型声明 默认情况下,所有的PHP文件都处于弱类型校验模式。...这玩意看上去是不是特别熟悉,学习过java或者.net的应该特别清楚吧,就是啥都不用返回,而在php7返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return...匿名可以直接定义给变量,可以在方法中使用return返回,也可以当做参数传递给方法内部。其实,匿名就像一个没有事先定义的,而在定义的时候直接就进行了实例化。...Closure::call() PHP 7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。...> 输出结果分别为:1    1  有网友说,php都到8了,为什么你还跟我说php7,想问,php都到8了,为什么你写代码还用5呢?所以不是新的不好,而是老的稳定,毕竟姜还是老的辣。

    1.2K40

    PHP 生成器入门

    PHP_EOL; } 所以除了一个更短的函数定义,我们还能获取什么呢?yield 到底做了什么?为什么在第一个函数定义时依然可以返回数据,即使没有 return 语句? 先从返回值说起。...把生成器当迭代器使用真是无聊 是的,你的想法是对的。以上给出的所有讲解任何人都可以从 PHP 文档获取到。但是作为迭代器这些使用,连它强大功能的一半都没用到。...不过从 PHP 7.0 起支持返回值。这个功能在用于迭代时可能有些奇怪,但是在其他使用场景如协程时将非常有用,例如,当我们在执行一个生成器时我们可以依据返回值处理,而无需直接对生成器进行操作。...这个值看起来和普通函数返回值并无二致,只不过它处于异步执行环境。...这就是需要生成器需要有返回值的意义,这也是为何我们将这个特性加入到 PHP 7.0 的原因,我们会将最后执行的yield 值作为返回值,但这不是一个好的解决方案。

    2K10

    PHP7 新特性简介(一)

    另外其PHP7的兼容性也是非常好的。因此,其他版本向PHP7迁移过程,程序调整不会太大。本文针对性能提升原因做深入研究,主要是简单描述一下PHP7一些新增的特性。...1、函数参数支持标量类型声明 在PHP5,可以将函数参数指定为、接口、数组和回调类型的一种,但是无法将类型指定为标量。...> 4、生成器返回表达式 php5.5实现了生成器yield,但是生成器函数不可以有返回值,但是return空是一个有效的语法并且它将会终止生成器继续执行。...php7允许在生成器函数通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次...> #输出结果 # 1 # -1 # 0 8、新增Closure::call()静态方法 Closure是用来表示匿名函数,可以称作为闭包

    1.9K00

    php基本语法复习

    php 一种创建动态交互性站点的强有力的服务端脚本语言 环境:phpstudy搭建而成 在phpstudy下的WWW下的文件夹下编写php程序 保存到WWW的下一级目录下 可以使用回环地址加上php文件运行程序...global关键词,(这一点和python不同,pythonglobal是将局部变量转换为全局变量,而php是在函数内部调用全局变量),如果删除global,将不能在函数内部调用全局变量 php同时在名为...,始终返回值为1 echo比print稍快,因为他返回任何值 print 有无括号都可使用(**print和print()**) <?...对象 对象是存储数据和有关如何处理数据的信息的数据类型 php必须明确地声明对象 首先必须声明对象的使用class关键词,是包含属性和方法的结构 在对象定义数据类型,然后在该类的实例中使用此数据类型...> php函数返回值 使用返回值,用return 当函数内部使用形参时,想要往外输出参数,则需要return,因为形参不是全局变量、 数组 数组能够在单独的变量存储一个或多个值 <?

    22810

    面试总结-C++

    起到了隐藏的作用 在的 static 成员变量属于整个所拥有,对的所以对象只有一份拷贝 在的 static 成员函数属于整个所拥有,这个函数接收 this 指针,因而只能访问的 static...见为什么不能建立引用数组 将引用作为函数的参数时,可以避免对变量或者对象的复制,因此不会调用对象的拷贝构造函数。当希望传入的引用参数不被改变时,使用const引用。...当存在const或者引用时成员变量时,必须使用初始化表。...- int (*p)(int)是函数指针,强调是指针,该指针指向的函数具有int类型参数,并且返回值是int类型的。 ##### 指针与数组 - 二者均可通过增减偏移量来访问数组的元素。...4.流对象,资源对象,new对象,不应该直接作为参数,一旦抛出异常,就可能会导致严重的问题,函数也许会被错误的执行,资源也许会泄漏。 5.减少全局变量的使用

    2.1K11

    Python学习手册(第4版).1

    装饰器就是一个给对象添加额外功能的函数,其本质是函数。它的基本构造:高阶函数+函数嵌套+闭包。 装饰器 即在代码运行期间动态增加功能的方式。 3大条件: 1....函数作为对象,赋值给变量,也就是函数可以作为参数,也可以作为返回值。 2. 闭包,函数内部可以嵌套函数,可分为外函数和内函数。...内函数可以运用外函数的临时变量,并且外函数返回值是内函数的引用,就形成一个闭包。 3. 高阶函数,即函数式编程,条件也是第1条。...知道这些都是从北理嵩老师课上记下来的。 脚本语言又被称为扩建的语言,或者动态语言,是一种编程语言,用来控制软件应用程序,脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。...无论它是如何运行的,每一次当你运行模块文件时,Python都会从头至尾地执行模块文件的每一条代码。 在系统提示模式下使用文件扩展,但是在导入时别使用文件扩展。 它们的第一行是特定的。

    86810
    领券