我创建了一些使用PHP(类似于库)正确记录了大量方法的类。
现在,其他开发人员将要做的只是要求我在代码中创建的PHP库并使用其中的预定义函数。
是否可以从其他PHP开发人员(需要文件)中隐藏PHP代码(我所创建的库)并只显示函数名称,参数及其文档而不显示其中的代码?我不是在谈论混淆,这可能是可逆的,我在谈论阻止用户实际看到任何代码。
例如。
/**
*
* CREATE A NEW THREAD
* @param unknown_type $uid User ID of person who is creating the thread
* @param unknown_type $participant An array having collection of UID of people who are participating in this conversation
* @param unknown_type $msgtype Message Type Flags (1-normal, 2-chat, 3-sent as email, 4-profile post, 5-group post, 6-customer support)
* @param unknown_type $subject Subject of the thread
* @param unknown_type $tname Thread Name
* @param unknown_type $tpic Thread Cover Picture (Defaults to "")
* @param unknown_type $tflag Thread Flag (1-allowed,2-under review,3-blocked) (Defaults to 1)
* @return string|Ambigous <string, unknown> Thread ID on success, "" on failure
*/
public function createthread($uid,$participant,$msgtype,$subject,$tname,$tpic="",$tflag="1")
{
$randobj=new uifriend();
$tid=$randobj->randomstring(30,DB_MESSAGE,MSG_OUTLINE,msgoutline_tid);
$socialobj=new socialoperations();
$listid=$socialobj->createlist("threadlist_".$tid, "2",$msgtype,"1",$uid);
if($socialobj->addtolist($participant, $listid, $uid)!="SUCCESS")
{
return "";
}
if($listid=="")
{
$lasterror="An error occured in creating thread! Unable to Create Lists!";return "";
}
$dbobj=new dboperations();
$res=$dbobj->dbinsert("INSERT INTO ".MSG_OUTLINE." (".msgoutline_tid.",".msgoutline_subject.",".msgoutline_fid.",".msgoutline_participantid.",".msgoutline_msgtype.",".msgoutline_threadpic.",".msgoutline_threadflag.") VALUES
('$tid','$subject','$uid',$listid,'$msgtype','$tpic','$tflag')",DB_MESSAGE);
if($res=="SUCCESS")
{
return $tid;
}
else
{
$lasterror="Unable to create Thread!";return "";
}
}
其他开发人员必须只能看到我在函数上面用函数名和参数编写的文档,但是代码不能以任何方式访问它们。
为什么我要这样:我的PHP文件中有很多安全代码,我不想向其他开发人员展示,但仍允许他们调用函数并阅读返回值。
答案 0 :(得分:4)
如果您想让他们直接调用您的函数 ,则无法将代码隐藏起来。您可以做的是创建 Web服务并将其文档提供给其他开发人员。
答案 1 :(得分:3)
因为我有meta post so this was reopened和another meta post for formatting this question,我会尽力回答这个问题。请注意,这只是这样做的一种方式,其中的限制在帖子末尾说明。
您可以在其他域中创建web API并从主域访问它。我认为解释它是如何工作的最好方法是用一个实际的例子。想象一下,你的库包含函数'joinstrings()',它带有2个参数。然后你将它放在你的分离网中:
http://apiweb.com/functions.php
<?php
// Your API. I hope the real one is more complex than this (;
function joinstrings($s1, $s2)
{
return $s1 . $s2;
}
// More functions
这是公共(但需要密钥)的可访问页面。
http://apiweb.com/joinstrings/index.php
<?php
// Check if the key is valid and if $v1 and $v2 aren't empty. Else, 'exit;'
include '../validate.php';
// Your API
include '../functions.php';
// The called function
echo joinstrings(urldecode($_GET['v1']), urldecode($_GET['v2']));
现在您可以要求所有程序员学习如何使用此API。或者,如果你喜欢这样做,你就会制作一个让生活更轻松的包装纸。您将拥有一个包含您希望可访问的所有方法的类。您可以使用函数执行此包装,但我认为使用对象和方法更容易,更好:
htpp://web.com/library.php
<?php
class DevelopersLibrary
{
private $Url = "http://apiweb.com/";
// Press your hand against the keyboard. A-Z0-9. Copy it in http://apiweb.com/validate.php
private $Key = "g139h0854g76dqfdbgng";
// Accesible method
public joinstrings($v1, $v2)
{
// Encode only the user input. You don't want to encode '?' nor '&'
if ($Return = file_get_contents($this->Url . 'joinstring'
'?key=' . $this->Key .
'&v1=' . urlencode($v1) .
'&v2=' . urlencode($v2)))
{
return $Return;
}
}
}
最后,您的开发人员会做什么:
http://web.com/index.php
<?php
include './library.php';
$Lib = new DevelopersLibrary();
echo $Lib->joinstrings("Are you sure this is better", "than giving your developers access to the code?");
没有任何代码经过测试,所以你应该期待一些拼写错误。
我可以考虑解决大多数限制,但不要扩展(更多)这篇文章我不会在这里写。如果您在评论中需要限制,请求解决限制,我会尽力而为。 在正常情况下使用时,这些限制都不是 THAT 重要。
传递参数。使用上述方法,您只能将数字或字符串作为函数参数传递。查看json_encoding()以了解其他类型。
错误的返回值当API中存在错误或传递参数时。如果API中存在错误,开发人员无法修复它,并且返回的值可能是错误的。现在这看起来似乎微不足道,但如果他们试图检索2个字符串的连接并检索另一个[错误]字符串并带有错误文本呢?注意:请考虑返回有效的 XML ,然后在包装器中解析它。
只有一个唯一键可用于防止随机用户使用您的API,而不会被开发人员隐藏。
速度较慢。我认为这甚至不需要解释。
开发人员的额外工作 。这是通过包装器的实现来解决的。
网址长度。大多数浏览器的字符长度限制为2000个字符,但我在the PHP manual中找不到file_get_contents()的任何内容。阅读this SO question for more info about GET。
当然还有更多,但这些是我能想到的主要原因。
我希望这个漫长的答案对你或某人有用。