在PHP 4.2.0 至 4.2.3中,可以使用w32api_register_function 函数调用外部的DLL,前提是需要在php.ini中打开扩展的php_w32api.dll。
如果使用的是PHP 5,调用DLL只有使用PHP的COM类了。
基本方法为:$obj = new COM("server.object")
下面介绍如何用PHP调用COM组件,采用的是msvs.net2005环境下的C#建立COM组件。
1. 用C#创建COM对象
COM对象是ClassLibrary类,它生成DLL文件。要在VS开发环境中创建一个简单的COM对象,我们可以依次选择“文件”->“新建”->“项目”->“Visual C#”->“类库”,然后创建一个名字为Comtest的工程。
需要注意的是:在COM中调用VC#对象需要下面的条件:
·类必须是public性质。
·特性、方法和事件必须是public性质的。
·特性和方法必须在类接口中定义。
·事件必须在事件接口中定义。
不是在这些接口中定义的public性质的类成员不能被COM访问,但它们可以被其他的.NET Framework对象访问。要让COM能够访问特性和方法,我们必须在类接口中定义它们,使它们具有DispId属性,并在类中实现这些特性和方法。这些成员定义时的顺序也就是它们在COM中顺序。要让COM访问类中的事件,必须在事件接口中定义这些事件,并赋予它们DispId属性。
在接口名字之前,每个接口需要一个GUID特性。要生成唯一的Guid,需要运行guidgen.exe工具软件,并选择“registry format”。在Program Files\Microsoft Visual Studio 2005\Common7\Tools\guidgen.exe可获得。
需要注意的是,在类的前面,需要设置下面的特性:
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(*** _Events))
ClassInterfaceType.None表示没有为该类生成类接口,如果没有明确地实现接口,类只能通过IDispatch提供后期绑定访问。用户希望通过明确地由类实现的接口使外部对象能够访问类的功能,这也是推荐的ClassInterfaceAttribute的设置。
ComSourceInterfaces(typeof(*** _Events))确定许多作为COM事件向外部对象提供的接口。
下面是代码示例:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Data.OleDb;
using System.Data;
using System.Collections;
using System.Collections.Specialized;
namespace Comtest
{
//类接口
[Guid("394BE3FE-18B8-4c5e-B611-75B5C5493A4E")]
public interface ITest
{
string Test(string test);
[DispId(1)] //固定写法,索引号从1开始
string About();
[DispId(2)]
int Add(int a, int b);
}
//事件接口
[Guid("45875EE5-5C8D-4016-897A-FCC7DD5A6834"), //固定写法
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITest_Events
{
}
//类
[Guid("854C2016-E7BF-41ea-8F09-B873698E9F8E"), //固定写法
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ITest_Events))]
public class Class2 : ITest //该类继承上面的接口,并实现抽象方法
{
public string Test(string test)
{
return test;
}
public string About() { return "欢迎访问 http://www.35.com"; }
public int Add(int a, int b) { return a + b; }
}
}
在创建COM对象前,我们必须向COM Interop注册该对象。右击方案管理器中的工程名字,点击快捷菜单上的“属性”选项,然后再点击“生成”选项,将“为COM Interop注册”钩上。打开AssemblyInfo.cs将comVisible设为true。
为了对程序集进行唯一的标识,安全策略和版本策略,可以为类库组合建立一个强名字。注意:不是必须。创建强名字需要用到SN.EXE名字,在“开始—VS2005 —VS Tools—VS命令提示符”,输入:
sn -k Comtest_Key.snk
将Comtest_Key.snk 添加入项目中(在Program Files\MS Visual Studio 2005\VC下),然后打开AssemblyInfo.cs,并加入下面一行的内容:
[assembly: AssemblyKeyFile("Comtest_Key.snk")]
最后生成项目,即可在bin下获得COM组件。
2. PHP调用COM组件
直接在PHP中使用COM类进行访问,即可。
代码如下:
$b=new COM("Comtest.Class2");
$t1=126;
$t2=456;
$r=$b->add($t1,$t2);
$f=$b->about();
echo $r;
echo $f;
?>
除此之外,调用访问EXCEL、WORD和数据库,都可以使用COM类。
以下为调用WORD的简单例子:
// 启动 word
$word = new COM("word.application") or die("Unable to instanciate Word");
print "Loaded Word, version {$word->Version}\n";
//将其置前
$word->Visible = 1;
//打开一个空文档
$word->Documents->Add();
//随便做些事情
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");
//关闭 word
$word->Quit();
//释放对象
$word->Release();
$word = null;
?>
以下为访问MSSQL数据库系统的简单例子:
//访问MSSQL数据库系统
echo '访问MSSQL
' ;
$dbConn=new COM ("ADODB.Connection") or die("创建COM失败");
$ADO='Provider=sqloledb;Data Source=10.35.58.74;Initial Catalog=Tour;Min Pool Size=1;Persist Security Info=False;User;Password=fq15Ns@E#(';
//"Provider=sqloledb;DataSource=10.35.58.112;Initial Catalog=Tour;User Id=sa;Password=sa;"; fq15Ns@E#(
//Access如:$ADO="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb");
$dbConn->open($ADO);
//if($dbConn) echo"create conn OK";
$rs=new COM("ADODB.RecordSet") or die("创建RS失败");
echo"
";
//if($rs) echo"create rs OK";
$sql="Exec P_SelUser 9001111";//"SELECT * FROM user_userInfo";
$rs->open($sql,$dbConn,1,1);
while(!$rs->eof){
echo $rs->fields["Account"]->value.":";
echo $rs->fields["PhoneID"]->value;
echo"
";
$rs->movenext();
}
$rs->Close;
$rs=null;
$dbConn->Close;
$dbConn=null;
?>
这说明如果我们要使用PHP访问MSSQL,可以通过调用COM组件来实现。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

Dreamweaver Mac版
ビジュアル Web 開発ツール

ホットトピック



