0

我对 joomla 核心和 PHP 知之甚少。为了更好地处理我的网站,我正在尝试阅读 joomla 核心的一小部分,当我遇到这个函数JTable:getInstance时,(libararies\joomla\table\table.php line268),它返回

    return new $tableClass($db);

要了解getInstance返回的内容,我需要知道它是如何定义的,所以我在我网站的所有 php 文件中搜索了它,虽然有很多参考资料,甚至本页指出$tableClass的一些所谓的“定义” ,但没有一个是我正在寻找的。我期待类似的东西

class tableClass{...}

此外,从其他 php 文件中,有以下几行:

$row = JTable::getInstance('K2Item', 'Table');
$row->hit($id);

所以在我看来,返回的getInstance应该是一个有成员的对象hit(),所以我期待类似的东西

class tableClass{...
    function hit(){
    .....
    }
}

但是这种代码无处可寻,所以我被困在这里,肯定需要帮助。

我的一些想法:$tableClass 真的是一个类吗?我注意到它有一个$,所有其他类都没有?如果它不是一个类,那么为什么可以这样调用它new $tableClass?我真的需要了解这些基础知识,但是用谷歌搜索关键字有点困难$

4

1 回答 1

0

完整的方法贴在下面。调用 JTable::getInstance 时,您必须将 $type 作为参数传递。然后 getInstance 方法使用 $type 来定义 $tableClass,如下所示。

// Sanitize and prepare the table class name.
$type       = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
$tableClass = $prefix . ucfirst($type);

然后该方法继续加载(导入)该类(如果尚未加载),然后最后调用 return new $tableClass($db);

所以 $tableClass 只是一个基于 $type 参数的动态变量。

在上面的示例中:

$row = JTable::getInstance('K2Item', 'Table');

$type 和 $prefix 参数被翻译成以下内容:

返回新的 TableK2Item($db);

因此,如果您搜索 TableK2Item,您确实应该找到具有 hit() 方法的类。

所以 $tableClass 实际上是在 getInstance 方法中定义的。

这有意义吗?

/**
 * Static method to get an instance of a JTable class if it can be found in
 * the table include paths.  To add include paths for searching for JTable
 * classes see JTable::addIncludePath().
 *
 * @param   string  $type    The type (name) of the JTable class to get an instance of.
 * @param   string  $prefix  An optional prefix for the table class name.
 * @param   array   $config  An optional array of configuration values for the JTable object.
 *
 * @return  mixed    A JTable object if found or boolean false if one could not be found.
 *
 * @link    https://docs.joomla.org/JTable/getInstance
 * @since   11.1
 */
public static function getInstance($type, $prefix = 'JTable', $config = array())
{
    // Sanitize and prepare the table class name.
    $type       = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
    $tableClass = $prefix . ucfirst($type);

    // Only try to load the class if it doesn't already exist.
    if (!class_exists($tableClass))
    {
        // Search for the class file in the JTable include paths.
        jimport('joomla.filesystem.path');

        $paths = self::addIncludePath();
        $pathIndex = 0;

        while (!class_exists($tableClass) && $pathIndex < count($paths))
        {
            if ($tryThis = JPath::find($paths[$pathIndex++], strtolower($type) . '.php'))
            {
                // Import the class file.
                include_once $tryThis;
            }
        }

        if (!class_exists($tableClass))
        {
            // If we were unable to find the class file in the JTable include paths, raise a warning and return false.
            JLog::add(JText::sprintf('JLIB_DATABASE_ERROR_NOT_SUPPORTED_FILE_NOT_FOUND', $type), JLog::WARNING, 'jerror');

            return false;
        }
    }

    // If a database object was passed in the configuration array use it, otherwise get the global one from JFactory.
    $db = isset($config['dbo']) ? $config['dbo'] : JFactory::getDbo();

    // Instantiate a new table class and return it.
    return new $tableClass($db);
}
于 2015-08-20T10:55:28.537 回答