浅谈C++与PHP中的构造函数与析构函数

        第一次接触构造函数和析构函数,是学C++的时候,然而一年多没接触C++,似乎对于这两个“类中函数”,早已忘得差不多了。这几天在学PHP,又遇到了这两函数,由于对于构造函数和析构函数的了解不深,今天就好好研究了一下下。

      先说说在C++中的构造函数和析构函数。C++中提供了构造函数来处理对象的初始化,但是不能说构造函数的主要作用是用来对对象进行初始化。构造函数是一种特殊的成员函数,不需要用户调用,在建立对象时,构造函数就会自动执行。而且构造函数的名字必须与类名相同。注意,不能由用户任意命名。有时候也会在想,我们都是在什么时候调用构造函数的?其实,在类对象进入其作用域是就调用了构造函数。构造函数没有返回值,所以也不需要在定义构造函数时声明函数类型,这是构造函数和一般函数的一个不同之处。在定义构造函数的时候,可以带参数,也可以不带参数。但是呢,带参数的构造函数有一个很大的优点:采用带参数的构造函数,在调用不同对象的构造函数时,可以将不同的数据从外面传递给构造函数,以实现不同的初始化。不过这时候要注意几点。首先,我们已经知道用户是不能调用构造函数的,所以不能像常规的调用函数的方法来对构造函数给出实参。在C++中,构造函数的实参是在定义对象时给出的。

        不过这时候我们也会在想,如果用户没有定义构造函数,那会有构造函数么?其实,如果用户没有自己定义构造函数,则C++系统会自动生成一个构造函数。在了解构造函数的时候,我们还得知道一个名词:重载。构造函数的重载,通俗来说就是定义很多个不同的构造函数,但是,函数名必须相同,其中不相同的是,构造函数的参数的个数和参数的类型不同。还需明白的一点是:构造函数的参数的值既可以通过实参传递,也可指定为某些默认值。不过,一般不应同时使用构造函数的重载还有默认参数的构造函数。

        析构函数是什么?我们可以这样理解,析构函数是与构造函数作用相反的函数。从析构函数的名字也可以看出。数学中,数A的相反数是-A。所以可以映射到C++中,构造函数A的作用相反的函数就是析构函数~A。注意,不是-A!就像我们不能说构造函数的主要作用是用来对对象进行初始化一样,析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作。同构造函数一样,析构函数没有返回值,没有函数类型。不过析构函数也没有函数参数。可以说析构函数是“三无函数”。因为没有函数参数,所以析构函数不能被重载。因此只有一个析构函数!要切记。在使用构造函数和析构函数时,其顺序可以简单记为:先构造的后析构,后构造的先析构。就好比栈操作,先进后出。

        简单了解完C++中的构造函数和析构函数后,现在来说说PHP中的构造函数与析构函数。在PHP4中,构造函数是类中的一个特殊函数,构造函数与类同名。当使用 new 操作符创建一个类的实例时,构造函数将会自动调用。如果一个类没有构造函数,则调用基类的构造函数,前提是基类有构造函数。然而,在PHP5引入了一个声明构建函数的标准方法: __construct()。这里需要提醒的是:construct()函数前的下划线“_”是两个!!!如果少写一个“_”,结果就错了。见Example1

 Example1:

 Code:

<?php 

	/*类的实例4:实现Iterator接口的迭代  */
		class MyIterator implements Iterator
		{
			private $var = array();
			public function _constuct($array)
			{
				if(is_array($array))
				{
					$this-&gt;var = $array;
				}
			}

			public function rewind()
			{
				echo "rewinding\n";
				reset($this-&gt;var);
			}

			public function current()
			{
				$var = current($this-&gt;var);
				echo "current:$var\n";
				return $var;
			}

			public function key()
			{
				$var = key($this-&gt;var);
				echo "key:$var\n";
				return $var;
			}

			public function next()
			{
				$var = next($this-&gt;var);
				echo "next:$var\n";
				return $var;
			}

			public function valid()
			{
				$var = $this-&gt;current() !== false;
				echo "valid:{$var}\n";
				return $var;
			}
		}

		$values = array(1,2,3);
		$it = new MyIterator($values);

		foreach ($it as $a =&gt; $b)
		{
			print "$a:$b\n";
		}

输出结果: 

 

 

Example2:

Code:

<?php 
	/*类的实例4:实现Iterator接口的迭代  */
		class MyIterator implements Iterator
		{
			private $var = array();
			public function __constuct($array)
			{
				if(is_array($array))
				{
					$this-&gt;var = $array;
				}
			}

			public function rewind()
			{
				echo "rewinding\n";
				reset($this-&gt;var);
			}

			public function current()
			{
				$var = current($this-&gt;var);
				echo "current:$var\n";
				return $var;
			}

			public function key()
			{
				$var = key($this-&gt;var);
				echo "key:$var\n";
				return $var;
			}

			public function next()
			{
				$var = next($this-&gt;var);
				echo "next:$var\n";
				return $var;
			}

			public function valid()
			{
				$var = $this-&gt;current() !== false;
				echo "valid:{$var}\n";
				return $var;
			}
		}

		$values = array(1,2,3);
		$it = new MyIterator($values);

		foreach ($it as $a =&gt; $b)
		{
			print "$a:$b\n";
		}

输出结果:

 

但是,如果没有定义构造函数__construct()怎么办?此时,系统会自动查找是否有与类同名的函数,如果有,此时,构造函数将会变成与类同名的函数。如Example2。

如果同时存在__construct()函数和与类同名的函数,如example3,此时,两个函数是一样的,只执行一个函数。

Example3:

Code: 

<?php 

	/*类的实例4:实现Iterator接口的迭代  */
		class MyIterator implements Iterator
		{
			private $var = array();
			public function __construct($array)
			{
				if(is_array($array))
				{
					$this-&gt;var = $array;
				}
			}

			public function MyIterator($array)
			{
				if(is_array($array))
				{
					$this-&gt;var = $array;
				}
			} 

			public function rewind()
			{
				echo "rewinding\n";
				reset($this-&gt;var);
			}

			public function current()
			{
				$var = current($this-&gt;var);
				echo "current:$var\n";
				return $var;
			}

			public function key()
			{
				$var = key($this-&gt;var);
				echo "key:$var\n";
				return $var;
			}

			public function next()
			{
				$var = next($this-&gt;var);
				echo "next:$var\n";
				return $var;
			}

			public function valid()
			{
				$var = $this-&gt;current() !== false;
				echo "valid:{$var}\n";
				return $var;
			}
		}

		$values = array(1,2,3);
		$it = new MyIterator($values);

		foreach ($it as $a =&gt; $b)
		{
			print "$a:$b\n";
		}

输出结果:

        对于析构函数,在PHP4中,析构函数是不存在的。但是,PHP5中有析构函数。其他的与C++中的一样。记得析构函数是没有参数的。

 

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/489.html

《浅谈C++与PHP中的构造函数与析构函数》有9个想法

发表评论