1. php魔术常量怎么用
例如需要打开一个文件,在对象创建时打开,对象消亡时关闭
<?php
class FileRead
{
protected $handle = NULL;
function __construct(){
$this->handle = fopen(...);
}
function __destruct(){
fclose($this->handle);
}
}
?>
这两个方法在继承时可以扩展,
例如:
<?php
class TmpFileRead extends FileRead
{
function __construct(){
parent::__construct();
}
function __destruct(){
parent::__destruct();
}
}
?>
__call()和__callStatic()
在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。
这两个方法在可变方法(Variable functions)调用中可能会用到。
<?php
class MethodTest
{
public function __call ($name, $arguments) {
echo "Calling object method '$name' ". implode(', ', $arguments). "\n";
}
public static function __callStatic ($name, $arguments) {
echo "Calling static method '$name' ". implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context');
?>
__get(),__set(),__isset()和__unset()
当get/set一个类的成员变量时调用这两个函数。例如将对象变量保存在另外一个数组中,而不是对象本身的成员变量
<?php
class MethodTest
{
private $data = array();
public function __set($name, $value){
$this->data[$name] = $value;
}
public function __get($name){
if(array_key_exists($name, $this->data))
return $this->data[$name];
return NULL;
}
public function __isset($name){
return isset($this->data[$name])
}
public function unset($name){
unset($this->data[$name]);
}
}
?>
__sleep()和__wakeup()
当在执行serialize()和unserialize()时,会先调用这两个函数。
例如在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:
<?php
class Connection
{
protected $link;
private $server, $username, $password, $db;
public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}
private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}
public function __sleep()
{
return array('server', 'username', 'password', 'db');
}
public function __wakeup()
{
$this->connect();
}
}
?>
__toString()
对象当成字符串时的回应方法。例如使用echo $obj;来输出一个对象
<?php
// Declare a simple class
class TestClass
{
public function __toString() {
return 'this is a object';
}
}
$class = new TestClass();
echo $class;
?>
这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。
__invoke()
调用函数的方式调用一个对象时的回应方法。如下
<?php
class CallableClass
{
function __invoke() {
echo 'this is a object';
}
}
$obj = new CallableClass;
var_mp(is_callable($obj));
?>
__set_state()
调用var_export()导出类时,此静态方法会被调用。
<?php
class A
{
public $var1;
public $var2;
public static function __set_state ($an_array) {
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
var_mp(var_export($a));
?>
__clone()
当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。
<?php
public class Singleton {
private static $_instance = NULL;
// 私有构造方法
private function __construct() {}
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Singleton();
}
return self::$_instance;
}
// 防止克隆实例
public function __clone(){
die('Clone is not allowed.' . E_USER_ERROR);
}
}
?>
2. php下 var 和pulic 的使用
public和var的作用差不多 因为 var定义的变量如果没有加protected 或 private则默认为publicphp4 中一般是用 varphp5 中就一般是用 public了现在基本都是使用public来代替varvar是定义变量的;而public是定义property(属性)和method(方法)的可见性的。
3. php 中class static public var 都定义什么什么
static 一旦声明为静态变量,在编译时刻开始永远存在,不受作用域范围约束,而且展一定内存
public 公共的谁都可以调用。
var 跟public 一样。var是老版本php的写法。
<?php
class a{
var $abc="ABC";
}
$b=new a;
$c=$b;
echo $b->abc;//这里输出ABC
echo $c->abc;//这里输出ABC $b->abc="DEF";
echo $c->abc;//这里输出DEF
?>
这个就是php $b引用类a的方法的变量。
引用方法是 类名:: 方法名。好了200分拿出来吧
4. 说说php面向对象编程时static,public,private,protected 各有什么意义
staticpublic与publicstatic是等价的,这两者只是两个修饰符的顺序不同。根据oracle.com教材中第八章的描述,如果两个或两个以上的(不同的)字段修饰符出现在字段声明,它们出现的顺序需与FieldModifier一致,这只是习惯,但不是必需的。部分修饰符说明:public是访问权限修饰符,用于控制外界对类内部成员的访问,声明为public的对象成员是完全共有的,外界可以随意访问,除此之外还有private,protected和默认。static控制类成员变化的修饰符。static是静态成员修饰符,其修饰的静态变量脱离具体对象独立存在,在内存中之后一份拷贝,所有的对象都公用这一个存储空间,所以对static修饰的静态变量进行的修改对该类的所有对象都起作用。static修饰的静态函数代表所有对象的统一操作,只能调用静态变量。static是针对面向对象中的“多态”而提出来的,static修饰的静态成员不存在多态性。附:FieldModifier顺序
5. php实例化一个类,并分别访问其public,private,protected属性,查看有什么不同
classTest{
public$var1;
public$var2;
publicfunction__construct(){
//构造函数
}
privatefunctionmypriAction(){
//私有方法,只能在类里面访问
}
(){
//私有方法,只能在类里面和了类里面访问
}
publicfunctionpre($obj){
//公共方法,实例化以后可以调
echo"<pre>";
print_r($obj);
echo"</pre>";
}
}
$test=newTest();
$arr=array(1,2,3,4,5);
$test->pre($arr);
6. php面向对象中public与var的区别
public是定义property(属性)和method(方法)的可见性的关键字,用public修饰的属性和方法在类的内部和外部都可以访问。var是定义变量的。用var定义的变量如果没有加protected 或 private则默认为public。在php4中类中用var定义的变量必须在定义时或在类的构造函数中进行初始化。
7. php面向对象中public与var的区别
public和var的作用差不多 因为 var定义的变量如果没有加protected 或 private则默认为public,php4 中一般是用 var,php5 中就一般是用 public了。
现在基本都是使用public来代替var,var是定义变量的;而public是定义property属性和method方法的可见性的。
var 是PHP4的时候用的,它和现在的Public作用一样,现在就用Public了,PHP4的时候没有Public,Private,Protected,都只有一个var。
public跟var没多大区别。php5以来已经用public取代var了。
8. php 为什么第一个函数前面不能加public
这些是类里的修饰符,访问控制(可见性),用于对属性或方法的访问控制
比如 public protected private
所以在非class用public是不正确的
9. php 的public作用
从PHP5.0版本开始,对象声明时需要声明对象属性和方法的可见性,public关键字表示属性或方法是公开可见的。
在PHP5.0之前未支持对象属性和方法的可见性定义,默认所有的属性和方法都是公开可见的,如以下的对象声明:
//例1
classObj{
var$name='Obj';
functiongetName(){
return$this->name;
}
}
而PHP5开始推荐写法为:
//例2
classObj{
protected$name='Obj';
publicfunctiongetName(){
return$this->name;
}
}
对于例1来说,实际上可以直接访问name属性,从而绕过getName方法,如
$obj=newObj();
echo$obj->name;
而对于例2来说,由于$name属性是protected(受保护的),因此必须使用getName方法才能得到$name属性的值。
同时这也是面向对象语言通用的一种声明方式。
public: 公开可见
protected: 对象内部可见 (该对象的子对象同样可以访问)
private: 对象自身内部可见 (不包含该对象的子对象,或者说private属性和方法不会被继承)
10. php中声明变量var与private、public、static的区别
var
是声明一个变量/对象,public,
private,
是类/类的属性/类的字段的访问修饰符,static是类/类的属性/类的字段的修饰符