RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-213977

Гончаров Александр's questions

Martin Hope
Гончаров Александр
Asked: 2020-12-19 09:19:05 +0000 UTC

带有 MVC 和 ActiveRecord 的非商店 Web 应用程序的 PHP 框架

  • 5

那些使网站/服务与商店和博客/名片网站完全不同的人很熟悉在选择骨架时陷入昏迷的故事。结果,每个新项目的骨架都是通过“从旧项目中删除所有不必要的东西,这是骨架!”的方法获得。我真的很想打破这个恶性循环,因为也许有优质的骷髅?现在具体来说:

所谓骨架,是指开箱即用的框架(例如 yii、zend)和 CMS(例如 wordpress、bitrix)之间的东西。也就是说,不仅仅是架构设备,它给出了框架。我们还需要“订阅中”的非常基本的模块。我们特别需要什么骨架,可能对于许多人来说:

  1. 基于任何框架MVC,具有模块化结构
  2. 与数据库打交道ActiveRecord,欢迎光临ORM
  3. 它具有板载系统模块 - 处理具有切换存储能力的文件 ( Storage),一组用于常见事物的组件(如技术支持票证、标签、搜索、错误记录等模块Utility)。
  4. 通过社交网络获得授权的用户模块,可能需要一些个人数据才能获得完整状态 ( User)。不需要,但最好使用 SMS/电子邮件/网站通知模块。
  5. 内容页面的简约工作 ( Article)。
  6. 可选,但可取 - 支付模块:用户余额、服务和订阅、获取 ( Billing)。

甚至不需要管理面板,尤其是不需要编译 css、构建反应(如在 magento 中)等系统内容。

问题是在线商店、博客和名片大多是为网络而标记的。一旦需要另一个服务,我们要么不得不将繁琐的代码拖到我们身后,要么从头开始编写(甚至不知道哪个更快更好)。可以削减现有 CMS 之一的模块 - 但首先:我不记得积极使用的免费 CMS ActiveRecord(这是一个重要要求),其次,它们都非常混乱:也就是说,升级是针对来自 CMS/模块作者和自定义模块的更新,而不是在代码的“添加”下进行的。即使您不顾一切地选择添加 CMS,这也是拒绝更新 - 而这反过来又使系统在安全性方面的寿命很短。

但也许我们落后了,已经有很多这样优质的骷髅了?还是没有其他选择?请告诉我哪些产品值得关注。

PS这个问题并不完全属于SO的主题,因为它在答案中提出了关于骨架的意见,但是,对于作者来说,它非常热门且相关。

php
  • 3 个回答
  • 10 Views
Martin Hope
Гончаров Александр
Asked: 2020-10-27 19:59:18 +0000 UTC

__get 和 __set 魔术属性和 [] = 运算符,存储数组

  • 5

PHP 5.6+。有一个类。

class PropertyContainer {
    protected $_data;

    public $somePublicArray = [0];

    public function __construct($data = [])
    {
        $this->_data = $data;
    }

    public function __get($name)
    {
        return array_key_exists($name, $this->_data) ? $this->_data[$name] : null;
    }

    public function __set($name, $value)
    {
        $this->_data[$name] = $value;
    }

    public function __unset($name)
    {
        unset($this->_data[$name]);
    }

    public function __isset($name)
    {
        return array_key_exists($name, $this->_data);
    }
}

$_data如果属性未在类中声明,则通过魔术方法和内部数组使用类属性- 这是一种相当标准的方法。如果不是[] =PHP 中操作符的奇怪方法,一切都会很棒:我们进行了测试

$cont = new PropertyContainer(['a' => 1, 'b' => [0], 'c' => new ArrayObject ([0])]);

$cont->a++; /*$cont->a = 2 OK*/
$cont->b[] = 1; /*$cont->b = [0] FAIL*/
$cont->somePublicArray[] = 1; /*$cont->somePublicArray = [0,1] OK*/
$cont->c[] = 1; /*$cont->c = ArrayObject [0,1] OK*/

var_dump($cont, is_array($cont->c));
die();

也就是说,里面包含的数组$_data不是按引用返回的。

问题是 - 有什么方法可以解决这个问题,并使用运算符[] =填充内部数组,而不是大量使用ArrayObjectinstead of array?面临同样的问题,但这些解决方案不适用于将任意类型的数据存储在内部数组中(如$_data)——我想按原样将数据存储在数组(或 ArrayObject)中。

在使用ArrayObject中,我不喜欢 is_array() 方法不起作用,也许您可​​以覆盖该行为is_array ?

如果&__get改为使用__get- 是否可以返回指向数组元素的指针$_data?否则,它只是一个警告Only variable references should be returned by reference。

php
  • 1 个回答
  • 10 Views
Martin Hope
Гончаров Александр
Asked: 2020-10-04 08:33:54 +0000 UTC

如何在代码中正确标记拐杖?

  • 11

通常,在任何开发中,有必要编写预先知道它的代码:

  1. 极其不灵活。或者..
  2. 将来可能会导致错误和问题。或者..
  3. 我们根本不读书。

或者这样的代码是继承而来的,你想把以后需要理顺的地方标出来。这样的代码在俄语中称为拐杖。不幸的是,很难在英语网站上找到有关此的信息,因为它们原则上没有术语“拐杖”。建议翻译为“kludge”——但这并不经常被理解。

问题是如何用注释标记代码中的拐杖,这样就可以很容易地列出项目中的所有拐杖,并且非常希望它们在 IDE 中可见,甚至可以确定优先级?我对 PhpStorm 更感兴趣,但其他人可能有兴趣了解他们的 IDE。

PS
评论里当然有专门的标注TODO,但是我想把拐杖TODO分开来介绍一下,毕竟本质上还是有很大区别的。因此,一些人同意特殊评论,例如:

/* TRASHCODE {why below code is bad} */
...
/* TRASHCODE end*/

然后就很容易搜索到代码了,但是在这种情况下,IDE 在审查拐杖方面没有任何帮助。

ide
  • 3 个回答
  • 10 Views
Martin Hope
Гончаров Александр
Asked: 2020-09-03 07:12:54 +0000 UTC

类型 - 具有方法参数的“多重类型”(联合类型)的语言?

  • 7

为简单起见,我将使用 PHP 作为示例语言。让我马上解释这一点。在现代语言中,尤其是解释语言中,传统上存在非严格类型:

function join($a){
   return is_array($a) ? implode('', $a) : $a;
}

并且有严格的打字:

function join(array $a) : string{
  return implode('', $a);
}

例如,还有 C++ 中的模板类型:

template <class T, class R>
R* join(T * array, int count)
{
    R *output = new R(count);
    for (int i = 0; i < count; i++)
      output += array[i] ;
    return output;
}

C++中也有类型重载,但不是很灵活,也很繁琐,像模板类型一样,后者也没有可读性。

但是缺少多重类型(正如我发现的那样-这称为联合类型)-我想要以下内容:

function join(array|Iterator|ICollectable $input) : string|null{
    /*какой-то код обработки*/
}

问题是——是否有任何语言支持类似的类型限制语法,如果有,是哪些?如果不是,这个概念不好的原因是什么?

为什么会出现对此缺乏内置支持的问题 - 具有变体类型的语言的程序员通常在方法注释中写这样的东西:

/**
   * Some function describe
   * 
   * @param array|ISomeList $list ...
   * @return false|string ...
   */

但在 f-ii 声明中,他们被迫不对类型进行显式引用(依赖于注释),从而留下变体类型:

public function someFunction($list) {... return $some;};

这种情况经常发生在不能为了强类型而忽视代码可读性的严肃框架中。

因此,在没有明确指定所需类型的情况下检查代码时:可读性会降低。注释并不能 100% 保证类型限制:程序员和 IDE 一样,无法确切知道输入参数中可以输入什么。当程序运行时——如果输入参数突然出现错误:没有错误/警告发生,这使捕获错误变得复杂,降低了稳定性。

相反,当只使用严格类型时,整个系统变得更加复杂,无可替代:类的数量呈几何级数增长。更糟糕的是,因为类型的非严格性适用于简单的架构决策和可读代码,并且在脚本语言的情况下,它不能被忽视。

UPD:
是的,当然,这样的功能并不完全符合 OOP 的原则。但这将是修改这些原则的理由——因为。他们非常温和地没有考虑到“班级数量的几何增长”。此外,联合类型与鸭子类型结合使用——我不会称之为减号,但这是一个值得争论的大领域。

UPD2:
如果出现多类型有效性的问题:PHP 的一个更生动的例子是声明一个重要的、经常使用的函数,用于从数据库表中选择对象(db-table-mapper)Zend 框架(1.9)类 Zend_Db_Table_Abstract .

/**
 * Fetches all rows.
 *
 * Honors the Zend_Db_Adapter fetch mode.
 *
 * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
 * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
 * @param int                               $count  OPTIONAL An SQL LIMIT count.
 * @param int                               $offset OPTIONAL An SQL LIMIT offset.
 * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
 */
public function fetchAll($where = null, $order = null, $count = null, $offset = null)
{
    if (!($where instanceof Zend_Db_Table_Select)) {
        $select = $this->select();

        if ($where !== null) {
            $this->_where($select, $where);
        }

        if ($order !== null) {
            $this->_order($select, $order);
        }

        if ($count !== null || $offset !== null) {
            $select->limit($count, $offset);
        }

    } else {
        $select = $where;
    }

    $rows = $this->_fetch($select);

    $data  = array(
        'table'    => $this,
        'data'     => $rows,
        'readOnly' => $select->isReadOnly(),
        'rowClass' => $this->getRowClass(),
        'stored'   => true
    );

    $rowsetClass = $this->getRowsetClass();
    if (!class_exists($rowsetClass)) {
        Zend_Loader::loadClass($rowsetClass);
    }
    return new $rowsetClass($data);
}

根据设计,第一个参数可以是几种类型之一。这是必要的,以便该方法的潜在用户(程序员)很容易将映射器融入他们的头脑。毕竟,他可以通过不同的方式从代码中调用此方法,但方法保持不变:

$table->fetchAll('user_id in (1,2,5)');
$table->fetchAll(['user_id < 100', 'gender = "male"']);
$table->fetchAll( $table->select()->where('user_id IN (?)', $userIdsArray) );

一种方法很容易记住,很适合头脑。虽然 fetchAll 方法的程序员不想将一个任务的逻辑(从数据库中选择对象)分散到他自己内部的多个重载方法中,但他希望所有内容都在一个地方,以便打开的代码立即了解什么是有效的,并且在什么顺序。至少这对应于SRP - 该方法有一个职责:从数据库中选择对象。

即提供一整套语言来与数据库表进行通信。它更像是对程序员的一种服务,而不仅仅是一种方法。框架中的此类方法:每秒一次,因为框架首先应该方便程序员。一个程序员不应该钻研“几千个类”——为了使用特性——这是解决代码可读性问题的一个生动例子,其中联合类型会派上用场。

UPD3 :
事实证明,正如评论中所建议的那样,PHP 开发人员也曾考虑在 2015 年引入这个概念,但他们在投票中否决了。

php
  • 3 个回答
  • 10 Views
Martin Hope
Гончаров Александр
Asked: 2020-08-10 08:05:21 +0000 UTC

俄罗斯HTML5地图,有免费的吗?[关闭]

  • 6
关闭 这个问题是题外话。目前不接受回复。

根据帮助中描述的规则,这个问题很可能不对应俄语中 Stack Overflow 的主题。

5 年前关闭。

改进问题

对嵌入网页中的俄罗斯地图感兴趣,具有可点击区域,区域中有可调整的悬停,而不是 flash。最好是未混淆的 JS 代码。

这样的付费地图 http://fla-shop.com.ru/products/html5/ru-locator-map/很受欢迎。有这样一个免费的http://evrohimservis.ru/map/ - 显然是第一张地图的盗版。

有没有类似的免费非盗版JS插件?

javascript
  • 2 个回答
  • 10 Views
Martin Hope
Гончаров Александр
Asked: 2020-07-29 03:54:48 +0000 UTC

按浏览器版本筛选的JS插件

  • 4

例如,有一项任务是清除用户输入的浏览器,以便发出警告,如果用户从旧浏览器输入,一切都会消失。例如,我们有以下过滤列表:http ://caniuse.com/#feat=flexbox 。

是否有支持纯 JS 或 jQuery 的插件来弹出这样的弹出窗口?

在此处输入图像描述

屏幕截图显示了插件http://jreject.turnwheel.com,但不幸的是,它最后一次更新是在 2014 年——不支持移动浏览器。

javascript
  • 3 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5