① php如何動態調用靜態方法 - 技術問答
[php]function example($className){? ???if (\"Database\" == $className) {? ?? ?? ???Database::staticFunc();? ???}}[/php]
② PHP 的類內如何使用動態函數名
PHP
中的
$$
符號可以實現,意思是正常的PHP變數前綴再加上$符號,就可以把原來的變數當作變數名。
例如:
<?php
//定義一個變數
$name
=
'';
//定義一個動態變數
$$name
=
'new';
echo
$$name;
echo
'<br>';
echo
$;
//上面的定義等同於下面的定義
$
=
'new';
echo
$;
?>
③ php如何調用同一個類裡面的其他方法的變數
這個是無法直接調用的,如果想調用可以寫入類的變數如下邊的,這種用法是常用的
class name{
$aa="";
function a{
$b="ddd";
$this->aa=$b;
}
function b{
//這里引用$b賦予的類的變數
echo $this->aa;
}
}
④ 在php中如何設置類的屬性,如何調用類的方法
PHP訪問類的屬性、方法使用箭頭語法(->)。這里我給你一個例子供你參考:
<?php
classMyClass{//定義MyClass類
public$name;//定義了一個公有屬性
protected$_age;//定義了一個保護屬性
private$_email;//定義了一個私有屬性
publicfunctionmy_method(){//定義my_method方法
}
protectedfunction_my_method2(){//定義_my_method2方法
}
}
$obj=newMyClass;//實例化
$obj->name='noname';//設置name屬性
$obj->_age=12;//這是錯誤的,不能設置保護屬性
$obj->address='KingStreet.'//設置一個未聲明的屬性是允許的,效果和公有屬性類似,但未賦值前不能使用。
$obj->my_method()//調用公有方法
$obj->_my_method2();//這是錯誤的,不能調用保護方法
你需要理解繼承、公有、保護和私有的概念。
繼承:子類繼承父類的公有、保護屬性和方法。
公有:類的實例可以訪問的屬性和方法。
保護:只能在類的內部及其子類內部訪問的屬性和方法。
私有:只能在類的內部訪問的屬性和方法。
這是個很基礎的問題,建議你多看書。
⑤ 如何在php類中執行某方法的時候自動執行另一個方法比如我執行數據插入的時候自動運行數據過濾的方法
PHP沒有事件機制。有一些模擬事件的方法,但我覺得代碼太繁瑣了,不實用。這里我向你推薦PHP的魔術方法。
魔術方法會在調用一個不存在或是非公有的方法之前,自動根據某種規則調用另外一個方法。比如下面的類就是了這樣:在調用insert方法時,判斷類中是否有before_insert方法。如果有則先調用before_insert方法,並檢查它的返回值,決定是否繼續調用insert。如果before_insert是一個過濾函數,如果驗證失敗就會返回false,insert插入就不會進行了。
如果不明白可以閱讀PHP手冊中介紹魔術方法的部分。
<?php
classMyClass{
//如果使用類的實例調用$method,但$method方法不是公有的,就會觸發此函數。
publicfunction__call($method,$args){
//檢查是否存在方法$method
if(method_exists($this,$method)){
$before_method='before_'+$method;
//檢查是否存在方法$before_method
if(method_exists($this,$before_method)){
//調用$before_method,檢查其返回值,決定是否跳過函數執行
if(call_user_func_array(array($this,$before_method),$args)){
retruncall_user_func_array(array($this,$method),$args)
}
}else{
//$before_method不存在,直接執行函數
retruncall_user_func_array(array($this,$method),$args)
}
}else{
thrownewException('nosuchmethod'.$method);
}
}
//注意這里不要寫成public
privatefunctioninsert(){}
//低調!不要寫出公有的
privatefunctionbefore_insert(){}
}
$myobj=MyClass;
$myobj->insert('mytable',array('name'=>'2012'));
⑥ PHP 類怎麼判斷調用方法
給個例子 好好理解下吧 例:<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this is not defined.\n";
}
}
}
class B
{
function bar()
{
A::foo();
//parent::foo();
}
}
$a = new A();
$a->foo();//動態調用,因為new了對象
A::foo();//靜態調用,直接用類名去調用,沒有new對象
$b = new B();
$b->bar();//在對象$b中,A::foo();進行靜態調用
B::bar();
?>
總結:靜態、動態調用都指類、對象對其方法的調用,動態指的是創建(new)了對象,然後用對象變數去調用方法;靜態則是沒有創建對象,直接用類名去調用。至於另一個對象那就很簡單了,不同的類創建不同的對象,比如class A;class B ,$a = new A();$b = new B();$a and $b 相對之間就是另一個對象了。
延伸:偽變數 $this 通常未定義,如果其所在的方法是被靜態調用的話。但這不是個嚴格規定:如果一個方法被從另一個對象內靜態調用的話,則 $this 會被定義。此時 $this 的值是那個發出調用的對象。
⑦ PHP命名空間動態調用類
不是這樣調用的,命名空間只是一中命名的方式,跟調用沒有直接聯系。用auto_load()載入
⑧ php 如何調用類
//把你的類寫好,在另一個頁面需要使用直接引入即可:
<?php
require'MyClass.php';//引入你的類
$var=newMyClass;//實例化你的類
$var->action();//使用方法
//如果存在命名空間,就導入該命名空間下的類或實例化指定命名空間下的類即可:
namespaceAB;
classB{
//位於AB
}
useABB;//導入你的類
$var=newB;//直接實例化
//或者這樣:
$var=newABB;//注意,需要完全限定名稱
⑨ php 執行類中的方法
你是想問怎麼調用test方法嗎?
$func="test()";
$program->$func;
改成:
$func="test";
$program->$func();
⑩ php框架中動態載入類的幾種方式
//方法1.
function__autoload($name){
require$name.'.class.php';
}
//方法2.
spl_autoload_register('load');
functionload($name){
require$name.'.class.php';
}