说我有一个文件foo.php: 如果我想创建可以使用的类型foo类: require_once("path/to/Foo.php") ; $bar = new Foo(); 但是说我已经创建了一个register("Foo", "path/to/Foo.php"); function register($className, $classPath) { require_once($classPath); //Error if the file isn't included, but lets //assume that
以下是关于 instantiation 的编程技术问答
在PHP 5.4中,我相信这样的事情是有效的: echo ( new DateTime( '2014-04-05 10:36am' ))->format( 'Y-m-d g:ia' ); 在PHP 5.3上,我目前正在做类似的事情: $date = new DateTime( '2014-04-05 10:36am' ); echo $date->format( 'Y-m-d g:ia' ); 有什么方法将这两条线组合到PHP 5.3中的一条线中(我不是要通过连接线路)吗?还是我必须升级到> = 5.4才能拥有该选项? 解决方案 我必须升级到> = 5.4才能拥有该选项吗? 是.您需要升级到PHP 5.4才能做到这一点. 那是 新功能 实际上是在PHP 5.4上引入的. 班级成员访问实例化,例如(new foo) - > bar(). 如果您尝试在PHP版本上进行此操作小于 5.4 ,则会遇到此错误. 解析错误:语法错误,意外的t_
我正在尝试通过变量实例化类(laravel3雄伟的模型),而我遇到了一个错误,说找不到该类. 但是,当我对类名称进行编码时,它可以正常工作. (仅供参考,在以下代码$contact_type中,预计将是电话,传真或电子邮件.) 这是我目前正在玩的东西: foreach( $input AS $contact_type => $contact_info ) { foreach( $contact_info AS $data ) { $obj = new $contact_type( (array)$data); echo'
Obj: ',print_r($obj),'
'; //
require_once('Class.php'); $myArray = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); // etc 哪个是正确的? foreach($myArray as $key => $val) { $class = new Class(); $result = $class->someMethod($val); } 或 $class = new Class(); foreach($myArray as $key => $val) { $result = $class->someMethod($val); } 编辑更具体,使用$aFeeds = array(rssFeed1,rssFeed2,rssFeed3,...); foreach($aFeeds as $key => $feedURL) { $feed->set_feed_url(feedURL); $feed->in
我处于一个情况下,我需要在另一个类的实例中实例化类别的参数. 这是原型: //test.php class test { function __construct($a, $b, $c) { echo $a . '
'; echo $b . '
'; echo $c . '
'; } } 现在,我需要使用以下类的 cls 函数来实例化类: class myclass { function cls($file_name, $args = array()) { include $file_name . ".php"; if (isset($args)) { // this is where the problem might be, i need to pass as many arguments as test class has
我正在设计一个类,该类定义一个高度复杂的对象,其中大多数可选参数(50+),其中许多将具有默认值(例如:$type = 'foo'; $width = '300'; $interactive = false;).我正在尝试确定设置构造函数和实例/类变量的最佳方法,以便能够: 使使用类易于使用 使自动介绍类(即:使用phpdocumentor) 编码这个优雅 根据上述内容,我不想传递构造函数大量的论点.我将传递一个单个哈希,其中包含初始化值,例如:$foo = new Foo(array('type'=>'bar', 'width'=>300, 'interactive'=>false)); 在编码课程方面,我仍然觉得我宁愿拥有... class Foo { private $_type = 'default_type'; private $_width = 100; private $_interactive = true;
说我有以下内容: class Thing { function __construct($id) { // some functionality to look up the record and initialize the object. return $this; } } 现在给出了一系列ID,我想最终得到一系列实例化的事物.如下: $ids = array(1, 2, 3, 4, 5); $things = array_map(array('Thing', 'new'), $ids); // Doesn't work 当然,事物类别没有"新"方法,而" __ -construct"也没有限制.我知道这可以通过$ ids循环循环完成,但是使用Array_map上每个调用"新事物($ id)"的方式很光滑? 解决方案 它无法正常工作,因为没有静态方法Thing::new.您可以添加它,也可以将功能作为array_map回调
我有一个抽象数据库类,称为: abstract class database { protected $value; } 我创建了另一个抽象类 abstract class my_database extends database { public function set_value($value) { $this->value = $value; } } 当我尝试使用它时: $my_db = new my_database(); 我有错误: Fatal error: Cannot instantiate abstract class my_database in ... 我尝试做的是:抽象类数据库具有一个受保护的$值,我想创建一个包装器类,以便能够更改保护值(暂时). 我该怎么做? edit1:不幸的是,当我没有抽象my_database尝试时,我得到了错误: - abstract methods and
要恢复已持续存在的对象的状态,我想创建一个集体的空实例,而无需调用其构造函数,以便以我找到的唯一方法,这是 doctrine 确实是为了创建一个假序列化对象,unserialize() it: function prototype($class) { $serialized = sprintf('O:%u:"%s":0:{}', strlen($class), $class); return unserialize($serialized); } 是否有其他 hacky 的方式? 我期望找到一种反思的方式,但我没有. 解决方案 更新: 自PHP 5.4! 以来可用 其他解决方案 另一种方法是用和空构造函数创建一个班级的孩子 class Parent { protected $property; public function __construct($arg) { $this->property = $arg; } }
ive看了看和尝试,但我找不到答案. 在PHP中,是否可以调用类的成员函数(当该类要求构造函数接收参数)而不将其实例化为对象? 一个代码示例(给出错误): end=$value; } public function alert($value) { echo $value." ".$this->end; } } //this works: $example=new Test("world"); $example->alert("hello"); //this does not work: echo Test("world")::alert("hello"); ?> 解决方案 不幸的是,PHP没有支持这样做,但是您是一个创意的人:D
假设我们有类CFoo.在下面的示例中 function MyPHPFunc() { $foo = new CFoo(); . . . // When/where/how does $foo get destroyed/deleted? } 在此示例中 解决方案 php中的所有值都保存在所谓的zval s中.这些zval包含实际数据,类型信息,并且 - 这对于您的问题 - 参考计数很重要.看看以下片段: $a = new B; // $a points to zval(new B) with refcount=1 $b = $a; // $a, $b point to zval(new B) with refcount=2 (+1) $c = $b; // $a, $b, $c point to zval(new B) with refcount=3 (+1) unset($a); // $b, $c poi
我一直以为 - 在没有构造函数参数的情况下 - 创建类实例时,括号(卷曲括号)遵循类名,并且您可以以自己的个人身份包括或排除它们. 这两个陈述相等: $foo = new bar; $foo = new bar(); 我对吗?还是我不知道的括号有意义? 我知道这听起来像是一个RTM问题,但是我一直在搜索一段时间(包括整个PHP OOP部分),我似乎找不到直接的答案. 解决方案 它们是等效的.如果您不通过任何代码惯例,请更喜欢的方法.就我个人而言,我喜欢把它遗漏,因为这对我来说真的很混乱. 如果您将参数传递给构造函数,则 其他解决方案 $foo = new bar()将对$foo = new bar有用.例如: class bar { public $user_id; function __construct( $user_id ) { $this->user_id = $user_id } } -
System.Activator.CreateInstance(T)方法是否存在性能问题(因为我怀疑它使用反射)足以阻止我们随便使用它吗? 解决方案 一如既往,回答有关性能问题的唯一正确方法是实际测量代码. 这是一个示例 linqpad 测试的程序: Activator.CreateinStance new T() 调用称为新T() 的代表 一如既往,用一粒盐进行性能计划,这里可能有虫子偏向结果. 输出(时机为毫秒为毫秒): Test1 - Activator.CreateInstance() 12342 Test2 - new T() 1119 Test3 - Delegate 1530 Baseline 578 请注意,上述时间为100.000.000(1亿)对象的构造.对于您的程序而言,开销可能不是一个真正的问题. 警告性结论是,Activator.CreateInstance花费的时间大约是完
我最近比较了[]和list()的处理速度,并惊讶地发现[]运行 超过三倍以上 >>>.我使用{}和dict()进行了相同的测试,结果实际上是相同的:[]和{}都进行了0.128秒/百万个循环,而list()>和dict()大约为0.428秒/百万.每个循环. 为什么? do []和{}(以及可能的()和'')立即退回一些空股票字面的副本,而其明确命名的对应物(list(),dict(),dict(),tuple(),tuple(), str())完全可以创建一个对象,无论它们是否实际上都有元素? 我不知道这两种方法有何不同,但我很想找出答案. 我找不到文档中的答案,因此寻找空括号的问题比我预期的要更加问题. 我通过调用timeit.timeit("[]")和timeit.timeit("list()")以及timeit.timeit("{}")和timeit.timeit("dict()")分别比较列表和词典来获得时间结果.我正在运行Python 2.7.9. 我
我想继续检查游戏对象是否会实例化.我拥有的所有是gameObject name say'model'.如果模型在层次结构中处于活动状态,我想做某件事.问题最初是gameObject不可用的.后来仅将其实例化.如何检查层次结构中是否存在具有名称的游戏对象. if(gameobject.name=="Model(Clone)") { //Do something } 这将返回 null值,因为它最初未实例化.在某些时间将进行实例化之后. 解决方案 初始化变量模型 Gameobject Model; 当尚未实例化时,逻辑断言将返回false if (Model != null && Model.name == "Model(Clone)"){//return false //Do Something } 用名称实例化gameObject. Gameobject Model = Instantiate (somePrefab); if需要放置
这个问题可能对一些Java专家来说是错误的.但是我想知道为什么我们以像主这样的静态方法而不是在静态块中创建对象. 我知道,如果我们在静态块中实例化,当然,如果我们不进一步使用它,它将不必要地创建对象.这种方法还有其他内容吗?我们可以将其与Singleton模式联系起来吗? 例如: public class MyClass { static { AnotherClass object = new AnotherClass(); // Do Some operations here with object. } } 解决方案 主要原因是控制何时实际执行. 静态块中的东西将在第一次加载类时执行,并且很容易意外地加载类(例如,通过在类上引用常数). 具有静态方法意味着您在调用该方法时完全控制了(因为您必须明确调用它). 关于单身人士,热切加载的单例的Java Idiom将实例初始化为静态字段.这基本上将与静态
类示例: $(document).ready(function(){ var $ = function(id) { return document.getElementById(id); } class someClass { constructor() { ... } someMethod() { ... } } ... // rest of examples within this scope }); 到目前为止,当窗口加载时,我能够创建类对象的实例> var obj = new someClass() $('startButton').onclick = obj.someMethod.bind(obj) 所有人都可以正常工作,直到我想通过删除和创建该类对象的
我想创建类实例并用用户输入字符串命名.像这样的事情,实际上是有效的.有什么想法吗? class Account: balance=0 input("What's your name?") = Account() 如果用户要键入Scott,我希望能够使用Scott.Balance等调用属性. 解决方案 您最好将它们存储在字典中.使用用户输入在全球/本地空间中创建变量是麻烦的秘诀. accounts = {} account[x] = Account() 其他解决方案 使用内置raw_input将用户输入作为"构造函数"的参数 class Account: def __init__(self, name=0, money=0): self.name = name self.money = money input = raw_input("What's your name? -->") accoun
我的情况是我扩展了具有多个属性的课程: class SuperClass: def __init__(self, tediously, many, attributes): # assign the attributes like "self.attr = attr" class SubClass: def __init__(self, id, **kwargs): self.id = id super().__init__(**kwargs) 然后我想创建实例,但是我知道这导致了一个只能实例化的情况: super_instance = SuperClass(tediously, many, attributes) sub_instance = SubClass(id, tediously=super_instance.tediously, many=super_instance.many, attrib