拒绝继承或使用PHP类

时间:2013-01-04 08:31:38

标签: php .htaccess xampp

对于我的项目,我创建了一个名为DBAccess的文件夹,其中包含所有与PHP类,常量函数等数据库相关的PHP文件。在文件夹的外部,我创建了一个名为DBAccess.php的php文件。 以下是我的目录结构简而言之

Project1
  |_DBAccess
  |       |_functions.php
  |       |_class.php
  |       |_constants.php         
  |_DBAccess.php
  |_index.php
  |_aboutus.php  
    .......

现在我希望限制根目录中的任何页面使用除DBAccess.php文件之外的DBAccess文件夹的内容。它是否可以在PHP中使用.htaccess或其他东西?

4 个答案:

答案 0 :(得分:3)

你可以这样做:

DebugAccess / foo.php

<?php
$trace = debug_backtrace();

if (isset($trace[0])) {
  $dir =  basename(dirname($trace[0]['file']));
  $file = basename($trace[0]['file']);
  if ($file != 'DBAccess.php' && $dir != 'DBAccess') {
    throw new Exception("Nice try butthead");
  }
}

echo "Access Granted\n";

DBAccess.php

<?php
include_once("DBAccess/foo.php");

NoDBAccess.php

<?php
include_once("DBAccess/foo.php");

> php DBAccess.php 
Access Granted

> php NoDBAccess.php 

Fatal error: Uncaught exception 'Exception' with message 'Nice try butthead' in /Users/seanberry/so/DBAccess/foo.php:7
Stack trace:
#0 /Users/seanberry/so/NoDBAccess.php(3): include_once()
#1 {main}

答案 1 :(得分:1)

您可以创建一个处理此问题的函数,您所要做的就是在_DBAccess.php或您需要访问这些文件的任何其他文件中调用该函数。

尝试此功能:

function include_all_php($folder){
    foreach (glob("{$folder}/*.php") as $filename)
    {
        require $filename;
    }
}

然后你只需要用foldername调用该函数。

include_all_php("_DBAccess")

如果您希望文件不包含这些文件,则不要求它们:)

答案 2 :(得分:0)

是的,你可以:

a)通过在DBAccess.php中定义全局变量,例如

define('DB_LIB',true)

并在文件夹中的所有其他文件中使用DB_LIB常量

(bit cheep trick但这可以确保不会直接访问这些文件)

b)通过定义class as final

来停止继承

间接回答问题

c)停止重新发明轮子(如果您正在创建一个访问层,如您的示例所示)   并使用现有的PDO

d)使用一些合适的OO设计模式e.g并检查this also。   你的反应是什么原因?因为使用模式会修复许多继承和依赖性问题,例如在访问层的情况下,子对象将不会被实例化,除非它不是用依赖对象创建的,例如工厂案例

f)使public , private and protected keywords

的用户

答案 3 :(得分:0)

  • .htaccess与PHP无关,它是Apache Web服务器的设置文件。 Apache无法阻止PHP代码读取磁盘上的文件。

  • 您可以通过例如要求定义某个常量来阻止意外访问:

    // DBAccess.php
    define('CAN_ACCESS_DB', true);
    
    // functions.php
    if( !defined('CAN_ACCESS_DB') ){
        die('You are not allowed to access this file');
    }
    

    ......但是没有办法阻止故意访问。

你最好的机会可能是重新考虑你的设计。