PHP构造函数和静态函数

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)


Iva*_*oni 6

假设PHP 5.x.

不同的目标,不同的路径

  1. 创建一个类的新实例(对象)

    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)
  2. 使用类的功能

    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个实例.

  3. 使用工厂创建的单例(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

根据我的回答,我不想推广/降级单身人士.简单地从问题中的单词,我做了这个计算:

"静态" + "__结构"= "单身"!