类的类型提示 - 将类名放在需要约束的方法参数之前

语法格式:

public function write(ShopProduct $shopProduct){}

数组提示:

public function setArray(array $storearray){}

class ShopProduct{
public $title = 'default product'; // 属性也称为成员变量,用来存放对象之间互不相同的数据
public $producerMainName = 'main name';
public $producerFirstName = 'first name';
public $price = 0; // 创建对象时,构造方法会被自动调用,构造方法可以确保必要的属性设置,并完成任何需要准备的工作
public function __construct($title,$producerMainName,$producerFirstName,$price){
$this->title = $title; // 使用伪变量$this给每个变量赋值
$this->producerMainName = $producerMainName;
$this->producerFirstName = $producerFirstName;
$this->price = $price;
} public function getProducer(){ // 方法让对象执行任务
return $this->producerMainName . $this->producerFirstName;
}
} class ShopProductWriter{
public function write(ShopProduct $shopProduct){ // 类的类型提示,只需将类名放在需要约束的方法参数之前
$str = $shopProduct->title . ':' . $shopProduct->getProducer() . "($shopProduct->price) . </br>";
print $str;
} public function setArray(array $storearray){ // 数组提示
var_dump($storearray);
} public function setWriter(ObjectWriter $objectWriter=null){
var_dump($objectWriter);
}
} class Wrong{};
$store = array('name'=>'taobao');
$objectWriter = NULL; $product1 = new ShopProduct('My Antonia','Willa','Cather',5.99); // 更易于实例化,也更安全,实例化和设置只需要一条语句就可以完成,任何使用ShopProduct对象的代码都可以相信所有的属性皆被初始化了
$writer = new ShopProductWriter();
$writer->write($product1); // 有了参数提示,规定此处只能传入new ShopProduct对象
$writer->write(new Wrong()); // 传入其它的对象会出现:Catchable fatal error: Argument 1 passed to ShopProductWriter::write() must be an instance of ShopProduct, instance of Wrong given..从而防止隐藏bug的产生。
$writer->setArray($store); // 有了参数提示,规定此处只能传入一个数组
$writer->setWriter($objectWriter); // 有了参数提示,规定此处只能传入NULL

php传入对象时获得类型提示的更多相关文章

  1. 深入理解PHP内核(十)变量及数据类型-类型提示的实现

    原文链接:http://www.orlion.ga/253/ PHP是弱类型语言,向方法传递参数时也并不严格检查数据类型.不过有时候需要判断传递到方法中的参数,为此PHP中提供了一些函数来判断数据的类 ...

  2. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  3. 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用

    学习 EF Code First+MVC 时遇到了在请求JsonResult时出现 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用 的异常,原因 ...

  4. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  5. 序列化类型为“System.Reflection.Module”的对象时检测到循环引用

    在使用ajax调用web services时,正好返回的类型为datatable,想用通过json方式直接解析,但调用后,得到如下错误: 序列化类型为“System.Reflection.Module ...

  6. .net4.0切换2.0时,SplitContainer”的对象强制转换为类型

    问 题:将dotnet framework 4.0 切换到2.0时,编译没有问题,在运行时出现如下错误:System.InvalidCastException: 无法将类型为“System.Windo ...

  7. ADO.NET 实体数据模型 异常-“序列化类型为 XX 的对象时检测到循环引用”

    发生异常的代码如下: 1: public JsonResult GetSaleByNo1(string id) 2: { 3: SaleMvcUI.Helper.saleDBEntities sale ...

  8. 在mvc返回JSON时出错:序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用 的解决办法

    在MVC中返回JSON时出错,序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用. public ActionResul ...

  9. 受检查异常要求try catch,new对象时,就会在堆中创建内存空间,创建的空间包括各个成员变量类型所占用的内存空间

    ,new对象时,就会在堆中创建内存空间,创建的空间包括各个成员变量类型所占用的内存空间

随机推荐

  1. Ex 3_17 无穷路径..._十一次作业

    (a) Inf(p)在p中出现了无穷多次,说明Inf(p)存在一个环当中,所以这个环的顶点肯定是某一个强连通部件的子集. (b) 若G中存在一条无穷路径,则G中至少存在一个环,且这个环至少有两个顶点, ...

  2. Ext.util.Format.date与Ext.Date.format区别, 转换时间戳

    在Extjs中装时间戳使用如下两种都可以: Ext.util.Format.date(time,'U'); Ext.Date.format(time, 'U'); 为了找到它们的区别,查看源代码,以E ...

  3. concat layer

    参考:http://blog.csdn.net/bailufeiyan/article/details/50876728#reply

  4. 浏览器的userAgent归纳

    IE IE6 User-Agent:Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.2) IE7 User-Agent:Mozilla/4.0 (compat ...

  5. C++ code:string stream(string流)

    如果有一个文件aaa.txt,有若干行,不知道每行中含有几个整数,要编程输出每行的整数之和,该如何实现? 由于cin>>不能辨别空格与回车的差异,因此只能用getline的方式逐行读入数据 ...

  6. Laravel Eloquent 自定义返回字段

    返回指定字段 Book::select("price", "name")->all(); 返回关系字段关联的属性 Book::select("p ...

  7. 性能测试二十七:环境部署之Dubbo原理

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成. Dubbo是框架,并不是像http那种传输协议 传统 ...

  8. DDD领域模型AutoMapper实现DTO(七)

    DTO的应用场景: 定义产品类: public class Product { public string ProductName { get; set; } public decimal Produ ...

  9. springbank 开发日志 一次因为多线程问题导致的applicationContext.getBean()阻塞

    几天前遇到的这个问题.由于交易是配置的,不同的交易是同一个类的不同实例,所以不可能提前将其以@autowired类似的方式注入到需要的类中 <op:transaction id="Re ...

  10. python爬取百度贴吧帖子

    最近偶尔学下爬虫,放上第二个demo吧 #-*- coding: utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Too ...