__toString方法

张正友标定法-MATLAB实验 该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义 阅读详情

再看另外一个魔术方法__TOstring(在这里故意这么写,是要说明PHP中方法不区分大小写,但实际开发中还需要注意规范)。

当进行测试时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了__toString方法,就能在测试时,echo打印对象体,对象就会自动条用它所属类定义的__toString方法,格式化输出这个对象所包含的数据。如果没有这个方法,那么echo一个对象将报错,例如 “Catchable fatal error: Object of class Sales could not be converted to string” 语法错误,实际上这一个类型匹配失败的错误。不过任然可以用print_r()和var_dump()函数输出一个对象。当然,__toString是可以定制的,所提供的信息和样式更丰富,代码如下所示。

<?php

class Account
{
    public $user = 1;
    private $pwd = 2;

    //自定义格式化输出方法
    public function __toString()
    {
        return "当前对象的用户名是{$this->user},密码是{$this->pwd}";
    }
}

$a = new Account();

echo $a;
echo PHP_EOL;
print_r($a);

运行这段代码发现,使用__toString方法后,输出的结果是可定制的,更易于理解。实际上,PHP的__toString魔术方法的设计原型来源于Java。Java中也有这么一个方法,而且在Java中,这个方法被大量使用,对于调试程序比较方便。实际上,__toString也是一种序列化,我们知道PHP自带serialize/unserialize也是进行序列化的,但是这组函数序列化时会产生一些无用信息,如属性字符串长度,造成存储空间的无谓浪费。因此,可以实现自己的序列化和反序列化方法,或者json_encode/json_decode也是一个不错的选择。

为什么直接echo一个对象就会报语法错误,而如果这个对象实现了__toString方法后就可以直接输出呢?原因很简单,echo本来可以打印一个对象,而且也实现了这个接口,但是PHP对其做了个限制,只有实现了__toString后才允许使用。从下面的PHP源代码里可以得到验证:

ZEND_VM_HANDLER(40, ZEND_ECHO, CONST |TMP |VAR |CV, ANY)
{
    zend_op *opline = EX(OPLINE);
    zend_free_op free_opl;
    zval z_copy;
    zval *z = GET_OPL_ZVAL_PTR(BP_VAR_R);
    //此处的代码预留了把对象转换为字符串的接口
    if (OPL_TYPE != IS_CONST &&
        Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z) -> get_method != NULL &&
        zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
            zend_print_variable($z_copy);
            zval_dtor($z_copy);
        } else {
            zend_print_variable(z);
        }
        FREE_OPL();
        ZEND_VM_NEXT_OPCODE();
}

由此可见,魔术方法并不神奇。

有比较才有认知。最后,针对本节代码给出一个Java版本的代码,供各位同学用来对比两种语言中重载和魔术方法的一桶,代码如下所示:

import org.apache.commons.lang.builder.ToStringBuilder;
/**
 * 类的重载演示Java版本
 * @author lightWay
 * @date
 * @verson
 */
public class Account
{
	private String user; //用户名
	private String pwd; //密码

	public Account()
	{
		System.out.println("构造函数");
	}

	public Account(String user, String pwd)
	{
		System.out.println(user+"---"+pwd);
	}

	public void say(String user)
	{
		System.out.println("用户名是:"+user);
	}

	public void say(String user,String pwd)
	{
		System.out.println("用户:"+user);
		System.out.println("密码"+pwd);
	}

	public String getUser()
	{
		return this.user;
	}

	public void setUser(String user)
	{
		this.user = user;
	}

	public void setPwd(String pwd)
	{

	}

	@Override
	public String toString()
	{
		return ToStringBuilder.reflectionToString(this);
	}

	public static void main(String[] args)
	{
		Account account = new Account();
		account.setUser("张三");
		account.setPwd("123456");
		account.say("李四");
		account.say("王五","123");
		System.out.println(account);
	}
}

运行上述代码,输出如下图所示:


可以看出,Java的构造方法比PHP好用,PHP由于有了__set/__get这一对魔术方法,使得动态增加对象的属性字段变得很方便,而对Java来说,要实现类似的效果,就不得不借助反射API或直接修改编译后字节码的方式来实现。这体现了动态语言的优势,简单灵活。

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析 本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程,涵盖运动学建模、仿真环境搭建、PID控制器设计与实现等关键环节。通过Simulink仿真和可视化调试技巧,帮助开发者掌握移动机器人运动控制的核心技术,提升轨迹跟踪精度与性能优化能力。 阅读详情

相关推荐

Conda报错急救指南:遇到Malformed version string ‘~‘怎么办?(附最新解决方案)

本文深度解析Conda报错`Malformed version string '~'`的根源与解决方案。该错误通常由版本字符串解析异常或Conda版本过旧引起。文章提供了从清理缓存、针对性升级到环境重建的完整修复流程,并强调了升级Conda至最新版本是解决此类`CondaValueError`问题的根本方法,帮助开发者高效恢复工作环境。

weixin_28835789的博客 646

__toString()方法

__toString()方法打印一个对象时,如果定义了__toString()方法,就能在测试时,通过echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。如果没有这个方法,那么echo一个对象时,就会报错Object of class Account could not be converted to string,实际上这是一个类型匹配失败的错误

杨森源的博客 7080

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码,仅供学习及设计参考。

GJZGRB的博客 1416

toString()方法的概念、应用、重写toString方法

toString归属于Object类,而Object类是默认被所有Java类继承的。toString方法就是此类(Object)中的一个用于返回对象地址的方法。具体应用如下: package com.chen; public class TestObject { //在此处定义TestObject类的用户名和密码属性 String id; String pwd; //含两个参数的构造方法 public TestObject(String id, String pwd) {

weixin_44918667的博客 6167

shader多图叠加变换

shader Shader "Paint3D/AddTexture" { Properties { _MainTex ("Main Texture", 2D) = "white" {} _MainColor("Main Color", Color)=(1,1,1,1) _AddTex0 ("Texture0", 2D) = "white" {} _AddTex1 ("Texture1", 2D) = "white" {} .

李长江的博客 908

AGV舵轮选型实战:从核心参数到精准计算的完整指南

本文提供了一份详尽的AGV舵轮选型实战指南,强调从经验决策转向数据驱动。文章系统讲解了如何将工况需求转化为核心参数,并通过牵引力、扭矩、功率等关键计算步骤,指导工程师完成精准选型,避免因选型不当导致的运行故障与效率低下。

醉三国 495

toString方法使用

toString方法:生成一个toString方法,将你需要的内容整合好,使你调用这个方法时直接输出,是主方法中的输出语句中System.out.println(对象.toString());直接输出所需内容!

小母的博客 3万+

你的Wi-Fi总断网?可能是DHCP租约到期惹的祸!手把手教你用Windows/路由器设置永久IP或延长租期

本文深入解析家庭Wi-Fi频繁断网的常见原因——DHCP租约到期问题,并提供Windows和路由器设置永久IP或延长租期的详细教程。通过对比静态IP配置与延长租期两种方案,帮助用户有效解决网络不稳定问题,特别适合游戏玩家和远程工作者优化家庭网络环境。

weixin_29305313的博客 1416

PHP魔术方法之__toString()方法

__tostring()方法:在直接输出对象引用的时候,就不会产生错误,而是自动调用了__tostring()方法,输出__tostring()方法中返回的字符串 通俗来说就是 对象一般是使用print_r() 或 var_dump() 来打印访问 但对于一般闲的人来说直接 使用 echo 输出对象时,必定会报错的,原因是对象无法使用echo的。 这个时候如果想解决这个错误,咱们应该怎么操作...

郝云博客 4790

AD9361快速锁定实战:Profile寄存器配置与频率调谐算法解析

本文深入解析了AD9361射频收发器的快速锁定(Fast Lock)功能,重点阐述了其核心机制——Profile寄存器配置。通过剖析16字节Profile结构,详细讲解了频率调谐算法,包括LO_DIV、LO_INT、LO_FRAC等关键参数的计算,以及如何通过查表获取优化的环路滤波器参数。文章提供了完整的Python算法示例和FPGA实现要点,旨在帮助工程师实现毫秒级甚至微秒级的频率切换,满足跳频通信等高性能应用需求。

weixin_29196315的博客 229

AutoSar实战营 - 总目录

欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址

weixin_48498880的博客 3626

invoke 魔术_PHP面向对象之魔术方法(__tostring,__invoke)详解

本文目标:1、了解PHP中魔术方法的定义2、了解__tostring()魔术方法的使用场景3、掌握__tostring()魔术方法的用法4、了解__invoke()魔术方法的使用场景5、掌握__invoke()魔术方法的用法(一)、了解PHP中魔术方法的定义PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。(二)、了解_...

weixin_30957307的博客 1090

【毕设实战】基于YOLOv8的HRSC2016船舶智能检测系统开发全指南(含可视化UI界面,打造海事领域高分毕设)

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

know_F0727的博客 127

JAVA toString方法详解

JAVA toString方法 在Java中,我们经常会编写许多自定义类。在使用时,我们如何打印出这些类中实例变量? class value { private int s; public void set(int i) { this.s = i; } public int get() { return this.s; } } 在上例中,我们编写了一个简单的类,该类中包含一个实例变量 s ,在使用时我们可以用方法set()、get

qq_61897054的博客 5万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

toString()方法讲解及toString()方法重写

toString()方法是在Object类里面的方法,它返回的是String型的数据:类名+@+哈希值的16进制形式. public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 返回该对象的字符串表示。 toHexString(int i)方法: 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式 Eg: im

潘小蓝的博客 9377

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

toString方法

摘自:https://www.cnblogs.com/greatPrograme/p/12446759.html toString方法详解 在查找资料后,我才明白把一个类型转换为string类型是啥意思。 比如当定义一个int类型后,利用toString()方法就能把int转化为string类型,即把整数类型转换为了字符串。举例即int a= 10;转换后就变成了a=“10”。这里的10不再是整数,他有了双引号,变成了字符串。 下面讲tostring()方法。 tostring()方...

自主无人机 PX4 ROS SLAM 路径规划 MVS等技术分享 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

toString()方法

Object类中的toString方法: toString(): 1.拼接对象的地址值; 话不多说,上代码!!! package cn.tedu.object; /* toString():拼接对象地址值 */ public class ToStringDemo1 { public static void main(String[] args) { //拼接对象的地址值 System.out.println(new Object().toSt...

马永斌 1万+

toString 方法

1.toString()是定义在Object类中的方法,由于所有的类都是Object类的子类,所以所有的对象都有一个默认的toString方法。 2.它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法。 3.toString()是一种自我描述的方法,本身返回的是getClass().ge...

ashleyjun的博客 1734

toString方法与toString方法的重写

本文主要介绍toString方法及其重写, 1. toString方法介绍 toString()方法是在Object类里面的方法,它返回的是String型的数据:类名+@+哈希值的16进制形式` 源码 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } } 创建一个学生类包含年龄姓名两个成员属性和一个构造方法 c

weixin_45684526的博客 945

toString方法重写

Student类(折叠起来的就是普通的get、set方法),因为syso打印方法中调用的Object.toString()方法,当你重写toString()方法,会覆盖Object.toString()方法,及会输出你重写的toString()方法,以下为详解。 1.未重写toString()打印对象 输出结果 ①进入println()方法,看到调用了String.valueOf() ②进入String.valueOf()方法看到不为空调用 Object.toString()方法 ③进入Object

不懂一休 1万+

java重写toString()方法

前言: 在你兴高采烈的写完一个类,创建测试类时,创建对象,传入参数,调用对象,以为会得到参数值,但突然发现输出的是“ 类名@什么东东?(其实是散列码,也是16进制的哈希值哈)”,反复检查代码,但不知怎么修改。我不知道你们有没有这种情况发生,但是我经常就有,原因当然是因为不习惯重写toString方法和基础知识还不足导致的啦。还是要加油呀!所以记录一下学习的toString()方法。 1.1 在Object类中有一个重要的方法:toString()方法。 作用:用于返回表示对象值的字符串 1.2 为啥要重写t

懒惰的小黑的博客 9659

怎么覆盖toString方法、为什么要覆盖toString方法?

首先我们来看下JDK1.6所有父类Object中的toString方法是怎么描述的: ———————————————————————— toString public String toString() 返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。 Obj...

diaodao3427的博客 1665

JAVA中toString方法的作用

因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”。 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法 总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法 回答补充: 写这个方法的用途就是为了方便操作,所以在文件操作里面可用可不用 例子1: public ...

代码是程序员的语言,博客是思想的桥梁,连接你我,共享智慧之光。 1万+

java中toString 方法的意义以及如何重写toString

我们知道在java中是没有一种类型能够直接输出数组的,而为了方便,java中直接给了我们一种方法toString方法,这种方法其实并不是直接将数组输出,而是将数组转化成了字符串再进行输出,toString方法直接代替了System.out.println(); 对于现成的数组,可以直接调用Arrays.toString()方法,那么对于输出不是数组的一组集合该如何去调用toString方法呢?这就...

burning_passion的博客 927

toString方法的使用

toString 方法 java.lang.Object类的toString方法的定义如下: public String toString(){ return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 1.当我们打印一个对象的引用时,实际上默认就是这个对象的toStr...

Abby_lxf的博客 4020
上一篇: __call和__callStatic方法
下一篇: windows下面的Docker安装详细
键盘钢琴师
博客等级 码龄11年 21粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值