bar*_*024 15 php constructor static-functions
关于构造函数在PHP中如何工作,我有点困惑.
我有一个带有构造函数的类,当我实例化一个新对象时会调用它.
$foo = new Foo($args);
Run Code Online (Sandbox Code Playgroud)
__construct($params)在类中调用Foo它并执行适当的初始化代码.
但是,当我使用该类调用静态函数时,将再次调用构造函数.
$bar = Foo::some_function(); //runs the constructor from Foo
Run Code Online (Sandbox Code Playgroud)
这会导致构造函数执行,运行我打算仅在创建新Foo对象时使用的对象初始化代码.
我是否忽略了构造函数的工作原理?或者有什么方法可以防止__construct()在我使用类进行静态函数调用时执行?
我应该使用"工厂"功能来进行对象初始化吗?如果是这样,构造函数的重点是什么呢?
::编辑::我有一个表单,用户可以将照片上传到相册(create_photo.php)和他们可以查看相册的区域(view_photos.php).提交表格时:
$photo = new Photo($_FILES['photo'], $_POST['arg1'], ect..);
Run Code Online (Sandbox Code Playgroud)
Photo构造函数创建并保存照片.但是在view_photo.php中,当我打电话时:
$photo = Photo::find_by_id($_POST['id']) //user-defined function to query database
Run Code Online (Sandbox Code Playgroud)
这导致Photo的构造函数运行!
Nea*_*eal 20
我没有看到任何重复你的问题.
请参阅演示:http://codepad.org/h2TMPYUV
码:
class Foo {
function __construct(){
echo 'hi!';
}
static function bar(){
return 'there';
}
}
echo Foo::bar(); //output: "there"
Run Code Online (Sandbox Code Playgroud)
假设PHP 5.x.
不同的目标,不同的路径
创建一个类的新实例(对象)
class myClassA
{
public $lv;
public function __construct($par)
{
echo "Inside the constructor\n";
$this->lv = $par;
}
}
$a = new myClassA(11);
$b = new myClassA(63);
Run Code Online (Sandbox Code Playgroud)
因为我们创建了一个新的PHP对象调用:
__construct($par);
新对象,所以:
$a->lv == 11
$b->lv == 63
Run Code Online (Sandbox Code Playgroud)使用类的功能
class myClassB
{
public static $sv;
public static function psf($par)
{
self::$sv = $par;
}
}
myClassB::psf("Hello!");
$rf = &myClassB::$sv;
myClassB::psf("Hi.");
Run Code Online (Sandbox Code Playgroud)
现在 $rf == "Hi."
函数或变量必须定义静态来访问::,没有创建调用"psf"的对象,"类变量" sv在类中只有1个实例.
使用工厂创建的单例(myClassA在上面)
class myClassC
{
private static $singleton;
public static function getInstance($par){
if(is_null(self::$singleton)){
self::$singleton = new myClassA($par);
}
return self::$singleton;
}
}
$g = myClassC::getInstance("gino");
echo "got G\n";
$p = myClassC::getInstance("pino");
echo "got P\n";
Run Code Online (Sandbox Code Playgroud)第一次构造一个$ par设置为gino的新对象时使用工厂(getInstance).
使用工厂第二次$ singleton已经有一个我们返回的值.没有创建新对象(不调用__construct,使用更少的内存和CPU).
当然是一个对象instanceOf myClassA,不要忘记:
myClassC::$singleton->lv == "gino"
注意单身人士:
http://www.youtube.com/watch?v=-FRm3VPhseI
根据我的回答,我不想推广/降级单身人士.简单地从问题中的单词,我做了这个计算:
"静态" + "__结构"= "单身"!