php反射調用方法
1. php調用shell的方法技巧
php調用shell的方法技巧
一、配置
查看php.ini中配置是否打開安全模式,主要是以下三個地方
safe_mode = (這個如果為off下面兩個就不用管了)
disable_functions =
safe_mode_exec_dir=
二、使用
由於PHP基本是用於WEB程序開發的,所以安全性成了人們考慮的一個重要方面。於是PHP的設計者們給PHP加了一個門:安全模式。如果運行在安全模式下,那麼PHP腳本中將受到如下四個方面的限制:
① 執行外部命令
② 在打開文件時有些限制
④ 基於HTTP的認證
在安全模式下,只有在特定拿春目錄中的外部程序才可以被執行,對其它程序的調用將被拒絕。這個目錄可以在php.ini文件中用 safe_mode_exec_dir指令,或在編旦敏明譯PHP是加上--with-exec-dir選項來指定,默認是/usr/local/php /bin。
如果你調用一個應該可以輸出結果的外部命令(意思是PHP腳本沒有錯誤),得到的'卻是一片空白,那麼很可能你的網管已經把PHP運行在安全模式下了。
三、如何做?
在PHP中調用外部命令,可以用如下三種方法來實現:
1) 用PHP提供的專門函數
PHP提供共了3個專門的執行外部命令的函數:system(),exec(),模告passthru()。
system()
原型:string system (string command [, int return_var])
system()函數很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個參數是可選的,用來得到命令執行後的狀態碼。
例子:
復制代碼 代碼如下:system("/usr/local/bin/webalizer/webalizer");
exec()
原型:string exec (string command [, string array [, int return_var]])
exec() 函數與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最後一行。雖然它只返回命令結果的最後一行,但用第二個參數array可以得到完整的結果,方法是把結果逐行追加到array的結尾處。所以如果array不是空的,在調用之前最好用unset()最它清掉。只有指定了第二個參數時,才可以用第三個參數,用來取得命令執行的狀態碼。
例子:
復制代碼 代碼如下:exec("/bin/ls -l");
exec("/bin/ls -l", $res);
#$res是一個數據,每個元素代表結果的一行
exec("/bin/ls -l", $res, $rc);
#$rc的值是命令/bin/ls -l的狀態碼。成功的情況下通常是0
passthru()
原型:void passthru (string command [, int return_var])
passthru() 只調用命令,不返回任何結果,但把命令的運行結果原樣地直接輸出到標准輸出設備上。所以passthru()函數經常用來調用象pbmplus(Unix 下的一個處理圖片的工具,輸出二進制的原始圖片的流)這樣的程序。同樣它也可以得到命令執行的狀態碼。
例子:
復制代碼 代碼如下:header("Content-type: image/gif");
passthru("./ppmtogif hunte.ppm");
希望本文所述對大家的PHP程序設計有所幫助。
;2. php中怎麼類外訪問私有方法
你問的是私有方法還是私有屬性?
你說的__get __set 是訪問和設置屬性用的。
__call才是訪問方法用的。
但這兩種都需要修改原始類,既然有這個許可權了,那私有方法有什麼必要定義呢?
另外一種獲取私有屬性或調用私有方法的思路是通過反射:
//MyClass這個類中包含了一個名為myFun的私有方法
classMyClass{
private$tmp='hello';
privatefunctionmyFun()
{
echo$this->tmp.''.'world!';
}
}
//通過類名MyClass進行反射
$ref_class=newReflectionClass('MyClass');
//通過反射類進行實例化
$instance=$ref_class->newInstance();
//通過方法名myFun獲取指定方法
$method=$ref_class->getMethod('myFun');
//設置可訪問性
$method->setAccessible(true);
//執行方法
$method->invoke($instance);
//獲取屬性
$property=$ref_class->getProperty('tmp');
//列印屬性
var_mp($property);
不知道你提這個單純是個問題,還是有別的需求,可以多看看php手冊學習一下。
php 訪問控制
php 反射
3. php 同文件中function內調用另外一個function
直接調用就可以呀,例子:
<?php
functionf1($s){
echo$s.$s."<br> ";歲唯散
}
functionf2(){
f1('山鋒hello');
f1('world');乎氏
}
//主程序
f2();
4. 急求php文件的內容調用和mysql內容調用方法
php調用mysql步驟:1、連接MySQL資料庫;2、選擇MySQL資料庫;3、執行SQL語句;4、關閉結果集;5、關閉MySQL伺服器。
本文操作環境:windows7系統、PHP7.1版,DELL G3電腦
PHP訪問MYSQL資料庫的五個步驟詳解(圖)
資料庫在我們PHP日常開發中是必須需要的,那麼MYSQL資料庫 是一款很多程序員都喜愛的資料庫,由於呢 MYSQL 是一個開源的,帶一點半商業的,市場的佔有率比較高,所以一直以來都被認為是 PHP 的最佳搭檔,同時 PHP 也具有很強大的資料庫支持能力,本篇主要講解 PHP訪問MySQL資料庫的基本步驟。
PHP訪問MySQL資料庫的基本步驟如圖所示:
.連接MySQL資料庫
使用 mysql_connect()函數建立與MySQL伺服器的連接。有關 mysql_connect()函數的使用,我們後面會有詳細的介紹。
2.選擇MySQL資料庫
使用 mysql_select_db()函數選擇MySQL資料庫伺服器的資料庫。並與資料庫建立連接,有關mysql_select_db()函數的使用,後面我們會有具體詳解。
3.執行 SQL 語句
在選擇資料庫中使用 mysql_query()函數執行 SQL語句,對數據的操作方式主要包括 5種方式,下面我們分別進行介紹。查詢數據:使用select 語句實現數據的查詢功能。
顯示數據:使用select 語句顯示數據的查詢結果。
插入數據:使用insert into 語句向資料庫中插入數據。
更新數據:使用update 語句更新資料庫中的記錄。
刪除數據:使用 delete語句刪除資料庫中的記錄!
mysql_query()函數的具體使用後面有具體介紹~
4.關閉結果集
資料庫操作完成後,需要關閉結果集,以釋放系統資源,語法格式如下:mysql_free_result($result);
技巧:
如果在多個網頁中都要頻繁進行資料庫訪問,那麼可以建立與資料庫伺服器的持續連接來提高效率,因為每次與資料庫伺服器的連接需要較長的時間和交大的資源開銷,持續的連接相對來說會更有效率,建立持續連接的方法就是在資料庫間接時,調用函數 mysql_pconnect()代替mysql_connect函數。建立的持續連接在本程序結束時,不需要調用 mysql_colse()來關閉與資料庫伺服器的連接。下次程序在此執行 mysql_pconnect()函數時,系統自動直接返回已經建立的持續連接ID號,而不再去真的連接資料庫。
5.關閉MySQL伺服器
沒使用一次 mysql_connect()或者mysql_query()函數,都會消耗系統資源,再少量用戶放完 web 網站時問題還不大,但如果用戶連接超過一定數量時,就會造成系統性能下降,甚至是死機,為了避免這種現象的發生,在完成資料庫的操作後,應該使用 mysql_close()函數關閉與MYSQL伺服器的連接,以節省系統資源。
語法格式如下:mysql_close($link);
說明:
PHP 中與資料庫的連接是非持久連接,系統會自動回收,一般不用設置關閉,但是如果一次性范湖的結果集比較大,或者網站訪問量比價多,那麼最好使用 mysql_close()函數手動進行釋放。
PHP訪問MySQL資料庫的步驟就結束了,是不是很簡單。
推薦學習:《PHP視頻教程》
以上就是php調用mysql步驟的詳細內容,更多請關注php中文網其它相關文章!
5. PHP怎麼調用其他類的方法
在java的調用方法是import,而在PHP中沒有import這個函數,一般PHP中調用其他類是用到require(),具體PHP調用其他類的方法如下:
1、首先應該先有一個文件名為tool.php的文件,在文件中聲明一個類。
(5)php反射調用方法擴展閱讀:
類是變數與作用於這些變數的函數的集合。使用下面的語法定義一個類:
<?php
class Cart { var $items; // 購物車中的物品
// 將 $num 個 $artnr 物品加入購物車
function add_item($artnr, $num) {
$this->items[$artnr] += $num;
} // 將 $num 個 $artnr 物品從購物車中取出
function remove_item($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num; return true;
} elseif
($this->items[$artnr] == $num) {
unset($this->items[$artnr]); return true;
} else {
return false; }
}
} ?>
上面的例子定義了一個 Cart 類,這個類由購物車中的商品構成的數組和兩個用於從購物車中添加和刪除商品的函數組成。
6. 反射調用private方法實踐(php、java)
單測中有個普遍性的問題,被側類中的private方法無法直接調用。小拽在處理過程中通過反射改變方法許可權,進行單測,分享一下,直接上代碼。
簡單被測試類
生成一個簡單的被測試類,只有個private方法。
復制代碼
代碼如下:
<?php/**
*
崔小渙單測的基本模板。
*
*
@author
cuihuan
*
@date
2015/11/12
22:15:31
*
@version
$Revision:1.0$
**/class
MyClass
{/**
*
私有方法
*
*
@param
$params
*
@return
bool
*/private
function
privateFunc($params){if(!isset($params)){return
false;}echo
"test
success";return
$params;}}
單測代碼
復制代碼
代碼如下:
<?php/***************************************************************************
*
*
$Id:
MyClassTest
T,v
1.0
PsCaseTest
cuihuan
Exp$
*
**************************************************************************//**
*
崔小渙單測的基本模板。
*
*
@author
cuihuan
*
@date
2015/11/12
22:09:31
*
@version
$Revision:1.0$
**/require_once
('./MyClass.php');class
MyClassTest
extends
PHPUnit_Framework_TestCase
{const
CLASS_NAME
=
'MyClass';const
FAIL
=
'fail';protected
$objMyClass;/**
*
@brief
setup:
Sets
up
the
fixture,
for
example,
opens
a
network
connection.
*
*
可以看做phpunit的構造函數
*/public
function
setup()
{date_default_timezone_set('PRC');$this->objMyClass
=
new
MyClass();}/**
*
利用反射,對類中的private
和
protect
方法進行單元測試
*
*
@param
$strMethodName
string
:反射函數名
*
@return
ReflectionMethod
obj
:回調對象
*/protected
static
function
getPrivateMethod($strMethodName)
{$objReflectClass
=
new
ReflectionClass(self::CLASS_NAME);$method
=
$objReflectClass->getMethod($strMethodName);$method->setAccessible(true);return
$method;}/**
*
@brief
:測試private函數的調用
*/public
function
testPrivateFunc(){$testCase
=
'just
a
test
string';//
反射該類$testFunc
=
self::getPrivateMethod('privateFunc');$res
=
$testFunc->invokeArgs($this->objMyClass,
array($testCase));$this->assertEquals($testCase,
$res);$this->expectOutputRegex('/success/i');//
捕獲沒有參數異常測試try
{
$testFunc->invokeArgs($this->transfer2Pscase,
array());}
catch
(Exception
$expected)
{$this->assertNotNull($expected);return
true;}$this->fail(self::FAIL);}}
運行結果
cuihuan:test
cuixiaohuan$
phpunit
MyClassTest.php
PHPUnit
4.8.6
by
Sebastian
Bergmann
and
contributors.Time:
103
ms,
Memory:
11.75MbOK
(1
test,
3
assertions)
關鍵代碼分析
封裝了一個,被測類方法的反射調用;同時,返回方法之前處理方法的接入許可權為true,便可以訪問private的函數方法。
復制代碼
代碼如下:
/**
*
利用反射,對類中的private
和
protect
方法進行單元測試
*
*
@param
$strMethodName
string
:反射函數名
*
@return
ReflectionMethod
obj
:回調對象
*/protected
static
function
getPrivateMethod($strMethodName)
{$objReflectClass
=
new
ReflectionClass(self::CLASS_NAME);$method
=
$objReflectClass->getMethod($strMethodName);$method->setAccessible(true);return
$method;}
下面給大家分享java中利用反射調用另一類的private方法
我們知道,Java應用程序不能訪問持久化類的private方法,但Hibernate沒有這個限制,它能夠訪問各種級別的方法,如private,
default,
protected,
public.
Hibernate是如何實現該功能的呢?答案是利用JAVA的反射機制,如下:
<span
style="font-size:14px;">import
java.lang.reflect.InvocationTargetException;
import
java.lang.reflect.Method;
public
class
ReflectDemo
{
public
static
void
main(String[]
args)
throws
Exception
{
Method
method
=
PackageClazz.class.getDeclaredMethod("privilegedMethod",
new
Class[]{String.class,String.class});
method.setAccessible(true);
method.invoke(new
PackageClazz(),
"452345234","q31234132");
}
}
class
PackageClazz
{
private
void
privilegedMethod(String
invokerName,String
adb)
{
System.out.println("---"+invokerName+"----"+adb);
}
}</span>
輸出結果為:---452345234----q31234132
7. php如何調用函數
PHP函數調用與Java/C/C++是一樣的額,通過函數名(參數列表)就可以了,
舉個栗子:
圖中,有兩處函數調用,一開始的session_start()是調用的PHP函數,validate_user($username, $password)是用戶自定義函數,同樣的方式調用。