基础不好,问个php类调用的初级问题

php中文网
发布: 2016-06-06 20:16:37
原创
1464人浏览过

基础不好,问个php类调用的初级问题

有个Test.class.php类

<?php     
class Test{     

  private $name;
  private $age;
  private $work;

  public function __construct($name,$age,$work){
    $this->name=$name;
    $this->age=$age;
    $this->work=$work;
    $this->do_php();
  }      

  public function do_php(){     
    $content="我的名字是".$this->name.",已经".$this->age."岁了,现在的工作是".$this->work;
    return $content;
  }  
       
}     
?>  
登录后复制

调用如下

$content=new \Test('大大','40','php编程');
echo $content;
登录后复制

echo 不出内容,$content已经是对象了。

在调用如下

立即学习PHP免费学习笔记(深入)”;

$content=new \Test('大大','40','php编程');
echo $content->do_php();
登录后复制

输出“我的名字是大大,已经40岁了,现在的工作是php编程”内容

请教,怎样能$content=new \Test('大大','40','php编程');直接echo出内容

回复内容:

基础不好,问个php类调用的初级问题

有个Test.class.php类

<?php     
class Test{     

  private $name;
  private $age;
  private $work;

  public function __construct($name,$age,$work){
    $this->name=$name;
    $this->age=$age;
    $this->work=$work;
    $this->do_php();
  }      

  public function do_php(){     
    $content="我的名字是".$this->name.",已经".$this->age."岁了,现在的工作是".$this->work;
    return $content;
  }  
       
}     
?>  
登录后复制

调用如下

$content=new \Test('大大','40','php编程');
echo $content;
登录后复制

echo 不出内容,$content已经是对象了。

在调用如下

立即学习PHP免费学习笔记(深入)”;

$content=new \Test('大大','40','php编程');
echo $content->do_php();
登录后复制

输出“我的名字是大大,已经40岁了,现在的工作是php编程”内容

请教,怎样能$content=new \Test('大大','40','php编程');直接echo出内容

我认为只有 @P酱 一个人的答案是对的 @newborn 是用了其他方式,算不上符合题意,至于那些在构造函数里面return的就太不靠谱了。
new 用来生成类的实例,实例的构造方式是调用构造函数,但是构造函数的返回值是没有意义的,因为new不是函数,它不会把构造函数的返回值当做自己的返回值。
__string是PHP中class可以使用的魔术方法之一,此外还有 __sleep, __get, __set等。而 __string 的含义就是当对象的实例需要被转化为string类型时所要进行的处理。所以,正确的示例是

class A {
    public function do() {
        return 'Your conent';
    }
    public function __string() {
        return $this->do();
    }
}
$obj = new A();
echo $obj; //这个时候其实就触发了对象的类型转换,__string()方法被调用。
登录后复制

一定要记得:使用 new 命令获取对象的实例时只有两个结果,一个是得到对象,另一个是构造失败产生异常。绝对不会得到一个string的,如果你只想得到一个string,那么 1) 声明函数即可 2) 定义常量也行

补充:有些人的答案里面提出了在函数中直接写echo语句的方式,千万不要这么做,这是坏习惯,防微杜渐。在函数中echo, print, var_dump等都是调试时候用一下而已,最终代码里面是不能出现的。因为你无法确定谁会调用你的函数,所以内嵌的echo会给调用者带来意外的惊喜。

添加__toString函数

Ztoy网络商铺多用户版
Ztoy网络商铺多用户版

在原版的基础上做了一下修正:增加1st在线支付功能与论坛用户数据结合,vip也可与论坛相关,增加互动性vip会员的全面修正评论没有提交正文的问题特价商品的调用连接问题删掉了2个木马文件去掉了一个后门补了SQL注入补了一个过滤漏洞浮动价不能删除的问题不能够搜索问题收藏时放入购物车时出错点放入购物车弹出2个窗口修正定单不能删除问题VIP出错问题主题添加问题商家注册页导航连接问题添加了导航FLASH源文

Ztoy网络商铺多用户版 0
查看详情 Ztoy网络商铺多用户版

new 出来的对象没办法直接返回字符串,返回的都是对象;
我大概明白你的意思,你就是想new 的时候直接返回结果了,就少些那个do_php(),可以用静态的方式

方案一:

<?php

class Test
{

    private $name;
    private $age;
    private $work;

    static function g($name, $age, $work)
    {
        return new Test($name, $age, $work);
    }

    public function __construct($name,$age,$work){
        $this->name=$name;
        $this->age=$age;
        $this->work=$work;
    }

    public function do_php()
    {
        $content = "我的名字是" . $this->name . ",已经" . $this->age . "岁了,现在的工作是" . $this->work;
        return $content;
    }


}

$c = Test::g('张三',42,'程序猿')->do_php();
echo $c;
登录后复制

方案2

<?php

class Test
{

    private $name;
    private $age;
    private $work;

    static function g($name, $age, $work)
    {
        $instance = new Test($name, $age, $work);
        return $instance->do_php();
    }

    public function __construct($name,$age,$work){
        $this->name=$name;
        $this->age=$age;
        $this->work=$work;
    }

    public function do_php()
    {
        $content = "我的名字是" . $this->name . ",已经" . $this->age . "岁了,现在的工作是" . $this->work;
        return $content;
    }


}

$c = Test::g('张三',42,'程序猿');
echo $c;
登录后复制

望采纳

备注:重复调用Test类会实例化很多对象在内存中,如果需要优化,请优化g方法
static function g($name, $age, $work)
    {
        static $instance;
        if (!isset($instance)) {
            $instance = new Test($name, $age, $work);
        }
        return $instance;
    }
登录后复制

我也是小白,这样你试试?

  public function __construct($name,$age,$work){
    $this->name=$name;
    $this->age=$age;
    $this->work=$work;
    return $this->do_php();
  }  
登录后复制

用 var_dump 输出

你好:
1、楼主第一种做法,使用echo来输出对象,这是不允许的。echo是一个输出函数,局限于输出字符串。
报错如下:
Catchable fatal error: Object of class Test could not be converted to string in /Users/baidu/wwwroot/learn/object.php on line 32

2、第二种做法想法是正确的,但是由于没有把return结果进行输出,所以结果为空。可采用如下2种方案来输出。(echo放在2个位置均可)

class Test{

    private $name;
    private $age;
    private $work;

    public function __construct($name,$age,$work){
        $this->name=$name;
        $this->age=$age;
        $this->work=$work;
        $this->do_php();
    }

    public function do_php(){
        $content="我的名字是".$this->name.",已经".$this->age."岁了,现在的工作是".$this->work;
        echo  $content;
    }

}

$test = new \Test('luboot','40','php search');
登录后复制
class Test{

    private $name;
    private $age;
    private $work;

    public function __construct($name,$age,$work){
        $this->name=$name;
        $this->age=$age;
        $this->work=$work;
        echo $this->do_php();
    }

    public function do_php(){
        $content="我的名字是".$this->name.",已经".$this->age."岁了,现在的工作是".$this->work;
        return $content;
    }

}

$test = new \Test('luboot','40','php search');
登录后复制

虽然你在__construct的时候调用了do_php

do_php方法也return了字符
但是 __construct里面调用do_php的时候 ,没用return
所以改为
......

  public function __construct($name,$age,$work){
    $this->name=$name;
    $this->age=$age;
    $this->work=$work;
    return $this->do_php();
  }  
登录后复制

__tostring 直接echo 对象

__condtructor 里面放echo 直接new一个对象就打印内容

class Test{

private $name;
private $age;
private $work;

public function __construct($name,$age,$work){

$this->name=$name;
$this->age=$age;
$this->work=$work;
$this->content = $this->do_php();
登录后复制

}

public function do_php(){

$content="我的名字是".$this->name.",已经".$this->age."岁了,现在的工作是".$this->work;
return $content;
登录后复制

}

}
$content=new \Test('大大','40','php编程');
var_dump($content->content);
die();

非常感谢大家的回复!

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号