如何在另一个函数中访问一个函数的返回值?

I have one function that ends with:

return $authors;

How can I access this value in another function within the same class?

I've tried (in the second function)

$this->authors;

But it doesn't seem to do anything.

php
dt2002
dt2002 是的,但是如果我们假设的getAuthor()需要运行参数,我们如何将在getAuthor()中设置的现有参数传递给第二个函数,以便再次运行getAuthor()。
4 年多之前 回复
doumi9661
doumi9661 你....打电话给这个功能?假设你的函数名为getAuthor..然后你调用$this->getAuthor()
4 年多之前 回复
douwen3083
douwen3083 您可以将其作为参数传递给下一个方法,或者首先将$autor分配给类属性,例如$this->author=$author;
4 年多之前 回复

1个回答

public function returnAuthor()
{
   return $author;
}

public function anotherMethod()
{
   return $this->returnAuthor();
}

You could follow a similar method as stated in the above example. or you could define a property for your class, have one function assign a value to it and have another function return the value

Like so

class Book
{
   public $author;

   function __construct()
   {
      $this->author = 'Sir Conan Doyle';
   }

   function anotherMethod()
   {
      return $this->author;
   }
}

Hope this helps!

duanjiaoxi4928
duanjiaoxi4928 说实话,如果你得到null它必须是别的东西。 看起来你做错了什么。 没有你的代码很难说。 看看 - > notey.it/n/dDFw
4 年多之前 回复
dsfg3241
dsfg3241 $ authors是一个数组,如果重要的话。
4 年多之前 回复
dpzp5127
dpzp5127 如果我想将其作为我可以使用的变量返回,该怎么办? 我在第二个函数中尝试这个并没有得到任何回报:$ authorList = $ this-> authors; 后续代码var_dump($ authorList);
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
函数的返回值传递给另一个函数做参数

在c++中如何将一个函数的返回值作为另一个函数的参数?具体要怎么做才可以实现?我返回一个return值后,想把这个值给下一个函数,作为它的参数来进行计算,各位大神谢谢了

在Golang中使用另一个函数返回值?

<div class="post-text" itemprop="text"> <p>In Go, is it possible to return using a function only?</p> <p>For example, I want to check for errors and instead of repeating an if statement, I want to just call a function such as <code>checkErrors(err)</code>.</p> <p>Here is an example (<a href="https://play.golang.org/p/4RK2V6H0do" rel="nofollow">goplayground</a>)</p> <pre><code>func foobar(str string) err { _, err := ioutil.ReadAll(resp.Body) checkError(err) // If error != nil then foobar will return the err /*if err != nil { return err }*/ } func checkError(err error) { if err != nil { // Then make the function this is being called within return the err. } } </code></pre> </div>

函数返回值是函数的调用问题

function func(){ var a=0; return function(){ console.log(a++); } } func(); //调用没有返回值 var f1=func(); f1(); //赋值之后调用有返回值0 为什么要把一个命名函数的返回值是一个函数时,要把这个命名函数赋值给一个变量调用才能有返回值。

在主函数中调用其他类函数返回值问题

在主函数中,比如要调用 OnReceiveData(digiData,digiDataLen)函数, digiData为串口数据指针,digiDataLen为长度 调用此接收数据函数后,返回值为void。 但是我在接下来的函数调用中需要用到接收数据函数中的一个pCommand(一个指针,指向一个数据区),这个怎么才能表示呢?

来回答都有分 --- javascript怎么自动将第一个函数的返回值作为第二个函数的参数

javascript怎么自动将第一个函数的返回值作为第二个函数的参数

怎么在函数体内实现跳出函数保持函数传入的参数并且让另一个函数接替本函数返回值给主程序

怎么在函数体内实现跳出函数保持函数传入的参数并且让另一个函数接替本函数返回值给主程序?怎么实现这样的函数切换呢?

VB里能不能从另外一个函数中直接调用一个变量过来,而不通过返回值调用?

VB里能不能从另外一个函数中直接调用一个变量过来,而不通过返回值调用?怎么把变量直接输入到函数里呢?

c++ 关于虚函数的返回值问题

定义Shpae类为抽象类,公用派生类Circle 代码如下: ``` #include<iostream> using namespace std; //定义Shape抽象类 class Shape { public: virtual void shapename()const=0;//定义输出形状名称的纯虚函数 virtual float area()const { return 0.0; }//定义面积的虚函数 }; //定义圆形类 class Circle:public Shape { public: Circle(float r = 0) { rad = r; }//构造函数 virtual void shapename()const { cout << "Circle:" << endl;}//对虚函数进行重定义 virtual float area()const;//对虚函数进行重定义 protected: float rad; }; float Circle::area()const { return 3.14159*rad*rad; } int main() { Circle c(5.0); Shape *p;//定义指向基类的指针 //使指针指向Circle类 p = &c; p->shapename();//动态关联 p->area(); system("pause"); } ``` 我想通过shape类派生出多个类,其中有一个求面积的虚函数,在主函数中通过指向基类的指针p访问时后p->shapename();正常, 但是p->area();这行没用实现,运行结果如下:![图片说明](https://img-ask.csdn.net/upload/202002/06/1580973162_995568.png) 个人感觉是因为area()函数返回值的问题。 恳请各位解答!十分感谢!

vb中连接两个函数返回值的方式是什么,怎么将两个函数的返回值结合起来

vb中连接两个函数返回值的方式是什么,怎么将两个函数的返回值结合起来,怎么实现不同类型的函数的调用?

js匿名函数返回值的获取

请问如何才能获取到匿名函数中的返回值呢?比如想获取到匿名函数function (){return 1;}的返回值,保存在变量a中?

C:在一个void类型的函数里,return后跟一个有返回值的函数

int textf(int n) { printf("Textf:%d\n",n); } void text(int n) { printf("Text:%d\n",n); return textf(n); } int main() { text(3); return 0; } 我这样程序可以正常运行,请问这个是跟编译器有关还是语法本身就允许的? 以及像text这样,如果return后面是跟一个表达式的话, 是只求其值而不返回吗?如果想这样跟一个函数,它实际上会调用那个函数而不会将函数的返回值返回吗? 以及我这样子递归在CODE BLOCKS里可以正常运行,同问这个是跟编译器有关吗: void text(int n) { if(!n) return printf("END!\n"); printf("%d\n",n); return text(n-1); } int main() { text(3); return 0; }

Java语言怎么实现一个函数返回2个返回值

Java语言怎么实现一个函数返回2个返回值,两个返回值在不同时候返回可以实现么?类似println那样多次调用的,return为什么不行,后面的不执行?

c语言中函数返回值类型的问题

看一道改错题: #include<stdio.h> #include<conio.h> #include<math.h> proc(int k)//很显然根据主调函数和返回值类型知道这里缺少类型 { int n;float s,w,p,q; n=1; s=1.0; while(n<=k){ w=2.0*n; p=w-1.0; q=w+1.0; s=s*w*w/p/q; n++; } return s; } void main(){ system("CLS"); printf("%f\n",proc(20)); } 我觉得既然变量s是float型,就应该改成float proc(int k)。可是本题的答案确实这样子改的 double proc(int k)我想问答案这样改对吗?如果对道理是什么?

关于C语言函数返回值的问题

如果函数里面定义了一个变量作为返回值,这里需要空间吧。 调用函数接受返回值又需要一份空间吧。 那是不是应该在函数里面分配内存,然后返回指针呢?这样看起来一份空间就搞定了。 就是不知道分配空间和销毁空间的开销如何,划不划得来?还有碎片化的问题!

把一个带形参的函数封装到另一个函数中

![图片说明](https://img-ask.csdn.net/upload/201902/15/1550199923_939622.png) 怎么把ReceiveMsg函数封装到ReceiveNetWorkMsg函数中。 或者如何修改ReceiveMsg函数,让它可以直接在else if(msg.sType == _T("timer"))中调用

JAVA中一个函数怎么调用另一个函数运行后得到的结果?传参。求指点。。

代码: public void urlCon() { try { URL url = new URL(PATH + input); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(5000); connection.setReadTimeout(8000); connection.setRequestMethod("GET"); connection.setUseCaches(false); connection.setDoOutput(true); connection.setDoInput(true); OutputStream outputStream = connection.getOutputStream(); outputStream.flush(); connection.getResponseCode(); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); final StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } Log.i("返回的数据是 ", response.toString()); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (ProtocolException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } ``` ``` 这个函数运行后得到的结果是 response.toString()是一个字符串,现在又定义了一个函数public void eight() {}在这个函数里面我想定义一个字符串就是response.toString(),请问这个参数要怎么传进来?

c++函数返回值是数组问题

比如现在要求定义一个函数fun(),在主函数调用时直接用fun();就能输出在fun函数里定义好的一个字符串,那要fun函数的返回值怎么返回才行,为什么我返回指针但打印出来却不是正确结果?求大神解释

安卓中想请教一下如何调用函数返回值的问题

这是我写的一个函数贴出来 public String urlCon(String input) { try { URL url = new URL(PATH + input); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(5000); connection.setReadTimeout(8000); connection.setRequestMethod("GET"); connection.setUseCaches(false); connection.setDoOutput(true); connection.setDoInput(true); OutputStream outputStream = connection.getOutputStream(); outputStream.flush(); connection.getResponseCode(); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = null; response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } System.out.println(response); Log.i("返回的数据是 ", response.toString()); return response.toString(); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (ProtocolException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); }; return null; } ``` ``` 这个函数的返回值是response.toString();因为在TRY里面所以还要返回一个null,这样没错吧?然后现在有另一个函数 假设这个函数里面其中一个方法()里面的参数需要的是 这个函数的返回值response.toString()的值,请问这里要怎么实现呢?

C#可不可以通过特性来设置函数的返回值

如果从元数据上看特性类只是在函数里被实例化了一下是做不到改变函数的返回值的。 但是我在java的一个框架里看到了他们的一个注解应该和c#的特性差不多。 那是一个缓存框架在方法的上面写一个注解(特性)表明此方法可以使用缓存然后这个注解 有一个构造函数参数应该是作为key在缓存数据中取值,我想问这里应该是改变了那个函数的 返回值了的(有缓存返回缓存数据无缓存走自己数据库查询) C# 特性可以实现么有没有什么 相关技术名字我可以自己去查阅 谢谢

Python可以这样学(第一季:Python内功修炼)

董付国系列教材《Python程序设计基础》、《Python程序设计(第2版)》、《Python可以这样学》配套视频,讲解Python 3.5.x和3.6.x语法、内置对象用法、选择与循环以及函数设计与使用、lambda表达式用法、字符串与正则表达式应用、面向对象编程、文本文件与二进制文件操作、目录操作与系统运维、异常处理结构。

获取Linux下Ftp目录树并逐步绑定到treeview

在linux下抓取目录树,双击后获取该节点子节点(逐步生成)。另外有两个类,一个是windows下的(一次性获取目录树),一个是linux下的(足部获取目录树)

NS网络模拟和协议仿真源代码

NS网络模拟和协议仿真源代码,包含代码说明及协议分析

简单的NS3网络模拟仿真(计算机网络作业)

简单的NS3网络模拟仿真,内附有PPT演示。论文评述。以及简单的安装教程。

手把手实现Java图书管理系统(附源码)

【超实用课程内容】 本课程演示的是一套基于Java的SSM框架实现的图书管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的java人群。详细介绍了图书管理系统的实现,包括:环境搭建、系统业务、技术实现、项目运行、功能演示、系统扩展等,以通俗易懂的方式,手把手的带你从零开始运行本套图书管理系统,该项目附带全部源码可作为毕设使用。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/27513 移动端:CSDN 学院APP(注意不是CSDN APP哦) 本课程为录播课,课程2年有效观看时长,大家可以抓紧时间学习后一起讨论哦~ 【学员专享增值服务】 源码开放 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

cuda开发cutilDLL

包括cutil32.dll、cutil32D.dll、cutil32.lib、cutil32D.lib,以及附带的glew32.lib/freeglut.lib

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

Tensorflow与python3.7适配版本

tensorflow与python3.7匹配的最新库,更新了python3.7以后可以自行下载,或者去国外python的扩展包下载界面自行下载。

4小时玩转微信小程序——基础入门与微信支付实战

这是一个门针对零基础学员学习微信小程序开发的视频教学课程。课程采用腾讯官方文档作为教程的唯一技术资料来源。杜绝网络上质量良莠不齐的资料给学员学习带来的障碍。 视频课程按照开发工具的下载、安装、使用、程序结构、视图层、逻辑层、微信小程序等几个部分组织课程,详细讲解整个小程序的开发过程

专为程序员设计的数学课

<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登录CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登录CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdn590</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>

实现简单的文件系统

实验内容: 通过对具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 要求: 1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

四分之一悬架模型simulink.7z

首先建立了四分之一车辆悬架系统的数学模型,应用MATLAB/Simulink软件建立该系统的仿真模型,并输入路面激励为随机激励,控制不同的悬架刚度和阻尼,选用最优的参数得到车辆悬架的振动加速度变化曲线

MFC一站式终极全套课程包

该套餐共包含从C小白到C++到MFC的全部课程,整套学下来绝对成为一名C++大牛!!!

C++语言基础视频教程

C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。

Java8零基础入门视频教程

这门课程基于主流的java8平台,由浅入深的详细讲解了java SE的开发技术,可以使java方向的入门学员,快速扎实的掌握java开发技术!

HoloLens2开发入门教程

本课程为HoloLens2开发入门教程,讲解部署开发环境,安装VS2019,Unity版本,Windows SDK,创建Unity项目,讲解如何使用MRTK,编辑器模拟手势交互,打包VS工程并编译部署应用到HoloLens上等。

C/C++学习指南全套教程

C/C++学习的全套教程,从基本语法,基本原理,到界面开发、网络开发、Linux开发、安全算法,应用尽用。由毕业于清华大学的业内人士执课,为C/C++编程爱好者的教程。

pokemmo的资源

pokemmo必须的4个rom 分别为绿宝石 火红 心金 黑白 还有汉化补丁 资源不错哦 记得下载

test_head.py

本文件主要是针对使用dlib的imglab标注工具标记的目标检测框和关键点检测而生成的xml文件, 转换为coco数据集格式.

Java面试史上最全的JAVA专业术语面试100问 (前1-50)

前言: 说在前面, 面试题是根据一些朋友去面试提供的,再就是从网上整理了一些。 先更新50道,下一波吧后面的也更出来。 求赞求关注!! 废话也不多说,现在就来看看有哪些面试题 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用

2019 AI开发者大会

2019 AI开发者大会(AI ProCon 2019)是由中国IT社区CSDN主办的AI技术与产业年度盛会。多年经验淬炼,如今蓄势待发:2019年9月6-7日,大会将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京,进行技术解读和产业论证。我们不空谈口号,只谈技术,诚挚邀请AI业内人士一起共铸人工智能新篇章!

linux“开发工具三剑客”速成攻略

工欲善其事,必先利其器。Vim+Git+Makefile是Linux环境下嵌入式开发常用的工具。本专题主要面向初次接触Linux的新手,熟练掌握工作中常用的工具,在以后的学习和工作中提高效率。

DirectX修复工具V4.0增强版

DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复

20行代码教你用python给证件照换底色

20行代码教你用python给证件照换底色

2019 Python开发者日-培训

本次活动将秉承“只讲技术,拒绝空谈”的理念,邀请十余位身处一线的Python技术专家,重点围绕Web开发、自动化运维、数据分析、人工智能等技术模块,分享真实生产环境中使用Python应对IT挑战的真知灼见。此外,针对不同层次的开发者,大会还安排了深度培训实操环节,为开发者们带来更多深度实战的机会。

我以为我对Mysql事务很熟,直到我遇到了阿里面试官

太惨了,面试又被吊打

相关热词 c#对文件改写权限 c#中tostring c#支付宝回掉 c#转换成数字 c#判断除法是否有模 c# 横向chart c#控件选择多个 c#报表如何锁定表头 c#分级显示数据 c# 不区分大小写替换
立即提问
相关内容推荐